diff --git a/src/core/state.js b/src/core/state.js index d191ea6..5164554 100644 --- a/src/core/state.js +++ b/src/core/state.js @@ -53,6 +53,13 @@ export let extensionSettings = { assets: "None" } }, + statNames: { + health: 'Health', + satiety: 'Satiety', + energy: 'Energy', + hygiene: 'Hygiene', + arousal: 'Arousal' + }, quests: { main: "None", // Current main quest title optional: [] // Array of optional quest titles diff --git a/src/systems/interaction/inventoryActions.js b/src/systems/interaction/inventoryActions.js index 4742070..6c50ee3 100644 --- a/src/systems/interaction/inventoryActions.js +++ b/src/systems/interaction/inventoryActions.js @@ -6,6 +6,7 @@ import { extensionSettings, lastGeneratedData, committedTrackerData } from '../../core/state.js'; import { saveSettings, saveChatData, updateMessageSwipeData } from '../../core/persistence.js'; import { buildInventorySummary } from '../generation/promptBuilder.js'; +import { buildUserStatsText } from '../rendering/userStats.js'; import { renderInventory, getLocationId } from '../rendering/inventory.js'; import { parseItems, serializeItems } from '../../utils/itemParser.js'; import { sanitizeLocationName, sanitizeItemName } from '../../utils/security.js'; @@ -42,18 +43,8 @@ let openForms = { * This ensures manual edits are immediately visible to AI in next generation. */ function updateLastGeneratedDataInventory() { - const stats = extensionSettings.userStats; - const inventorySummary = buildInventorySummary(stats.inventory); - - // Rebuild the userStats text format - const statsText = - `Health: ${stats.health}%\n` + - `Satiety: ${stats.satiety}%\n` + - `Energy: ${stats.energy}%\n` + - `Hygiene: ${stats.hygiene}%\n` + - `Arousal: ${stats.arousal}%\n` + - `${stats.mood}: ${stats.conditions}\n` + - `${inventorySummary}`; + // Rebuild the userStats text format using custom stat names + const statsText = buildUserStatsText(); // Update BOTH lastGeneratedData AND committedTrackerData // This makes manual edits immediately visible to AI diff --git a/src/systems/rendering/userStats.js b/src/systems/rendering/userStats.js index eed3789..b51299f 100644 --- a/src/systems/rendering/userStats.js +++ b/src/systems/rendering/userStats.js @@ -20,9 +20,28 @@ import { import { getSafeThumbnailUrl } from '../../utils/avatars.js'; import { buildInventorySummary } from '../generation/promptBuilder.js'; +/** + * Builds the user stats text string using custom stat names + * @returns {string} Formatted stats text for tracker + */ +export function buildUserStatsText() { + const stats = extensionSettings.userStats; + const statNames = extensionSettings.statNames || { + health: 'Health', + satiety: 'Satiety', + energy: 'Energy', + hygiene: 'Hygiene', + arousal: 'Arousal' + }; + const inventorySummary = buildInventorySummary(stats.inventory); + + return `${statNames.health}: ${stats.health}%\n${statNames.satiety}: ${stats.satiety}%\n${statNames.energy}: ${stats.energy}%\n${statNames.hygiene}: ${stats.hygiene}%\n${statNames.arousal}: ${stats.arousal}%\n${stats.mood}: ${stats.conditions}\n${inventorySummary}`; +} + /** * Renders the user stats panel with health bars, mood, inventory, and classic stats. * Includes event listeners for editable fields. +``` */ export function renderUserStats() { if (!extensionSettings.showUserStats || !$userStatsContainer) { @@ -30,11 +49,18 @@ export function renderUserStats() { } const stats = extensionSettings.userStats; + const statNames = extensionSettings.statNames || { + health: 'Health', + satiety: 'Satiety', + energy: 'Energy', + hygiene: 'Hygiene', + arousal: 'Arousal' + }; const userName = getContext().name1; // Initialize lastGeneratedData.userStats if it doesn't exist if (!lastGeneratedData.userStats) { - lastGeneratedData.userStats = `Health: ${stats.health}%\nSatiety: ${stats.satiety}%\nEnergy: ${stats.energy}%\nHygiene: ${stats.hygiene}%\nArousal: ${stats.arousal}%\n${stats.mood}: ${stats.conditions}\nInventory: ${stats.inventory}`; + lastGeneratedData.userStats = buildUserStatsText(); } // Get user portrait - handle both default-user and custom persona folders @@ -64,7 +90,7 @@ export function renderUserStats() {
- Health: + ${statNames.health}:
@@ -72,7 +98,7 @@ export function renderUserStats() {
- Satiety: + ${statNames.satiety}:
@@ -80,7 +106,7 @@ export function renderUserStats() {
- Energy: + ${statNames.energy}:
@@ -88,7 +114,7 @@ export function renderUserStats() {
- Hygiene: + ${statNames.hygiene}:
@@ -96,7 +122,7 @@ export function renderUserStats() {
- Arousal: + ${statNames.arousal}:
@@ -184,10 +210,8 @@ export function renderUserStats() { // Update the setting extensionSettings.userStats[field] = value; - // Rebuild userStats text with proper inventory format - const stats = extensionSettings.userStats; - const inventorySummary = buildInventorySummary(stats.inventory); - const statsText = `Health: ${stats.health}%\nSatiety: ${stats.satiety}%\nEnergy: ${stats.energy}%\nHygiene: ${stats.hygiene}%\nArousal: ${stats.arousal}%\n${stats.mood}: ${stats.conditions}\n${inventorySummary}`; + // Rebuild userStats text with custom stat names + const statsText = buildUserStatsText(); // Update BOTH lastGeneratedData AND committedTrackerData // This makes manual edits immediately visible to AI @@ -207,10 +231,8 @@ export function renderUserStats() { const value = $(this).text().trim(); extensionSettings.userStats.mood = value || '😐'; - // Rebuild userStats text with proper inventory format - const stats = extensionSettings.userStats; - const inventorySummary = buildInventorySummary(stats.inventory); - const statsText = `Health: ${stats.health}%\nSatiety: ${stats.satiety}%\nEnergy: ${stats.energy}%\nHygiene: ${stats.hygiene}%\nArousal: ${stats.arousal}%\n${stats.mood}: ${stats.conditions}\n${inventorySummary}`; + // Rebuild userStats text with custom stat names + const statsText = buildUserStatsText(); // Update BOTH lastGeneratedData AND committedTrackerData // This makes manual edits immediately visible to AI @@ -226,10 +248,8 @@ export function renderUserStats() { const value = $(this).text().trim(); extensionSettings.userStats.conditions = value || 'None'; - // Rebuild userStats text with proper inventory format - const stats = extensionSettings.userStats; - const inventorySummary = buildInventorySummary(stats.inventory); - const statsText = `Health: ${stats.health}%\nSatiety: ${stats.satiety}%\nEnergy: ${stats.energy}%\nHygiene: ${stats.hygiene}%\nArousal: ${stats.arousal}%\n${stats.mood}: ${stats.conditions}\n${inventorySummary}`; + // Rebuild userStats text with custom stat names + const statsText = buildUserStatsText(); // Update BOTH lastGeneratedData AND committedTrackerData // This makes manual edits immediately visible to AI @@ -241,6 +261,30 @@ export function renderUserStats() { updateMessageSwipeData(); }); + // Add event listeners for stat name editing + $('.rpg-editable-stat-name').on('blur', function() { + const field = $(this).data('field'); + const value = $(this).text().trim().replace(':', ''); + + if (!extensionSettings.statNames) { + extensionSettings.statNames = { + health: 'Health', + satiety: 'Satiety', + energy: 'Energy', + hygiene: 'Hygiene', + arousal: 'Arousal' + }; + } + + extensionSettings.statNames[field] = value || extensionSettings.statNames[field]; + + saveSettings(); + saveChatData(); + + // Re-render to update the display + renderUserStats(); + }); + // Add event listener for level editing $('.rpg-level-value.rpg-editable').on('blur', function() { let value = parseInt($(this).text().trim()); diff --git a/src/systems/ui/modals.js b/src/systems/ui/modals.js index 51b1827..997bf7c 100644 --- a/src/systems/ui/modals.js +++ b/src/systems/ui/modals.js @@ -16,6 +16,7 @@ import { import { saveSettings, saveChatData } from '../../core/persistence.js'; import { renderUserStats } from '../rendering/userStats.js'; import { updateChatThoughts } from '../rendering/thoughts.js'; +import { renderQuests } from '../rendering/quests.js'; import { rollDice as rollDiceCore, clearDiceRoll as clearDiceRollCore, @@ -403,6 +404,12 @@ export function setupSettingsPopup() { // Clear dice roll extensionSettings.lastDiceRoll = null; + // Clear quests + extensionSettings.quests = { + main: "None", + optional: [] + }; + // Save everything saveChatData(); saveSettings(); @@ -411,6 +418,7 @@ export function setupSettingsPopup() { renderUserStats(); updateDiceDisplayCore(); updateChatThoughts(); // Clear the thought bubble in chat + renderQuests(); // Clear and re-render quests UI // console.log('[RPG Companion] Chat cache cleared'); }); diff --git a/style.css b/style.css index f185370..800f29c 100644 --- a/style.css +++ b/style.css @@ -1896,7 +1896,8 @@ body:has(.rpg-panel.rpg-position-left) #sheld { /* Editable field styles */ .rpg-editable, -.rpg-editable-stat { +.rpg-editable-stat, +.rpg-editable-stat-name { cursor: text; transition: all 0.2s ease; border-radius: 2px; @@ -1904,13 +1905,15 @@ body:has(.rpg-panel.rpg-position-left) #sheld { } .rpg-editable:hover, -.rpg-editable-stat:hover { +.rpg-editable-stat:hover, +.rpg-editable-stat-name:hover { background: var(--rpg-accent); outline: 1px solid var(--rpg-highlight); } .rpg-editable:focus, -.rpg-editable-stat:focus { +.rpg-editable-stat:focus, +.rpg-editable-stat-name:focus { background: var(--rpg-bg); outline: 2px solid var(--rpg-highlight); box-shadow: 0 0 8px var(--rpg-highlight);