v1.8.0 focuses on session hygiene, extensibility, and UX polish — a full memory reset on pack close, a custom material type system, a shared loot component, a Language right-click menu, and a sweep of important behavioural fixes.

New Features

AreaChange
CoreFull memory reset on pack close — closing the last edit pack clears PackContext, PackIndexer, DynamicOptions (all lists), LangRegistry, and FileUtil.lastDir; session is completely fresh without restarting; same reset fires when promoting a reference pack to edit
CoreDynamicOptions.clearAll() — clears all dynamic lists and re-seeds built-in MDK defaults (craft types, skill categories, quest types, material types); all registered live combos refresh automatically
MaterialsCustom material type combo — type field converted to liveCombo; type any custom folder name (e.g. wire) for new categories; routes saves to data/items/materials/wires/; custom types persist for the session and are pushed back on save; PackIndexer infers type from parent folder on pack open; smart pluralisation (wirewires, alloyalloys, already-plural types unchanged)
UIShared LootPanel component — loot entry UI extracted from EnemyEditor and RoomEditor into ui/LootPanel.java; Item ID field uses liveCombo(ITEM_IDS) showing all indexed materials and equipment; single fix point for both editors going forward
LanguagesLanguage tab right-click context menu — right-click any key row for a themed popup with two actions: Remove Row (table only) and Remove & Unregister Key (table + LangRegistry); only appears on key/value rows, not section headers
QuestsQuest description field removed from form — now a hidden auto-derived lang key (displayName + ".desc"); both display name and description registered to Quests section on save automatically
ManifestManifest live lang key push removed — category row lang keys are only pushed to LangRegistry on Save/Create, not on every keystroke; eliminates phantom language entries appearing while typing
CorePackIndexer improvements — indexes quest displayName to LangRegistry; handles both new quest (singular) and old quests root keys; category detected from top-level field first with meta.category as fallback
EnemiesEnemy loot Item ID converted to liveCombo(ITEM_IDS) — all indexed materials and equipment available in the dropdown; eliminates spelling errors in loot table entries

Changes

  • Enemy resistance spinners range changed from 0–1 to -1–10 — negative values represent vulnerability (enemy takes amplified damage of that type)
  • Equipment save path now uses deriveCatPath() and isShipCategory() — correctly routes original:personal_suit to data/items/equipment/personal/suit/ instead of the raw MDK ID string
  • EquipmentEditor gains lastSavedDispEquip / lastSavedDescEquip tracking, matching the pattern used by all other editors
  • PackIndexer.setPackRoot(null) now cancels a pending background scan instead of triggering a new one

Fixes

  • Manifest tab no longer sends keystrokes to Language tab — autoRegisterLangKey removed from DocumentListener and refreshPreview; keys only fire on save
  • Quest displayName lang key tracked with lastSavedDispQuest; LangRegistry.replace() called on re-save to rename rather than duplicate
  • PackBrowserEditor tab bar reliable — addRefBtn and leftPanel stored as instance fields; revalidation propagated up ancestor chain via SwingUtilities.invokeLater