mirror of
https://github.com/prosolis/gogobee.git
synced 2026-07-15 08:32:41 +00:00
UX S2: caster onboarding — strip reaction defaults, deterministic healing_word, route hints
B2: Removed shield/counterspell from Mage/Sorcerer defaults and hellish_rebuke/counterspell
from Warlock — reactions are EffectReaction and combat has no reaction window yet, so
auto-granting them just litters the spellbook with dead entries. Substituted L1/L3
staples (sleep, fly, burning_hands, chromatic_orb where class-tagged appropriately).
B3: Replaced the stale "Mage, Cleric, Ranger, and Arcane Trickster (L5+)" enumeration in
!cast/!spells learn/!prepare error paths with class-aware route hints via a new
spellRouteHintFor() helper.
R15: Removed the duplicate hand-authored healing_word_spell entry; Cleric default now
references the canonical SRD healing_word (cleric/druid/bard tagged). parseSpell
and lookupSpell now resolve "healing word" deterministically.
R16: !cast --drop now appends "(slot refunded)" when applicable.
R17: Prep-cap message rewritten to "Your prepared list is full (N/N)."
R19: Removed shillelagh from Druid default — the overlay flags it cleric/ranger only and
it has no real attack profile yet (BuffSelf, no DamageDice).
Bonus correctness: dndSpellRegistry now unions Classes on overlay collision instead of
replacing wholesale. The hand-authored buildSpellList() entries were tagged Mage-only,
so every Sorcerer/Warlock/Bard/Druid spell that collided with the SRD silently lost its
class list — meaning auto-granted defaults were rejected at the classOK gate. Union
merge restores SRD coverage without forcing a hand-edit of every overlay entry.
Tests:
- TestDefaultKnownSpellsHaveNoReactions covers B2.
- TestDefaultKnownSpellsAreCastableByClass guards the overlay-narrow regression.
- TestHealingWordResolvesDeterministically covers R15.
- TestCastNonCasterErrorHasNoClassEnumeration covers B3.
- Existing dnd_prepare_test.go updated to reference healing_word.
This commit is contained in:
@@ -132,11 +132,10 @@ func buildSpellList() []SpellDefinition {
|
||||
Classes: cleric, Effect: EffectBuffAlly, CastTime: CastBonusAction,
|
||||
Concentration: true,
|
||||
Description: "+2 AC to one target. 10 min."},
|
||||
{ID: "healing_word_spell", Name: "Healing Word", Level: 1, School: "evocation",
|
||||
Classes: cleric, Effect: EffectSpellHeal, CastTime: CastBonusAction,
|
||||
DamageDice: "1d4",
|
||||
Description: "1d4 + WIS mod HP. Range 60 ft.",
|
||||
Upcast: "+1d4 per slot above 1st"},
|
||||
// `healing_word_spell` was a hand-authored alias for `healing_word`
|
||||
// that collided on display name with the SRD entry. Removed to make
|
||||
// parseSpell("healing word") deterministic; Cleric default now points
|
||||
// at the canonical SRD `healing_word` (cleric/druid/bard tagged).
|
||||
{ID: "command", Name: "Command", Level: 1, School: "enchantment",
|
||||
Classes: cleric, Effect: EffectControl, CastTime: CastAction,
|
||||
SaveStat: "WIS",
|
||||
|
||||
Reference in New Issue
Block a user