Add relative/skill goals, import diffs, and history tooling.

Extends the goals system and viewer UX so players can track item and skill
targets with groups, ETAs, global search, snapshot management, and DB export.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-06-19 22:59:01 +02:00
parent 4e3fa590c8
commit 64820cefc1
8 changed files with 1196 additions and 80 deletions
+44 -4
View File
@@ -22,6 +22,7 @@
},
"actions": {
"importBackup": "Backup importieren",
"exportViewer": "Viewer exportieren",
"compare": "Vergleichen",
"dismiss": "Schließen"
},
@@ -42,6 +43,13 @@
"duplicate": "Backup bereits vorhanden (Duplikat).",
"success": "Importiert: Snapshot #{id}",
"successWithNotes": "Importiert: Snapshot #{id}\n\n{warnings} Warnung(en), {infos} Hinweis(e) Details im Dashboard-Banner.",
"changesTitle": "Änderungen seit letztem Import",
"changesSummary": "Münzen {coins} · Level {level} · {inv} Inventar-Änderungen · {skills} Skill-Änderungen",
"questsCompleted": "Story-Quests abgeschlossen",
"slayerKills": "Slayer-Kills",
"dungeonRuns": "Dungeon-Läufe",
"topInventory": "Größte Inventar-Änderungen",
"topSkills": "Größte Skill-Änderungen",
"titleError": "Import-Fehler",
"titleWarning": "Import-Warnungen",
"titleInfo": "Import-Hinweise",
@@ -81,7 +89,8 @@
"coins": "Münzen",
"totalLevel": "Gesamtlevel",
"items": "Items",
"totalQty": "Gesamtmenge"
"totalQty": "Gesamtmenge",
"goalsOpen": "Offene Ziele"
},
"overview": {
"character": "Charakter",
@@ -105,7 +114,9 @@
"sortName": "Nach Name",
"skill": "Skill",
"level": "Level",
"progress": "Fortschritt"
"progress": "Fortschritt",
"addGoal": "Ziel hinzufügen",
"addGoalFor": "Ziel für {name} hinzufügen"
},
"inventory": {
"search": "Item suchen…",
@@ -162,8 +173,22 @@
"skillChanges": "Skill-Änderungen ({count})",
"delta": "Delta",
"xpDelta": "XP-Delta",
"skillLevelChart": "Top-Skills über Zeit",
"delete": "Löschen",
"deleteSnapshot": "Snapshot löschen",
"deleteSnapshotConfirm": "Diesen Snapshot wirklich löschen?",
"deleteSnapshotFailed": "Snapshot konnte nicht gelöscht werden",
"coinsSummary": "Münzen: {delta} · Gesamtlevel: {levelDelta}"
},
"search": {
"global": "Items, Skills und Ziele suchen…",
"noResults": "Keine Treffer",
"type": {
"item": "Item",
"skill": "Skill",
"goal": "Ziel"
}
},
"category": {
"currency": "Währung",
"ores_mining": "Erze & Mining",
@@ -218,13 +243,28 @@
"deleteGroupConfirm": "Gruppe „{name}“ löschen? Ziele bleiben ohne Gruppe erhalten.",
"deleteConfirm": "Dieses Ziel löschen?",
"clearCompleted": "Erledigte entfernen",
"empty": "Noch keine Ziele. Lege Ziele im Inventar-Tab an.",
"empty": "Noch keine Ziele. Lege Ziele im Inventar- oder Skills-Tab an.",
"loadError": "Ziele konnten nicht geladen werden",
"createFailed": "Ziel konnte nicht angelegt werden",
"groupCreateFailed": "Gruppe konnte nicht angelegt werden",
"modalTitle": "Ziel hinzufügen",
"modalTitle": "Item-Ziel hinzufügen",
"modalTitleSkill": "Skill-Ziel hinzufügen",
"cancel": "Abbrechen",
"targetQty": "Zielmenge",
"targetLevel": "Ziel-Level",
"mode": "Modus",
"modeAbsolute": "Absolut (Gesamtmenge/Level)",
"modeRelative": "Relativ (seit Anlegen)",
"modeRelativeHint": "Relatives Ziel Fortschritt seit Anlegen",
"typeSkill": "Skill",
"currentLevel": "Aktuell: Level {level}",
"missing": "Noch {qty} fehlen",
"missingShort": "{qty}",
"etaSnapshots": "ca. {n} Import(e)",
"hasGoal": "Offenes Ziel",
"total": "gesamt",
"renameGroup": "Umbenennen",
"renameGroupPrompt": "Neuer Gruppenname:",
"selectGroup": "Gruppe",
"noGroup": "Keine Gruppe",
"newGroup": "Neue Gruppe…",
+44 -4
View File
@@ -22,6 +22,7 @@
},
"actions": {
"importBackup": "Import backup",
"exportViewer": "Export viewer",
"compare": "Compare",
"dismiss": "Dismiss"
},
@@ -42,6 +43,13 @@
"duplicate": "Backup already exists (duplicate).",
"success": "Imported: Snapshot #{id}",
"successWithNotes": "Imported: Snapshot #{id}\n\n{warnings} warning(s), {infos} note(s) see dashboard banner for details.",
"changesTitle": "Changes since last import",
"changesSummary": "Coins {coins} · Level {level} · {inv} inventory changes · {skills} skill changes",
"questsCompleted": "Story quests completed",
"slayerKills": "Slayer kills",
"dungeonRuns": "Dungeon runs",
"topInventory": "Largest inventory changes",
"topSkills": "Largest skill changes",
"titleError": "Import errors",
"titleWarning": "Import warnings",
"titleInfo": "Import notes",
@@ -81,7 +89,8 @@
"coins": "Coins",
"totalLevel": "Total level",
"items": "Items",
"totalQty": "Total quantity"
"totalQty": "Total quantity",
"goalsOpen": "Open goals"
},
"overview": {
"character": "Character",
@@ -105,7 +114,9 @@
"sortName": "By name",
"skill": "Skill",
"level": "Level",
"progress": "Progress"
"progress": "Progress",
"addGoal": "Add goal",
"addGoalFor": "Add goal for {name}"
},
"inventory": {
"search": "Search items…",
@@ -162,8 +173,22 @@
"skillChanges": "Skill changes ({count})",
"delta": "Delta",
"xpDelta": "XP delta",
"skillLevelChart": "Top skills over time",
"delete": "Delete",
"deleteSnapshot": "Delete snapshot",
"deleteSnapshotConfirm": "Really delete this snapshot?",
"deleteSnapshotFailed": "Could not delete snapshot",
"coinsSummary": "Coins: {delta} · Total level: {levelDelta}"
},
"search": {
"global": "Search items, skills and goals…",
"noResults": "No results",
"type": {
"item": "Item",
"skill": "Skill",
"goal": "Goal"
}
},
"category": {
"currency": "Currency",
"ores_mining": "Ores & Mining",
@@ -218,13 +243,28 @@
"deleteGroupConfirm": "Delete group \"{name}\"? Goals will be kept as ungrouped.",
"deleteConfirm": "Delete this goal?",
"clearCompleted": "Remove completed",
"empty": "No goals yet. Add goals from the Inventory tab.",
"empty": "No goals yet. Add goals from the Inventory or Skills tab.",
"loadError": "Failed to load goals",
"createFailed": "Could not create goal",
"groupCreateFailed": "Could not create group",
"modalTitle": "Add goal",
"modalTitle": "Add item goal",
"modalTitleSkill": "Add skill goal",
"cancel": "Cancel",
"targetQty": "Target quantity",
"targetLevel": "Target level",
"mode": "Mode",
"modeAbsolute": "Absolute (total qty/level)",
"modeRelative": "Relative (since creation)",
"modeRelativeHint": "Relative goal progress since creation",
"typeSkill": "Skill",
"currentLevel": "Current: level {level}",
"missing": "{qty} still needed",
"missingShort": "{qty}",
"etaSnapshots": "~{n} import(s)",
"hasGoal": "Open goal",
"total": "total",
"renameGroup": "Rename",
"renameGroupPrompt": "New group name:",
"selectGroup": "Group",
"noGroup": "No group",
"newGroup": "New group…",