From 9720a7befe9d7cd9dfcb61d3dabbf4c68c36a8d9 Mon Sep 17 00:00:00 2001 From: ARIA Date: Fri, 3 Jul 2026 11:53:35 +0200 Subject: [PATCH] Fix Equipment modal and json filter --- src/core/persistence.js | 24 +++++++++++++++++++++ src/systems/integration/sillytavern.js | 3 ++- src/systems/interaction/equipmentActions.js | 14 ++++++------ src/systems/rendering/equipment.js | 2 +- style.css | 2 +- 5 files changed, 35 insertions(+), 10 deletions(-) diff --git a/src/core/persistence.js b/src/core/persistence.js index 72d67ce..4168248 100644 --- a/src/core/persistence.js +++ b/src/core/persistence.js @@ -40,6 +40,30 @@ const DEFAULT_USER_STATS = { clothing: "None", stored: {}, assets: "None" + }, + equipment: { + items: [], + slots: { + helmet: null, + ring1: null, + ring2: null, + ring3: null, + ring4: null, + ring5: null, + ring6: null, + ring7: null, + ring8: null, + ring9: null, + ring10: null, + necklace: null, + bodyArmor: null, + pants: null, + shoes: null, + gloves: null, + accessory1: null, + accessory2: null, + accessory3: null + } } }; diff --git a/src/systems/integration/sillytavern.js b/src/systems/integration/sillytavern.js index c162242..3a742b4 100644 --- a/src/systems/integration/sillytavern.js +++ b/src/systems/integration/sillytavern.js @@ -525,7 +525,8 @@ export async function onMessageReceived(data) { // Remove the tracker code blocks from the visible message let cleanedMessage = responseText; - // Note: JSON code blocks are hidden from display by regex script (but preserved in message data) + // Remove JSON code blocks (v3 format) — primary defense, works regardless of regex script + cleanedMessage = cleanedMessage.replace(/```(?:json|markdown)?\s*[\s\S]*?```/gim, ''); // Remove old text format code blocks (legacy support) cleanedMessage = cleanedMessage.replace(/```[^`]*?Stats\s*\n\s*---[^`]*?```\s*/gi, ''); diff --git a/src/systems/interaction/equipmentActions.js b/src/systems/interaction/equipmentActions.js index 2d3b520..3c1a049 100644 --- a/src/systems/interaction/equipmentActions.js +++ b/src/systems/interaction/equipmentActions.js @@ -77,7 +77,7 @@ function generateItemId() { * Updates lastGeneratedData and committedTrackerData to include current equipment state */ function updateEquipmentData() { - const equipment = extensionSettings.userStats.equipment; + const equipment = extensionSettings.userStats?.equipment || { items: [], slots: {} }; const currentData = lastGeneratedData.userStats || committedTrackerData.userStats; if (currentData) { @@ -153,7 +153,7 @@ export function showCreateModal() { * @param {string} itemId - ID of the item to edit */ export function showEditModal(itemId) { - const equipment = extensionSettings.userStats.equipment; + const equipment = extensionSettings.userStats?.equipment || { items: [], slots: {} }; const item = equipment.items.find(i => i.id === itemId); if (!item) return; @@ -363,7 +363,7 @@ export function saveEquipmentItem() { stats[attr] = Math.max(1, Math.min(20, val)); }); - const equipment = extensionSettings.userStats.equipment; + const equipment = extensionSettings.userStats?.equipment || { items: [], slots: {} }; // Migrate old types (ring1-ring10 -> ring, accessory1-3 -> accessory) migrateItemTypes(equipment.items); @@ -423,7 +423,7 @@ export function saveEquipmentItem() { * @param {string} itemId - ID of the item to equip */ export function equipItem(itemId) { - const equipment = extensionSettings.userStats.equipment; + const equipment = extensionSettings.userStats?.equipment || { items: [], slots: {} }; const item = equipment.items.find(i => i.id === itemId); if (!item) return; @@ -454,7 +454,7 @@ export function equipItem(itemId) { * @param {string} slotId - The slot to unequip from */ export function unequipItem(slotId) { - const equipment = extensionSettings.userStats.equipment; + const equipment = extensionSettings.userStats?.equipment || { items: [], slots: {} }; const item = equipment.items.find(i => i.slot === slotId); if (item) { item.slot = null; @@ -473,7 +473,7 @@ export function unequipItem(slotId) { * @param {string} itemId - ID of the item to delete */ export function deleteItem(itemId) { - const equipment = extensionSettings.userStats.equipment; + const equipment = extensionSettings.userStats?.equipment || { items: [], slots: {} }; // Unequip if currently equipped const item = equipment.items.find(i => i.id === itemId); @@ -497,7 +497,7 @@ export function deleteItem(itemId) { * @returns {Object} Map of attribute ID to total bonus value */ export function getEquipmentBonuses() { - const equipment = extensionSettings.userStats.equipment; + const equipment = extensionSettings.userStats?.equipment || { items: [], slots: {} }; const bonuses = {}; const items = equipment.items || []; diff --git a/src/systems/rendering/equipment.js b/src/systems/rendering/equipment.js index 319f557..79643a2 100644 --- a/src/systems/rendering/equipment.js +++ b/src/systems/rendering/equipment.js @@ -64,7 +64,7 @@ function renderSlot(slotDef, item) { * @returns {string} Complete HTML for the equipment section */ function generateEquipmentHTML() { - const equipment = extensionSettings.userStats.equipment; + const equipment = extensionSettings.userStats?.equipment || { items: [], slots: {} }; const slots = equipment.slots || {}; const items = equipment.items || []; diff --git a/style.css b/style.css index 073ee28..6982ff6 100644 --- a/style.css +++ b/style.css @@ -12183,7 +12183,7 @@ body.documentstyle .rpg-inline-thoughts { } .rpg-equipment-modal-content { - background: var(--SmartThemeDialogBgColor); + background: var(--SmartThemeDialogBgColor, #1e1e2e); border-radius: 8px; width: 90%; max-width: 420px;