Skip to content

2.3.0 - Wings

Latest

Choose a tag to compare

@Sayshal Sayshal released this 23 Aug 21:23

Breaking Changes

  • [#221] Module hooks are now namespaced with the module id. The two hooks that shipped before this release, spellBookOpened and spellBookClosed, are now spell-book.spellBookOpened and spell-book.spellBookClosed. Third-party macros or modules listening on the old unprefixed names must be updated.

New Features

  • [#213] Added module hooks for other modules to react to: cancellable spell-book.preLearnSpell (with mutable gold cost and copy time), spell-book.spellLearned, spell-book.spellCopied, spell-book.preparationSaved, and spell-book.loadoutApplied.
  • [#214] Added learnFromScroll and getSpellLearningCost to the module API for other modules to drive scroll learning.
  • [#214] Added the "Charge Cost for Scroll Copying" world setting, off by default, which applies the normal gold cost when learning from a scroll.
  • [#214] Buying a spell scroll through Peddler now whispers the buyer a chat card offering to copy the linked spell into their wizard spellbook, with a class picker when more than one wizard-enabled class is present.
  • [#215] Added the "GM Approval for Spell Copying" world setting, off by default, which queues a player's paid spell copy as a pending request on the actor instead of copying it immediately, and holds the request until a GM logs in.
  • [#215] Added the "Log Spell Copying to Downtime Note" world setting, off by default, which appends every paid or scroll copy to that day's downtime note. Requires Calendaria.
  • [#215] Approving a request copies the spell and advances world time by the copying duration, with a skip-time checkbox to approve without spending time. The requester is whispered the outcome and their open Spell Book refreshes.
  • [#216] Added openPartyCoordinator to the module API, which opens the Party Coordinator for a supplied actor array or group actor, filtering the roster to spellcasters and returning null when none remain.
  • [#217] The learn tab footer shows the character's wallet total, and an "Affordable Only" sidebar filter appears while spell learning costs are deducted.
  • [#217] The learn tab now shows each spell's copying cost next to the Learn button, with a free badge for cantrips and remaining free spells, a red cost when the character cannot pay it, and the Learn button disabled behind a tooltip naming the shortfall.

Bug Fixes

  • Fixed several runtime defects: class lookups that broke in the minified build, missing DialogV2 window titles, a non-functional close action, unguarded compendium ownership configuration, notifications that never cleared, and caches that were never invalidated.
  • Fixed the "no spell list assigned" warning notification showing the raw localization key instead of the translated message.
  • The over-limit preparation warning now uses separate cantrip and spell localization strings, so the word "cantrips" or "spells" in the notification is translated instead of being injected as an English literal.

Changes

  • [#213] Free, paid, and scroll wizard learning now run through one shared path, so cost deduction and learn hooks behave the same in all three cases.
  • [#214] Spell copying time now displays in the largest whole unit instead of always in minutes, and saving class rules refreshes the cached wizard class list.
  • [#217] Currency deduction for spell copying now runs through the system's currency manager, so mixed coin types are converted and spent correctly.
  • [#218] The module now ships as a single minified bundle built with Rollup. The released package contains one bundled script and one stylesheet instead of the scripts and styles source tree. New build, build:watch, dev and clean npm scripts drive it, the release workflow builds and publishes the dist manifest and zip, and the clean script preserves dist/storage and dist/packs so persistent pack data survives a rebuild.
  • [#219] Every dialog the module opens now carries the module's theme instead of falling back to the system or core Foundry look, including the flag purge, scroll scanner, spells-not-in-lists, wizard learn, custom spell list, loadout delete, scroll purchase, spell list change, long rest swap and copy approval prompts.
  • [#219] Module windows now map Foundry's own surface, text, form, button and input colour variables onto the ATLAS palette, so core-rendered form controls, selects, fieldsets, links and scrollbars match the rest of the interface in both themes.
  • [#220] Spell copy approval requests, the pending-request sweep, the downtime note, the spellcasting list notice, and the Peddler trade handler now run on a single designated primary GM, so multi-GM worlds no longer see duplicate approval prompts, notices, or downtime entries.
  • Bumped verified Foundry compatibility to 14.366.
  • Class rule custom spell list assignments are always stored as arrays. A startup migration on the primary GM converts worlds that still hold a single UUID string.
  • Custom spell list pages now carry a single kind flag (custom, duplicate, merged) instead of four overlapping booleans, and a startup migration on the primary GM restamps existing pages in the module pack. Rename and edit permissions in the spell list manager now follow that flag.
  • Internal: DialogV2 window titles and button labels now pass raw localization keys and let Foundry localize them, removing a redundant second localization pass. Interpolated strings still localize explicitly.
  • Internal: Dropped the HTML-scrape fallback that rebuilt user spell notes and favorites from journal page text whenever the stored user-data schema version was not 3.1. Data still held in the older format is no longer recovered automatically.
  • Internal: Repointed 155 spell list manager localization call sites from the SPELLMANAGER namespace to SPELLBOOK.Manager and normalized the remaining SPELLBOOK key segments, across scripts and Handlebars templates. No user-visible text change.
  • Internal: Repointed 74 localization references across 28 scripts and templates at 55 shared ATLAS.Common.* keys, removing duplicate module-local strings. No user-visible text change.
  • Internal: deleted the unused github_media/ screenshot folder, nine images orphaned when the README switched to wiki.3deathsaves.com links.
  • Internal: removed the dead socket layer. The "socket": true manifest flag is gone and the SocketHandler stub that registered a no-op CONFIG.queries handler was deleted, since the module's remaining cross-client work rides the ATLAS relay channel.
  • Internal: the repository now carries its own ESLint, Prettier, Stylelint and VS Code configuration instead of relying on the parent workspace, along with lint, lint:fix, format, format:check, stylelint, stylelint:fix and validate npm scripts and the devDependencies those configs required. Line endings are normalized to CRLF and all tracked files were reformatted. No functional change.
  • Internal: whole-repo cleanup pass. Removed dead code, two unused settings and orphan templates; restored the Actor Spellbooks compendium folder and re-filed journals stranded at pack root; matched module journals on a flag rather than display name; routed remaining user-facing strings through localization; split the spell list manager into separate app files and moved integration code under scripts/integrations.
  • Removed the legacy per-actor flat preparedSpells flag. Prepared spell state lives only in preparedSpellsByClass, which party mode spell lookups now read exclusively.
  • The spell slot tracker macro now lists Pact Magic slots and labels rows with the system's spell level names instead of bare numbers.
  • Updated the MIT license copyright holder from "Tyler" to "3 Death Saves".

Documentation

  • [#213] Moved the documentation out of the repo to wiki.3deathsaves.com and repointed the README images there.

What's Changed

Full Changelog: release-2.2.2...release-2.3.0

Installation: To manually install this release, use the following manifest URL: https://github.com/Sayshal/spell-book/releases/download/release-2.3.0/module.json