v1.23.0
Immutable
release. Only release title and notes can be modified.
Features
- sheets: let players override an item's display name on its sheet
- sheets: add hasCustomName field and a dedicated resolveItemName helper
- hooks: match translated item names in the cross-compendium search
- hooks: localize item names in the compendium browser window
- importer: wire language detection and label migration into the UI
- importer: add a migration tool to backfill labels on existing items
- sheets: show the client-localized item name on item cards
- helpers: resolve localizeOr against the item name dictionary
- importer: apply the label/dictionary scheme to existing-pack translation
- importer: stop baking translated names into item.name
- importer: detect a translation file's language from its filename
- utils: add a world-shared item name translation dictionary
- importer: add name-normalization helpers for item labels
- importer: allow translating all compendia at once, shorten button label
- importer: add UI to apply a translation file to an existing compendium
- importer: add standalone logic to translate an already-imported pack
- importer: update existing compendium items instead of duplicating on re-import
- importer: add pure matching logic for updating existing compendium items
- importer: fall back to a reference compendium for cross-language name matching
- importer: resolve source book titles and keep the pre-translation name
- models: add source/translation metadata fields to items
- helpers: add value-yielding firstOf helper
- importer: translate imported item names via Chummer language file
- magic: let adepts suppress powers to free up Power Points
- importer: import the mystic adept Magic allocation
- magic: let mystic adepts allocate their Magic on the sheet
- magic: roll magic against the spellpower share
- scene: let the gamemaster pick the mystic adept reduction side
- magic: derive the mystic adept Magic split
- implants: add tooltip clarifying essenceActual excludes qualities
- importer: reverse Chummer essence modifiers and truncate essence display
- implants: scale implant essence by biocompatibility and sensitive system
- magic: apply background count to summoning, binding and dismissal drain
- magic: apply background count to spell dice pools, Force and Drain
- scene: add GM scene-modifiers dialog and toolbar button
- scene: add background count storage and effective Magic
- api: expose CybercombatFlow via game.sr4
- matrix: add dynamic quick-action buttons for matrix actions
Bug Fixes
- importer: make language-code handling consistent across dialogs
- hooks: reveal search matches by translated item name, per pack
- hooks: match compendium search against the localized item name too
- importer: make the whole importer dialog scrollable
- importer: make the whole importer dialog scrollable
- importer: stop labeling the translate dialog's file as optional
- importer: reuse the already-uploaded translation file for Translate
- settings: make flow settings menu content actually scrollable
- combat: include vehicles and spirits as valid physical attack targets
- clean up two pre-existing eslint findings
- importer: make preview table scroll independently of window size
- importer: avoid ammo/ammo-accessory compendium collision
- importer: resolve localized tradition, mentor spirit, and paragon names
- importer: resolve localized skill names to canonical English skills
- ci: run tests once per PR push instead of twice
- documents: give computeVehicleDerivedStats the same return shape
- documents: make the conditionMonitor guard fully consistent
- sheets: abort stale listeners on item-sheet re-render
- documents: guard missing conditionMonitor in summoned/vehicle derived stats
- actor: guard against malformed npcDefaultSkills JSON
- implants: show derived essenceActual on the item sheet
- implants: derive essenceActual from grade and stop essence drift
- scene: group Shadowrun tools under one control set
- scene: guard scene-modifiers dialog against no active scene
Improvements
- importer: split flat src/importer/ into character/pack/xml/translation
- importer: fix test naming and lock the actual merge-equivalence invariant
- importer: restore workaround comment, hoist weapon-type arrays, add coverage
- importer: address review feedback on importer-cleanup branch
- importer: extract planGroupImport from XmlImporterApp#onImport
- importer: extract findUnmatchedWeapon helper in character importer
- importer: extract normalizeLangCode helper and dedupe usage
- importer: remove the dedicated label migration tool
- importer: route pack updates through pack.documentClass, sharpen wording
- settings: extract settings-menu SCSS and fix scroll behavior
- templates: use firstOf helper for value fallbacks
- templates: extract npc-item-list partial
- combat: dedupe single/multi-target ranged attack rolling
- hooks: centralize the dice-total chat patch under src/hooks
- matrix: extract cybercombat defense handling into a flow class
- hooks: extract compendium purge logic into @utils
- combat: extract turn-order logic into @domains/combat flow
- combat: extract initiative rolling into @domains/combat flow
- combat: move combat tracker UI out of documents/
- mappers: remove derivedStats.mapper barrel, repoint all imports
- mappers: relocate derived-stats mappers to domains/models
- combat: move initiative helpers into @domains/combat
- dialog: simplify rollSkillDialog to auto-compute dice pool
- imports: consolidate multi-sibling deep imports into local barrels
- utils: consolidate dialog imports behind the @utils/dialog barrel
- utils: resolve the dialogutility.js re-export shim
- domains: move combat (attack/defense/damage) into src/domains/combat
- domains: move magic (spellcasting/combat-spell/opposed-spell) into src/domains/magic
- domains: move summoned-entity (summon/bind/dismiss) into src/domains/summoned-entity
- domains: move matrix (cybercombat/damage/dumpshock) into src/domains/matrix
- domains: move resonance (threading) into src/domains/resonance
- domains: promote rigging out of utils into src/domains/rigging
- utils: move decision-registry.js from flows into utils
- documents: split computeDerivedStats into named sub-computations
- documents: extend pure derived-stats mappers to spirit/sprite/vehicle
- documents: make computeDerivedStats pure instead of mutating actorData
- importer: replace any-cast in mapAmmo with a precise type
- importer: extract gear branch mappers and dedupe gearBase
- importer: merge metatype.js and critter.js into templates.js
- importer: extract ammo-only weapon-bonus logic from gear.js
- importer: dedupe variant-over-base merge for metatype/critter
- sheets: extract busy-state toggle and dedupe failure notifications
- models: split schema-helper.js by topic
- sheets: dispatch item-sheet type context via lookup table
- sheets: split sr4-base-actor-sheet.js by action domain
- sheets: extract remaining inline item filters into inventory-context.js
- models: split basecharacter.model.js by domain
- sheets: extract shared focus-select and image-edit listeners
- models: dedupe tradition choices via Traditions enum
- utils: route matrix/dice-split/rigging imports through @utils barrel
- hooks: split die-chat-hook.js by concern
- dialog: split oversized dialogutility/attack/drone-pool modules
- documents: split derivedStats.mapper.js by domain
- documents: split actor.js lifecycle hooks and skill seeding into modules
- importer: use sourceOf() helper consistently in metatype/critter mappers
- dialog: split magic/ folder into magic/resonance/summoned-entity by domain
- dialog: dedupe modifier-bonus lookup in getSkillModifier/getSpellCategoryBonus
- magic: unify the roll-edge-resist-netHits sequence across spirit/sprite service flows
- combat: dedupe defense-trigger emission after attack rolls
- dialog: dedupe roll dialog opener wrappers
- chat: dedupe decision-card rendering in die-chat-hook
- vehicle: drop duplicate monitor-box handler
- magic: dedupe the summoning/binding/dismissal drain resolution
- magic: move the mystic adept block into the adept column
Full Changelog: v1.22.0...v1.23.0