Compare commits
4 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 54e1b0c2b2 | |||
| 9720a7befe | |||
| 130998105a | |||
| 411dc3eb9c |
+28
-19
@@ -40,6 +40,30 @@ const DEFAULT_USER_STATS = {
|
|||||||
clothing: "None",
|
clothing: "None",
|
||||||
stored: {},
|
stored: {},
|
||||||
assets: "None"
|
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
|
||||||
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -1016,23 +1040,7 @@ export function loadChatData() {
|
|||||||
if (!savedData) {
|
if (!savedData) {
|
||||||
// Reset to defaults if no metadata exists, then try to rebuild from message swipe data below.
|
// Reset to defaults if no metadata exists, then try to rebuild from message swipe data below.
|
||||||
updateExtensionSettings({
|
updateExtensionSettings({
|
||||||
userStats: {
|
userStats: cloneSerializable(DEFAULT_USER_STATS),
|
||||||
health: 100,
|
|
||||||
satiety: 100,
|
|
||||||
energy: 100,
|
|
||||||
hygiene: 100,
|
|
||||||
arousal: 0,
|
|
||||||
mood: '😐',
|
|
||||||
conditions: 'None',
|
|
||||||
// Use v2 inventory format for defaults
|
|
||||||
inventory: {
|
|
||||||
version: 2,
|
|
||||||
onPerson: "None",
|
|
||||||
clothing: "None",
|
|
||||||
stored: {},
|
|
||||||
assets: "None"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
quests: {
|
quests: {
|
||||||
main: "None",
|
main: "None",
|
||||||
optional: []
|
optional: []
|
||||||
@@ -1052,9 +1060,10 @@ export function loadChatData() {
|
|||||||
clearThoughtBasedExpressionPortraits();
|
clearThoughtBasedExpressionPortraits();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Restore stats
|
// Restore stats — merge with defaults to preserve properties like `equipment`
|
||||||
|
// that may not exist in older saves
|
||||||
if (savedData?.userStats) {
|
if (savedData?.userStats) {
|
||||||
extensionSettings.userStats = { ...savedData.userStats };
|
extensionSettings.userStats = mergeWithDefaults(DEFAULT_USER_STATS, savedData.userStats);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Restore classic stats
|
// Restore classic stats
|
||||||
|
|||||||
@@ -525,7 +525,8 @@ export async function onMessageReceived(data) {
|
|||||||
// Remove the tracker code blocks from the visible message
|
// Remove the tracker code blocks from the visible message
|
||||||
let cleanedMessage = responseText;
|
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)
|
// Remove old text format code blocks (legacy support)
|
||||||
cleanedMessage = cleanedMessage.replace(/```[^`]*?Stats\s*\n\s*---[^`]*?```\s*/gi, '');
|
cleanedMessage = cleanedMessage.replace(/```[^`]*?Stats\s*\n\s*---[^`]*?```\s*/gi, '');
|
||||||
|
|||||||
@@ -77,7 +77,7 @@ function generateItemId() {
|
|||||||
* Updates lastGeneratedData and committedTrackerData to include current equipment state
|
* Updates lastGeneratedData and committedTrackerData to include current equipment state
|
||||||
*/
|
*/
|
||||||
function updateEquipmentData() {
|
function updateEquipmentData() {
|
||||||
const equipment = extensionSettings.userStats.equipment;
|
const equipment = extensionSettings.userStats?.equipment || { items: [], slots: {} };
|
||||||
const currentData = lastGeneratedData.userStats || committedTrackerData.userStats;
|
const currentData = lastGeneratedData.userStats || committedTrackerData.userStats;
|
||||||
|
|
||||||
if (currentData) {
|
if (currentData) {
|
||||||
@@ -153,7 +153,7 @@ export function showCreateModal() {
|
|||||||
* @param {string} itemId - ID of the item to edit
|
* @param {string} itemId - ID of the item to edit
|
||||||
*/
|
*/
|
||||||
export function showEditModal(itemId) {
|
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);
|
const item = equipment.items.find(i => i.id === itemId);
|
||||||
if (!item) return;
|
if (!item) return;
|
||||||
|
|
||||||
@@ -363,7 +363,7 @@ export function saveEquipmentItem() {
|
|||||||
stats[attr] = Math.max(1, Math.min(20, val));
|
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)
|
// Migrate old types (ring1-ring10 -> ring, accessory1-3 -> accessory)
|
||||||
migrateItemTypes(equipment.items);
|
migrateItemTypes(equipment.items);
|
||||||
@@ -423,7 +423,7 @@ export function saveEquipmentItem() {
|
|||||||
* @param {string} itemId - ID of the item to equip
|
* @param {string} itemId - ID of the item to equip
|
||||||
*/
|
*/
|
||||||
export function equipItem(itemId) {
|
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);
|
const item = equipment.items.find(i => i.id === itemId);
|
||||||
if (!item) return;
|
if (!item) return;
|
||||||
|
|
||||||
@@ -454,7 +454,7 @@ export function equipItem(itemId) {
|
|||||||
* @param {string} slotId - The slot to unequip from
|
* @param {string} slotId - The slot to unequip from
|
||||||
*/
|
*/
|
||||||
export function unequipItem(slotId) {
|
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);
|
const item = equipment.items.find(i => i.slot === slotId);
|
||||||
if (item) {
|
if (item) {
|
||||||
item.slot = null;
|
item.slot = null;
|
||||||
@@ -473,7 +473,7 @@ export function unequipItem(slotId) {
|
|||||||
* @param {string} itemId - ID of the item to delete
|
* @param {string} itemId - ID of the item to delete
|
||||||
*/
|
*/
|
||||||
export function deleteItem(itemId) {
|
export function deleteItem(itemId) {
|
||||||
const equipment = extensionSettings.userStats.equipment;
|
const equipment = extensionSettings.userStats?.equipment || { items: [], slots: {} };
|
||||||
|
|
||||||
// Unequip if currently equipped
|
// Unequip if currently equipped
|
||||||
const item = equipment.items.find(i => i.id === itemId);
|
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
|
* @returns {Object} Map of attribute ID to total bonus value
|
||||||
*/
|
*/
|
||||||
export function getEquipmentBonuses() {
|
export function getEquipmentBonuses() {
|
||||||
const equipment = extensionSettings.userStats.equipment;
|
const equipment = extensionSettings.userStats?.equipment || { items: [], slots: {} };
|
||||||
const bonuses = {};
|
const bonuses = {};
|
||||||
const items = equipment.items || [];
|
const items = equipment.items || [];
|
||||||
|
|
||||||
|
|||||||
@@ -64,7 +64,7 @@ function renderSlot(slotDef, item) {
|
|||||||
* @returns {string} Complete HTML for the equipment section
|
* @returns {string} Complete HTML for the equipment section
|
||||||
*/
|
*/
|
||||||
function generateEquipmentHTML() {
|
function generateEquipmentHTML() {
|
||||||
const equipment = extensionSettings.userStats.equipment;
|
const equipment = extensionSettings.userStats?.equipment || { items: [], slots: {} };
|
||||||
const slots = equipment.slots || {};
|
const slots = equipment.slots || {};
|
||||||
const items = equipment.items || [];
|
const items = equipment.items || [];
|
||||||
|
|
||||||
|
|||||||
@@ -12183,7 +12183,7 @@ body.documentstyle .rpg-inline-thoughts {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.rpg-equipment-modal-content {
|
.rpg-equipment-modal-content {
|
||||||
background: var(--SmartThemeDialogBgColor);
|
background: var(--SmartThemeDialogBgColor, #1e1e2e);
|
||||||
border-radius: 8px;
|
border-radius: 8px;
|
||||||
width: 90%;
|
width: 90%;
|
||||||
max-width: 420px;
|
max-width: 420px;
|
||||||
|
|||||||
Reference in New Issue
Block a user