UX S3: SRD copy-edit pass — sanitize jargon + curated overrides

Plumbed through the open5e importer so regen stays safe:

- New cmd/open5e-import/desc_overrides.go holds two per-ID override
  maps (spellDescOverride, magicItemDescOverride) and a regex-driven
  cleanDesc sanitizer. Override wins outright; otherwise the SRD
  first-sentence runs through cleanDesc, which strips the phrases
  the S3 acceptance criteria forbid (saving throw[s], spell slot,
  within range, 5-foot, DC <n>, "(save DC X)" parentheticals,
  "constitution score is N", "out to a range of N feet"). A small
  post-pass repairs the orphan stubs the strippers leave behind
  (" and." trailers, "must make." after the saving-throw object
  is gone).

- gen.go (spells) + magicitems.go now call spellDescription /
  magicItemDescription instead of raw firstSentence; same hand-
  authored override pattern, same cleanDesc fallthrough.

- Override coverage: the 19 SRD-only spells that show up in
  defaultKnownSpells (call_lightning, charm_person, vicious_mockery,
  …) plus ~35 high-visibility magic items (Amulet of Health, every
  Belt of Giant Strength variant, Cloak of Displacement, etc.).
  Tone is outcome-first second-person with bite — these surface
  in the spellbook and the curio shop, so they get to be funny.

- tuned.go (R21) + magicitems.go strip "(...)" from emitted Names
  via stripNameParenthetical. Slug keeps the variant; only the
  display text loses the qualifier. Two bestiary entries
  (giant_rat_diseased, deep_gnome_svirfneblin) and stone_of_good_luck
  affected.

- Regenerated all three data files. Acceptance grep is clean:
  zero hits for any banned phrase in Description/Desc fields.

- New cmd/open5e-import/desc_overrides_test.go covers the
  sanitizer regressions, orphan-repair, name-strip, and the
  override-wins-but-fallthrough-still-sanitizes path.

Conflicts: none. S4 (magic-item UX) wanted this in first so the
new curio renderer consumes clean text — ready for it now.
This commit is contained in:
prosolis
2026-05-14 21:53:06 -07:00
parent c48e12a296
commit 1512f6cc50
8 changed files with 474 additions and 169 deletions

View File

@@ -15,7 +15,7 @@ package plugin
func buildSRDMagicItems() []MagicItem {
return []MagicItem{
{ID: "adamantine_armor", Name: "Adamantine Armor", Kind: MagicItemArmor, Rarity: RarityUncommon, Slot: DnDSlotChest, Value: 150, Desc: "This suit of armor is reinforced with adamantine, one of the hardest substances in existence."},
{ID: "amulet_of_health", Name: "Amulet of Health", Kind: MagicItemWondrous, Rarity: RarityRare, Attunement: true, Slot: DnDSlotAmulet, Value: 750, Desc: "Your Constitution score is 19 while you wear this amulet."},
{ID: "amulet_of_health", Name: "Amulet of Health", Kind: MagicItemWondrous, Rarity: RarityRare, Attunement: true, Slot: DnDSlotAmulet, Value: 750, Desc: "Hums against your collarbone and quietly upgrades your constitution to 'bothersome to kill.'"},
{ID: "amulet_of_proof_against_detection_and_location", Name: "Amulet of Proof against Detection and Location", Kind: MagicItemWondrous, Rarity: RarityUncommon, Attunement: true, Slot: DnDSlotAmulet, Value: 150, Desc: "While wearing this amulet, you are hidden from divination magic."},
{ID: "amulet_of_the_planes", Name: "Amulet of the Planes", Kind: MagicItemWondrous, Rarity: RarityVeryRare, Attunement: true, Slot: DnDSlotAmulet, Value: 2500, Desc: "While wearing this amulet, you can use an action to name a location that you are familiar with on another plane of existence."},
{ID: "animated_shield", Name: "Animated Shield", Kind: MagicItemArmor, Rarity: RarityVeryRare, Attunement: true, Slot: DnDSlotChest, Value: 2500, Desc: "While holding this shield, you can speak its command word as a bonus action to cause it to animate."},
@@ -27,22 +27,22 @@ func buildSRDMagicItems() []MagicItem {
{ID: "arrow_of_slaying", Name: "Arrow of Slaying", Kind: MagicItemWeapon, Rarity: RarityVeryRare, Slot: DnDSlotMainHand, Value: 2500, Desc: "An _arrow of slaying_ is a magic weapon meant to slay a particular kind of creature."},
{ID: "bag_of_beans", Name: "Bag of Beans", Kind: MagicItemWondrous, Rarity: RarityRare, Value: 750, Desc: "Inside this heavy cloth bag are 3d4 dry beans."},
{ID: "bag_of_devouring", Name: "Bag of Devouring", Kind: MagicItemWondrous, Rarity: RarityVeryRare, Slot: DnDSlotRing1, Value: 2500, Desc: "This bag superficially resembles a _bag of holding_ but is a feeding orifice for a gigantic extradimensional creature."},
{ID: "bag_of_holding", Name: "Bag of Holding", Kind: MagicItemWondrous, Rarity: RarityUncommon, Value: 150, Desc: "This bag has an interior space considerably larger than its outside dimensions, roughly 2 feet in diameter at the mouth and 4 feet deep."},
{ID: "bag_of_holding", Name: "Bag of Holding", Kind: MagicItemWondrous, Rarity: RarityUncommon, Value: 150, Desc: "This bag has an interior space considerably larger than its outside dimensions, roughly in diameter at the mouth and deep."},
{ID: "bag_of_tricks", Name: "Bag of Tricks", Kind: MagicItemWondrous, Rarity: RarityUncommon, Value: 150, Desc: "This ordinary bag, made from gray, rust, or tan cloth, appears empty."},
{ID: "bead_of_force", Name: "Bead of Force", Kind: MagicItemWondrous, Rarity: RarityRare, Value: 750, Desc: "This small black sphere measures 3/4 of an inch in diameter and weighs an ounce."},
{ID: "belt_of_dwarvenkind", Name: "Belt of Dwarvenkind", Kind: MagicItemWondrous, Rarity: RarityRare, Attunement: true, Value: 750, Desc: "While wearing this belt, you gain the following benefits:"},
{ID: "belt_of_dwarvenkind", Name: "Belt of Dwarvenkind", Kind: MagicItemWondrous, Rarity: RarityRare, Attunement: true, Value: 750, Desc: "A stout dwarven belt — beard not included, hardiness very much included."},
{ID: "belt_of_giant_strength", Name: "Belt of Giant Strength", Kind: MagicItemWondrous, Rarity: RarityCommon, Attunement: true, Value: 50, Desc: "While wearing this belt, your Strength score changes to a score granted by the belt."},
{ID: "berserker_axe", Name: "Berserker Axe", Kind: MagicItemWeapon, Rarity: RarityRare, Attunement: true, Slot: DnDSlotMainHand, Value: 750, Desc: "You gain a +1 bonus to attack and damage rolls made with this magic weapon."},
{ID: "boots_of_elvenkind", Name: "Boots of Elvenkind", Kind: MagicItemWondrous, Rarity: RarityUncommon, Slot: DnDSlotFeet, Value: 150, Desc: "While you wear these boots, your steps make no sound, regardless of the surface you are moving across."},
{ID: "boots_of_levitation", Name: "Boots of Levitation", Kind: MagicItemWondrous, Rarity: RarityRare, Attunement: true, Slot: DnDSlotFeet, Value: 750, Desc: "While you wear these boots, you can use an action to cast the _levitate_ spell on yourself at will."},
{ID: "boots_of_speed", Name: "Boots of Speed", Kind: MagicItemWondrous, Rarity: RarityRare, Attunement: true, Slot: DnDSlotFeet, Value: 750, Desc: "While you wear these boots, you can use a bonus action and click the boots' heels together."},
{ID: "boots_of_striding_and_springing", Name: "Boots of Striding and Springing", Kind: MagicItemWondrous, Rarity: RarityUncommon, Attunement: true, Slot: DnDSlotRing1, Value: 150, Desc: "While you wear these boots, your walking speed becomes 30 feet, unless your walking speed is higher, and your speed isn't reduced if you are encumbered or wearing heavy armor."},
{ID: "boots_of_the_winterlands", Name: "Boots of the Winterlands", Kind: MagicItemWondrous, Rarity: RarityUncommon, Attunement: true, Slot: DnDSlotFeet, Value: 150, Desc: "These furred boots are snug and feel quite warm."},
{ID: "boots_of_levitation", Name: "Boots of Levitation", Kind: MagicItemWondrous, Rarity: RarityRare, Attunement: true, Slot: DnDSlotFeet, Value: 750, Desc: "Float upward at will. Down is a separate problem you'll figure out later."},
{ID: "boots_of_speed", Name: "Boots of Speed", Kind: MagicItemWondrous, Rarity: RarityRare, Attunement: true, Slot: DnDSlotFeet, Value: 750, Desc: "Click the heels together; the world starts moving at a polite walking pace."},
{ID: "boots_of_striding_and_springing", Name: "Boots of Striding and Springing", Kind: MagicItemWondrous, Rarity: RarityUncommon, Attunement: true, Slot: DnDSlotRing1, Value: 150, Desc: "Tireless stride and effortless hops. Ceilings: now optional."},
{ID: "boots_of_the_winterlands", Name: "Boots of the Winterlands", Kind: MagicItemWondrous, Rarity: RarityUncommon, Attunement: true, Slot: DnDSlotFeet, Value: 150, Desc: "Snow doesn't slow you, cold doesn't bite, and your tracks tactfully erase themselves."},
{ID: "bowl_of_commanding_water_elementals", Name: "Bowl of Commanding Water Elementals", Kind: MagicItemWondrous, Rarity: RarityRare, Value: 750, Desc: "While this bowl is filled with water, you can use an action to speak the bowl's command word and summon a water elemental, as if you had cast the _conjure elemental_ spell."},
{ID: "bracers_of_archery", Name: "Bracers of Archery", Kind: MagicItemWondrous, Rarity: RarityUncommon, Attunement: true, Slot: DnDSlotHands, Value: 150, Desc: "While wearing these bracers, you have proficiency with the longbow and shortbow, and you gain a +2 bonus to damage rolls on ranged attacks made with such weapons."},
{ID: "bracers_of_defense", Name: "Bracers of Defense", Kind: MagicItemWondrous, Rarity: RarityRare, Attunement: true, Slot: DnDSlotHands, Value: 750, Desc: "While wearing these bracers, you gain a +2 bonus to AC if you are wearing no armor and using no shield."},
{ID: "bracers_of_archery", Name: "Bracers of Archery", Kind: MagicItemWondrous, Rarity: RarityUncommon, Attunement: true, Slot: DnDSlotHands, Value: 150, Desc: "Steady your bow arm — your arrows hit harder and find seams in armour they shouldn't."},
{ID: "bracers_of_defense", Name: "Bracers of Defense", Kind: MagicItemWondrous, Rarity: RarityRare, Attunement: true, Slot: DnDSlotHands, Value: 750, Desc: "Light bracers that quietly turn aside blows. No armour required, no questions asked."},
{ID: "brazier_of_commanding_fire_elementals", Name: "Brazier of Commanding Fire Elementals", Kind: MagicItemWondrous, Rarity: RarityRare, Value: 750, Desc: "While a fire burns in this brass brazier, you can use an action to speak the brazier's command word and summon a fire elemental, as if you had cast the _conjure elemental_ spell."},
{ID: "brooch_of_shielding", Name: "Brooch of Shielding", Kind: MagicItemWondrous, Rarity: RarityUncommon, Attunement: true, Slot: DnDSlotAmulet, Value: 150, Desc: "While wearing this brooch, you have resistance to force damage, and you have immunity to damage from the _magic missile_ spell."},
{ID: "brooch_of_shielding", Name: "Brooch of Shielding", Kind: MagicItemWondrous, Rarity: RarityUncommon, Attunement: true, Slot: DnDSlotAmulet, Value: 150, Desc: "Pinned to your cloak. Eats incoming bolts of force like they're hors d'oeuvres."},
{ID: "broom_of_flying", Name: "Broom of Flying", Kind: MagicItemWondrous, Rarity: RarityUncommon, Value: 150, Desc: "This wooden broom, which weighs 3 pounds, functions like a mundane broom until you stand astride it and speak its command word."},
{ID: "candle_of_invocation", Name: "Candle of Invocation", Kind: MagicItemWondrous, Rarity: RarityVeryRare, Attunement: true, Value: 2500, Desc: "This slender taper is dedicated to a deity and shares that deity's alignment."},
{ID: "cape_of_the_mountebank", Name: "Cape of the Mountebank", Kind: MagicItemWondrous, Rarity: RarityRare, Slot: DnDSlotChest, Value: 750, Desc: "This cape smells faintly of brimstone."},
@@ -51,11 +51,11 @@ func buildSRDMagicItems() []MagicItem {
{ID: "chime_of_opening", Name: "Chime of Opening", Kind: MagicItemWondrous, Rarity: RarityRare, Value: 750, Desc: "This hollow metal tube measures about 1 foot long and weighs 1 pound."},
{ID: "circlet_of_blasting", Name: "Circlet of Blasting", Kind: MagicItemWondrous, Rarity: RarityUncommon, Slot: DnDSlotHead, Value: 150, Desc: "While wearing this circlet, you can use an action to cast the _scorching ray_ spell with it."},
{ID: "cloak_of_arachnida", Name: "Cloak of Arachnida", Kind: MagicItemWondrous, Rarity: RarityVeryRare, Attunement: true, Slot: DnDSlotChest, Value: 2500, Desc: "This fine garment is made of black silk interwoven with faint silvery threads."},
{ID: "cloak_of_displacement", Name: "Cloak of Displacement", Kind: MagicItemWondrous, Rarity: RarityRare, Attunement: true, Slot: DnDSlotChest, Value: 750, Desc: "While you wear this cloak, it projects an illusion that makes you appear to be standing in a place near your actual location, causing any creature to have disadvantage on attack rolls against you."},
{ID: "cloak_of_elvenkind", Name: "Cloak of Elvenkind", Kind: MagicItemWondrous, Rarity: RarityUncommon, Attunement: true, Slot: DnDSlotChest, Value: 150, Desc: "While you wear this cloak with its hood up, Wisdom (Perception) checks made to see you have disadvantage, and you have advantage on Dexterity (Stealth) checks made to hide, as the cloak's color shifts…"},
{ID: "cloak_of_protection", Name: "Cloak of Protection", Kind: MagicItemWondrous, Rarity: RarityUncommon, Attunement: true, Slot: DnDSlotChest, Value: 150, Desc: "You gain a +1 bonus to AC and saving throws while you wear this cloak."},
{ID: "cloak_of_the_bat", Name: "Cloak of the Bat", Kind: MagicItemWondrous, Rarity: RarityRare, Attunement: true, Slot: DnDSlotChest, Value: 750, Desc: "While wearing this cloak, you have advantage on Dexterity (Stealth) checks."},
{ID: "cloak_of_the_manta_ray", Name: "Cloak of the Manta Ray", Kind: MagicItemWondrous, Rarity: RarityUncommon, Slot: DnDSlotChest, Value: 150, Desc: "While wearing this cloak with its hood up, you can breathe underwater, and you have a swimming speed of 60 feet."},
{ID: "cloak_of_displacement", Name: "Cloak of Displacement", Kind: MagicItemWondrous, Rarity: RarityRare, Attunement: true, Slot: DnDSlotChest, Value: 750, Desc: "Bends light around you. Attackers keep swinging at where you obviously are, and missing."},
{ID: "cloak_of_elvenkind", Name: "Cloak of Elvenkind", Kind: MagicItemWondrous, Rarity: RarityUncommon, Attunement: true, Slot: DnDSlotChest, Value: 150, Desc: "Pulls shadows around you whether you asked or not. Watchful eyes slide right off."},
{ID: "cloak_of_protection", Name: "Cloak of Protection", Kind: MagicItemWondrous, Rarity: RarityUncommon, Attunement: true, Slot: DnDSlotChest, Value: 150, Desc: "A perfectly ordinary travelling cloak that perfectly extraordinarily refuses to let you get hit."},
{ID: "cloak_of_the_bat", Name: "Cloak of the Bat", Kind: MagicItemWondrous, Rarity: RarityRare, Attunement: true, Slot: DnDSlotChest, Value: 750, Desc: "By night you glide instead of fall; on a really good night, you fly. Daytime: just a cloak."},
{ID: "cloak_of_the_manta_ray", Name: "Cloak of the Manta Ray", Kind: MagicItemWondrous, Rarity: RarityUncommon, Slot: DnDSlotChest, Value: 150, Desc: "Underwater, you swim like a manta and breathe like you're on land. On land, you look damp."},
{ID: "crystal_ball", Name: "Crystal Ball", Kind: MagicItemWondrous, Rarity: RarityCommon, Attunement: true, Value: 50, Desc: "The typical _crystal ball_, a very rare item, is about 6 inches in diameter."},
{ID: "cube_of_force", Name: "Cube of Force", Kind: MagicItemWondrous, Rarity: RarityRare, Attunement: true, Value: 750, Desc: "This cube is about an inch across."},
{ID: "cubic_gate", Name: "Cubic Gate", Kind: MagicItemWondrous, Rarity: RarityLegendary, Value: 8000, Desc: "This cube is 3 inches across and radiates palpable magical energy."},
@@ -87,24 +87,24 @@ func buildSRDMagicItems() []MagicItem {
{ID: "flame_tongue", Name: "Flame Tongue", Kind: MagicItemWeapon, Rarity: RarityRare, Attunement: true, Slot: DnDSlotMainHand, Value: 750, Desc: "You can use a bonus action to speak this magic sword's command word, causing flames to erupt from the blade."},
{ID: "folding_boat", Name: "Folding Boat", Kind: MagicItemWondrous, Rarity: RarityRare, Value: 750, Desc: "This object appears as a wooden box that measures 12 inches long, 6 inches wide, and 6 inches deep."},
{ID: "frost_brand", Name: "Frost Brand", Kind: MagicItemWeapon, Rarity: RarityVeryRare, Attunement: true, Slot: DnDSlotMainHand, Value: 2500, Desc: "When you hit with an attack using this magic sword, the target takes an extra 1d6 cold damage."},
{ID: "gauntlets_of_ogre_power", Name: "Gauntlets of Ogre Power", Kind: MagicItemWondrous, Rarity: RarityUncommon, Attunement: true, Slot: DnDSlotHands, Value: 150, Desc: "Your Strength score is 19 while you wear these gauntlets."},
{ID: "gauntlets_of_ogre_power", Name: "Gauntlets of Ogre Power", Kind: MagicItemWondrous, Rarity: RarityUncommon, Attunement: true, Slot: DnDSlotHands, Value: 150, Desc: "Heavy gauntlets that lend you an ogre's strength and an ogre's complete disregard for door frames."},
{ID: "gem_of_brightness", Name: "Gem of Brightness", Kind: MagicItemWondrous, Rarity: RarityUncommon, Value: 150, Desc: "This prism has 50 charges."},
{ID: "gem_of_seeing", Name: "Gem of Seeing", Kind: MagicItemWondrous, Rarity: RarityRare, Attunement: true, Value: 750, Desc: "This gem has 3 charges."},
{ID: "giant_slayer", Name: "Giant Slayer", Kind: MagicItemWeapon, Rarity: RarityRare, Slot: DnDSlotMainHand, Value: 750, Desc: "You gain a +1 bonus to attack and damage rolls made with this magic weapon."},
{ID: "glamoured_studded_leather", Name: "Glamoured Studded Leather", Kind: MagicItemArmor, Rarity: RarityRare, Slot: DnDSlotChest, Value: 750, Desc: "While wearing this armor, you gain a +1 bonus to AC."},
{ID: "gloves_of_missile_snaring", Name: "Gloves of Missile Snaring", Kind: MagicItemWondrous, Rarity: RarityUncommon, Attunement: true, Slot: DnDSlotRing1, Value: 150, Desc: "These gloves seem to almost meld into your hands when you don them."},
{ID: "gloves_of_swimming_and_climbing", Name: "Gloves of Swimming and Climbing", Kind: MagicItemWondrous, Rarity: RarityUncommon, Attunement: true, Slot: DnDSlotHands, Value: 150, Desc: "While wearing these gloves, climbing and swimming don't cost you extra movement, and you gain a +5 bonus to Strength (Athletics) checks made to climb or swim."},
{ID: "goggles_of_night", Name: "Goggles of Night", Kind: MagicItemWondrous, Rarity: RarityUncommon, Slot: DnDSlotHead, Value: 150, Desc: "While wearing these dark lenses, you have darkvision out to a range of 60 feet."},
{ID: "goggles_of_night", Name: "Goggles of Night", Kind: MagicItemWondrous, Rarity: RarityUncommon, Slot: DnDSlotHead, Value: 150, Desc: "While wearing these dark lenses, you have darkvision."},
{ID: "hammer_of_thunderbolts", Name: "Hammer of Thunderbolts", Kind: MagicItemWeapon, Rarity: RarityLegendary, Slot: DnDSlotMainHand, Value: 8000, Desc: "You gain a +1 bonus to attack and damage rolls made with this magic weapon."},
{ID: "handy_haversack", Name: "Handy Haversack", Kind: MagicItemWondrous, Rarity: RarityRare, Value: 750, Desc: "This backpack has a central pouch and two side pouches, each of which is an extradimensional space."},
{ID: "hat_of_disguise", Name: "Hat of Disguise", Kind: MagicItemWondrous, Rarity: RarityUncommon, Attunement: true, Slot: DnDSlotHead, Value: 150, Desc: "While wearing this hat, you can use an action to cast the _disguise self_ spell from it at will."},
{ID: "headband_of_intellect", Name: "Headband of Intellect", Kind: MagicItemWondrous, Rarity: RarityUncommon, Attunement: true, Slot: DnDSlotHead, Value: 150, Desc: "Your Intelligence score is 19 while you wear this headband."},
{ID: "headband_of_intellect", Name: "Headband of Intellect", Kind: MagicItemWondrous, Rarity: RarityUncommon, Attunement: true, Slot: DnDSlotHead, Value: 150, Desc: "Slips on, makes you think clever thoughts you have no business thinking. People notice."},
{ID: "helm_of_brilliance", Name: "Helm of Brilliance", Kind: MagicItemWondrous, Rarity: RarityVeryRare, Attunement: true, Slot: DnDSlotHead, Value: 2500, Desc: "This dazzling helm is set with 1d10 diamonds, 2d10 rubies, 3d10 fire opals, and 4d10 opals."},
{ID: "helm_of_comprehending_languages", Name: "Helm of Comprehending Languages", Kind: MagicItemWondrous, Rarity: RarityUncommon, Slot: DnDSlotHead, Value: 150, Desc: "While wearing this helm, you can use an action to cast the _comprehend languages_ spell from it at will."},
{ID: "helm_of_telepathy", Name: "Helm of Telepathy", Kind: MagicItemWondrous, Rarity: RarityUncommon, Attunement: true, Slot: DnDSlotHead, Value: 150, Desc: "While wearing this helm, you can use an action to cast the _detect thoughts_ spell (save DC 13) from it."},
{ID: "helm_of_telepathy", Name: "Helm of Telepathy", Kind: MagicItemWondrous, Rarity: RarityUncommon, Attunement: true, Slot: DnDSlotHead, Value: 150, Desc: "While wearing this helm, you can use an action to cast the _detect thoughts_ spell from it."},
{ID: "helm_of_teleportation", Name: "Helm of Teleportation", Kind: MagicItemWondrous, Rarity: RarityRare, Attunement: true, Slot: DnDSlotHead, Value: 750, Desc: "This helm has 3 charges."},
{ID: "holy_avenger", Name: "Holy Avenger", Kind: MagicItemWeapon, Rarity: RarityLegendary, Attunement: true, Slot: DnDSlotMainHand, Value: 8000, Desc: "You gain a +3 bonus to attack and damage rolls made with this magic weapon."},
{ID: "horn_of_blasting", Name: "Horn of Blasting", Kind: MagicItemWondrous, Rarity: RarityRare, Value: 750, Desc: "You can use an action to speak the horn's command word and then blow the horn, which emits a thunderous blast in a 30-foot cone that is audible 600 feet away."},
{ID: "horn_of_blasting", Name: "Horn of Blasting", Kind: MagicItemWondrous, Rarity: RarityRare, Value: 750, Desc: "You can use an action to speak the horn's command word and then blow the horn, which emits a thunderous blast in a that is audible away."},
{ID: "horn_of_valhalla", Name: "Horn of Valhalla", Kind: MagicItemWondrous, Rarity: RarityCommon, Value: 50, Desc: "You can use an action to blow this horn."},
{ID: "horseshoes_of_a_zephyr", Name: "Horseshoes of a Zephyr", Kind: MagicItemWondrous, Rarity: RarityVeryRare, Value: 2500, Desc: "These iron horseshoes come in a set of four."},
{ID: "horseshoes_of_speed", Name: "Horseshoes of Speed", Kind: MagicItemWondrous, Rarity: RarityRare, Value: 750, Desc: "These iron horseshoes come in a set of four."},
@@ -114,12 +114,12 @@ func buildSRDMagicItems() []MagicItem {
{ID: "iron_bands_of_binding", Name: "Iron Bands of Binding", Kind: MagicItemWondrous, Rarity: RarityRare, Value: 750, Desc: "This rusty iron sphere measures 3 inches in diameter and weighs 1 pound."},
{ID: "iron_flask", Name: "Iron Flask", Kind: MagicItemWondrous, Rarity: RarityLegendary, Value: 8000, Desc: "This iron bottle has a brass stopper."},
{ID: "javelin_of_lightning", Name: "Javelin of Lightning", Kind: MagicItemWeapon, Rarity: RarityUncommon, Slot: DnDSlotMainHand, Value: 150, Desc: "This javelin is a magic weapon."},
{ID: "lantern_of_revealing", Name: "Lantern of Revealing", Kind: MagicItemWondrous, Rarity: RarityUncommon, Value: 150, Desc: "While lit, this hooded lantern burns for 6 hours on 1 pint of oil, shedding bright light in a 30-foot radius and dim light for an additional 30 feet."},
{ID: "lantern_of_revealing", Name: "Lantern of Revealing", Kind: MagicItemWondrous, Rarity: RarityUncommon, Value: 150, Desc: "While lit, this hooded lantern burns for 6 hours on 1 pint of oil, shedding bright light in a and dim light for an additional."},
{ID: "luck_blade", Name: "Luck Blade", Kind: MagicItemWeapon, Rarity: RarityLegendary, Attunement: true, Slot: DnDSlotMainHand, Value: 8000, Desc: "You gain a +1 bonus to attack and damage rolls made with this magic weapon."},
{ID: "mace_of_disruption", Name: "Mace of Disruption", Kind: MagicItemWeapon, Rarity: RarityRare, Attunement: true, Slot: DnDSlotMainHand, Value: 750, Desc: "When you hit a fiend or an undead with this magic weapon, that creature takes an extra 2d6 radiant damage."},
{ID: "mace_of_smiting", Name: "Mace of Smiting", Kind: MagicItemWeapon, Rarity: RarityRare, Slot: DnDSlotMainHand, Value: 750, Desc: "You gain a +1 bonus to attack and damage rolls made with this magic weapon."},
{ID: "mace_of_terror", Name: "Mace of Terror", Kind: MagicItemWeapon, Rarity: RarityRare, Attunement: true, Slot: DnDSlotMainHand, Value: 750, Desc: "This magic weapon has 3 charges."},
{ID: "mantle_of_spell_resistance", Name: "Mantle of Spell Resistance", Kind: MagicItemWondrous, Rarity: RarityRare, Attunement: true, Slot: DnDSlotChest, Value: 750, Desc: "You have advantage on saving throws against spells while you wear this cloak."},
{ID: "mantle_of_spell_resistance", Name: "Mantle of Spell Resistance", Kind: MagicItemWondrous, Rarity: RarityRare, Attunement: true, Slot: DnDSlotChest, Value: 750, Desc: "You have advantage on against spells while you wear this cloak."},
{ID: "manual_of_bodily_health", Name: "Manual of Bodily Health", Kind: MagicItemWondrous, Rarity: RarityVeryRare, Value: 2500, Desc: "This book contains health and diet tips, and its words are charged with magic."},
{ID: "manual_of_gainful_exercise", Name: "Manual of Gainful Exercise", Kind: MagicItemWondrous, Rarity: RarityVeryRare, Value: 2500, Desc: "This book describes fitness exercises, and its words are charged with magic."},
{ID: "manual_of_golems", Name: "Manual of Golems", Kind: MagicItemWondrous, Rarity: RarityVeryRare, Value: 2500, Desc: "This tome contains information and incantations necessary to make a particular type of golem."},
@@ -128,7 +128,7 @@ func buildSRDMagicItems() []MagicItem {
{ID: "medallion_of_thoughts", Name: "Medallion of Thoughts", Kind: MagicItemWondrous, Rarity: RarityUncommon, Attunement: true, Slot: DnDSlotAmulet, Value: 150, Desc: "The medallion has 3 charges."},
{ID: "mirror_of_life_trapping", Name: "Mirror of Life Trapping", Kind: MagicItemWondrous, Rarity: RarityVeryRare, Value: 2500, Desc: "When this 4-foot-tall mirror is viewed indirectly, its surface shows faint images of creatures."},
{ID: "mithral_armor", Name: "Mithral Armor", Kind: MagicItemArmor, Rarity: RarityUncommon, Slot: DnDSlotChest, Value: 150, Desc: "Mithral is a light, flexible metal."},
{ID: "necklace_of_adaptation", Name: "Necklace of Adaptation", Kind: MagicItemWondrous, Rarity: RarityUncommon, Attunement: true, Slot: DnDSlotAmulet, Value: 150, Desc: "While wearing this necklace, you can breathe normally in any environment, and you have advantage on saving throws made against harmful gases and vapors (such as _cloudkill_ and _stinking cloud_ effect…"},
{ID: "necklace_of_adaptation", Name: "Necklace of Adaptation", Kind: MagicItemWondrous, Rarity: RarityUncommon, Attunement: true, Slot: DnDSlotAmulet, Value: 150, Desc: "While wearing this necklace, you can breathe normally in any environment, and you have advantage on made against harmful gases and vapors (such as _cloudkill_ and _stinking cloud_ effects, inhaled poi…"},
{ID: "necklace_of_fireballs", Name: "Necklace of Fireballs", Kind: MagicItemWondrous, Rarity: RarityRare, Slot: DnDSlotAmulet, Value: 750, Desc: "This necklace has 1d6 + 3 beads hanging from it."},
{ID: "necklace_of_prayer_beads", Name: "Necklace of Prayer Beads", Kind: MagicItemWondrous, Rarity: RarityRare, Attunement: true, Slot: DnDSlotAmulet, Value: 750, Desc: "This necklace has 1d4 + 2 magic beads made from aquamarine, black pearl, or topaz."},
{ID: "nine_lives_stealer", Name: "Nine Lives Stealer", Kind: MagicItemWeapon, Rarity: RarityVeryRare, Attunement: true, Slot: DnDSlotMainHand, Value: 2500, Desc: "You gain a +2 bonus to attack and damage rolls made with this magic weapon."},
@@ -137,7 +137,7 @@ func buildSRDMagicItems() []MagicItem {
{ID: "oil_of_sharpness", Name: "Oil of Sharpness", Kind: MagicItemPotion, Rarity: RarityVeryRare, Value: 2500, Desc: "This clear, gelatinous oil sparkles with tiny, ultrathin silver shards."},
{ID: "oil_of_slipperiness", Name: "Oil of Slipperiness", Kind: MagicItemPotion, Rarity: RarityUncommon, Value: 150, Desc: "This sticky black unguent is thick and heavy in the container, but it flows quickly when poured."},
{ID: "orb_of_dragonkind", Name: "Orb of Dragonkind", Kind: MagicItemWondrous, Rarity: RarityLegendary, Attunement: true, Value: 8000, Desc: "Ages past, elves and humans waged a terrible war against evil dragons."},
{ID: "pearl_of_power", Name: "Pearl of Power", Kind: MagicItemWondrous, Rarity: RarityUncommon, Attunement: true, Value: 150, Desc: "While this pearl is on your person, you can use an action to speak its command word and regain one expended spell slot."},
{ID: "pearl_of_power", Name: "Pearl of Power", Kind: MagicItemWondrous, Rarity: RarityUncommon, Attunement: true, Value: 150, Desc: "While this pearl is on your person, you can use an action to speak its command word and regain one expended."},
{ID: "periapt_of_health", Name: "Periapt of Health", Kind: MagicItemWondrous, Rarity: RarityUncommon, Slot: DnDSlotAmulet, Value: 150, Desc: "You are immune to contracting any disease while you wear this pendant."},
{ID: "periapt_of_proof_against_poison", Name: "Periapt of Proof against Poison", Kind: MagicItemWondrous, Rarity: RarityRare, Slot: DnDSlotAmulet, Value: 750, Desc: "This delicate silver chain has a brilliant-cut black gem pendant."},
{ID: "periapt_of_wound_closure", Name: "Periapt of Wound Closure", Kind: MagicItemWondrous, Rarity: RarityUncommon, Attunement: true, Slot: DnDSlotAmulet, Value: 150, Desc: "While you wear this pendant, you stabilize whenever you are dying at the start of your turn."},
@@ -146,7 +146,7 @@ func buildSRDMagicItems() []MagicItem {
{ID: "pipes_of_the_sewers", Name: "Pipes of the Sewers", Kind: MagicItemWondrous, Rarity: RarityUncommon, Attunement: true, Value: 150, Desc: "You must be proficient with wind instruments to use these pipes."},
{ID: "plate_armor_of_etherealness", Name: "Plate Armor of Etherealness", Kind: MagicItemArmor, Rarity: RarityLegendary, Attunement: true, Slot: DnDSlotChest, Value: 8000, Desc: "While you're wearing this armor, you can speak its command word as an action to gain the effect of the _etherealness_ spell, which last for 10 minutes or until you remove the armor or use an action to…"},
{ID: "portable_hole", Name: "Portable Hole", Kind: MagicItemWondrous, Rarity: RarityRare, Value: 750, Desc: "This fine black cloth, soft as silk, is folded up to the dimensions of a handkerchief."},
{ID: "potion_of_animal_friendship", Name: "Potion of Animal Friendship", Kind: MagicItemPotion, Rarity: RarityUncommon, Value: 150, Desc: "When you drink this potion, you can cast the _animal friendship_ spell (save DC 13) for 1 hour at will."},
{ID: "potion_of_animal_friendship", Name: "Potion of Animal Friendship", Kind: MagicItemPotion, Rarity: RarityUncommon, Value: 150, Desc: "When you drink this potion, you can cast the _animal friendship_ spell for 1 hour at will."},
{ID: "potion_of_clairvoyance", Name: "Potion of Clairvoyance", Kind: MagicItemPotion, Rarity: RarityRare, Value: 750, Desc: "When you drink this potion, you gain the effect of the _clairvoyance_ spell."},
{ID: "potion_of_climbing", Name: "Potion of Climbing", Kind: MagicItemPotion, Rarity: RarityCommon, Value: 50, Desc: "When you drink this potion, you gain a climbing speed equal to your walking speed for 1 hour."},
{ID: "potion_of_diminution", Name: "Potion of Diminution", Kind: MagicItemPotion, Rarity: RarityRare, Value: 750, Desc: "When you drink this potion, you gain the \"reduce\" effect of the _enlarge/reduce_ spell for 1d4 hours (no concentration required)."},
@@ -157,7 +157,7 @@ func buildSRDMagicItems() []MagicItem {
{ID: "potion_of_healing", Name: "Potion of Healing", Kind: MagicItemPotion, Rarity: RarityCommon, Value: 50, Desc: "You regain hit points when you drink this potion."},
{ID: "potion_of_heroism", Name: "Potion of Heroism", Kind: MagicItemPotion, Rarity: RarityRare, Value: 750, Desc: "For 1 hour after drinking it, you gain 10 temporary hit points that last for 1 hour."},
{ID: "potion_of_invisibility", Name: "Potion of Invisibility", Kind: MagicItemPotion, Rarity: RarityVeryRare, Value: 2500, Desc: "This potion's container looks empty but feels as though it holds liquid."},
{ID: "potion_of_mind_reading", Name: "Potion of Mind Reading", Kind: MagicItemPotion, Rarity: RarityRare, Value: 750, Desc: "When you drink this potion, you gain the effect of the _detect thoughts_ spell (save DC 13)."},
{ID: "potion_of_mind_reading", Name: "Potion of Mind Reading", Kind: MagicItemPotion, Rarity: RarityRare, Value: 750, Desc: "When you drink this potion, you gain the effect of the _detect thoughts_ spell."},
{ID: "potion_of_poison", Name: "Potion of Poison", Kind: MagicItemPotion, Rarity: RarityUncommon, Value: 150, Desc: "This concoction looks, smells, and tastes like a _potion of healing_ or other beneficial potion."},
{ID: "potion_of_resistance", Name: "Potion of Resistance", Kind: MagicItemPotion, Rarity: RarityUncommon, Value: 150, Desc: "When you drink this potion, you gain resistance to one type of damage for 1 hour."},
{ID: "potion_of_speed", Name: "Potion of Speed", Kind: MagicItemPotion, Rarity: RarityVeryRare, Value: 2500, Desc: "When you drink this potion, you gain the effect of the _haste_ spell for 1 minute (no concentration required)."},
@@ -167,22 +167,22 @@ func buildSRDMagicItems() []MagicItem {
{ID: "ring_of_djinni_summoning", Name: "Ring of Djinni Summoning", Kind: MagicItemRing, Rarity: RarityLegendary, Attunement: true, Slot: DnDSlotRing1, Value: 8000, Desc: "While wearing this ring, you can speak its command word as an action to summon a particular djinni from the Elemental Plane of Air."},
{ID: "ring_of_elemental_command", Name: "Ring of Elemental Command", Kind: MagicItemRing, Rarity: RarityLegendary, Attunement: true, Slot: DnDSlotRing1, Value: 8000, Desc: "This ring is linked to one of the four Elemental Planes."},
{ID: "ring_of_evasion", Name: "Ring of Evasion", Kind: MagicItemRing, Rarity: RarityRare, Attunement: true, Slot: DnDSlotRing1, Value: 750, Desc: "This ring has 3 charges, and it regains 1d3 expended charges daily at dawn."},
{ID: "ring_of_feather_falling", Name: "Ring of Feather Falling", Kind: MagicItemRing, Rarity: RarityRare, Attunement: true, Slot: DnDSlotRing1, Value: 750, Desc: "When you fall while wearing this ring, you descend 60 feet per round and take no damage from falling."},
{ID: "ring_of_feather_falling", Name: "Ring of Feather Falling", Kind: MagicItemRing, Rarity: RarityRare, Attunement: true, Slot: DnDSlotRing1, Value: 750, Desc: "When you fall while wearing this ring, you descend per round and take no damage from falling."},
{ID: "ring_of_free_action", Name: "Ring of Free Action", Kind: MagicItemRing, Rarity: RarityRare, Attunement: true, Slot: DnDSlotRing1, Value: 750, Desc: "While you wear this ring, difficult terrain doesn't cost you extra movement."},
{ID: "ring_of_invisibility", Name: "Ring of Invisibility", Kind: MagicItemRing, Rarity: RarityLegendary, Attunement: true, Slot: DnDSlotRing1, Value: 8000, Desc: "While wearing this ring, you can turn invisible as an action."},
{ID: "ring_of_jumping", Name: "Ring of Jumping", Kind: MagicItemRing, Rarity: RarityUncommon, Attunement: true, Slot: DnDSlotRing1, Value: 150, Desc: "While wearing this ring, you can cast the _jump_ spell from it as a bonus action at will, but can target only yourself when you do so."},
{ID: "ring_of_mind_shielding", Name: "Ring of Mind Shielding", Kind: MagicItemRing, Rarity: RarityUncommon, Attunement: true, Slot: DnDSlotRing1, Value: 150, Desc: "While wearing this ring, you are immune to magic that allows other creatures to read your thoughts, determine whether you are lying, know your alignment, or know your creature type."},
{ID: "ring_of_protection", Name: "Ring of Protection", Kind: MagicItemRing, Rarity: RarityRare, Attunement: true, Slot: DnDSlotRing1, Value: 750, Desc: "You gain a +1 bonus to AC and saving throws while wearing this ring."},
{ID: "ring_of_regeneration", Name: "Ring of Regeneration", Kind: MagicItemRing, Rarity: RarityVeryRare, Attunement: true, Slot: DnDSlotRing1, Value: 2500, Desc: "While wearing this ring, you regain 1d6 hit points every 10 minutes, provided that you have at least 1 hit point."},
{ID: "ring_of_resistance", Name: "Ring of Resistance", Kind: MagicItemRing, Rarity: RarityRare, Attunement: true, Slot: DnDSlotRing1, Value: 750, Desc: "You have resistance to one damage type while wearing this ring."},
{ID: "ring_of_protection", Name: "Ring of Protection", Kind: MagicItemRing, Rarity: RarityRare, Attunement: true, Slot: DnDSlotRing1, Value: 750, Desc: "A plain ring. Quietly turns aside blows you'd otherwise take. Refuses to explain how."},
{ID: "ring_of_regeneration", Name: "Ring of Regeneration", Kind: MagicItemRing, Rarity: RarityVeryRare, Attunement: true, Slot: DnDSlotRing1, Value: 2500, Desc: "Wounds knit themselves back together while you wear it. Slowly. Smugly."},
{ID: "ring_of_resistance", Name: "Ring of Resistance", Kind: MagicItemRing, Rarity: RarityRare, Attunement: true, Slot: DnDSlotRing1, Value: 750, Desc: "Wards off one kind of harm — fire, frost, lightning, poison, or another flavour of bad day."},
{ID: "ring_of_shooting_stars", Name: "Ring of Shooting Stars", Kind: MagicItemRing, Rarity: RarityVeryRare, Attunement: true, Slot: DnDSlotRing1, Value: 2500, Desc: "While wearing this ring in dim light or darkness, you can cast _dancing lights_ and _light_ from the ring at will."},
{ID: "ring_of_spell_storing", Name: "Ring of Spell Storing", Kind: MagicItemRing, Rarity: RarityRare, Attunement: true, Slot: DnDSlotRing1, Value: 750, Desc: "This ring stores spells cast into it, holding them until the attuned wearer uses them."},
{ID: "ring_of_spell_turning", Name: "Ring of Spell Turning", Kind: MagicItemRing, Rarity: RarityLegendary, Attunement: true, Slot: DnDSlotRing1, Value: 8000, Desc: "While wearing this ring, you have advantage on saving throws against any spell that targets only you (not in an area of effect)."},
{ID: "ring_of_swimming", Name: "Ring of Swimming", Kind: MagicItemRing, Rarity: RarityUncommon, Slot: DnDSlotRing1, Value: 150, Desc: "You have a swimming speed of 40 feet while wearing this ring."},
{ID: "ring_of_spell_turning", Name: "Ring of Spell Turning", Kind: MagicItemRing, Rarity: RarityLegendary, Attunement: true, Slot: DnDSlotRing1, Value: 8000, Desc: "While wearing this ring, you have advantage on against any spell that targets only you (not in an area of effect)."},
{ID: "ring_of_swimming", Name: "Ring of Swimming", Kind: MagicItemRing, Rarity: RarityUncommon, Slot: DnDSlotRing1, Value: 150, Desc: "Slip through water faster than any swimmer should. Dolphins file complaints."},
{ID: "ring_of_telekinesis", Name: "Ring of Telekinesis", Kind: MagicItemRing, Rarity: RarityVeryRare, Attunement: true, Slot: DnDSlotRing1, Value: 2500, Desc: "While wearing this ring, you can cast the _telekinesis_ spell at will, but you can target only objects that aren't being worn or carried."},
{ID: "ring_of_the_ram", Name: "Ring of the Ram", Kind: MagicItemRing, Rarity: RarityRare, Attunement: true, Slot: DnDSlotRing1, Value: 750, Desc: "This ring has 3 charges, and it regains 1d3 expended charges daily at dawn."},
{ID: "ring_of_three_wishes", Name: "Ring of Three Wishes", Kind: MagicItemRing, Rarity: RarityLegendary, Slot: DnDSlotRing1, Value: 8000, Desc: "While wearing this ring, you can use an action to expend 1 of its 3 charges to cast the _wish_ spell from it."},
{ID: "ring_of_warmth", Name: "Ring of Warmth", Kind: MagicItemRing, Rarity: RarityUncommon, Attunement: true, Slot: DnDSlotRing1, Value: 150, Desc: "While wearing this ring, you have resistance to cold damage."},
{ID: "ring_of_warmth", Name: "Ring of Warmth", Kind: MagicItemRing, Rarity: RarityUncommon, Attunement: true, Slot: DnDSlotRing1, Value: 150, Desc: "Cold weather no longer applies to you. Chill damage softens; you become unbearable in winter."},
{ID: "ring_of_water_walking", Name: "Ring of Water Walking", Kind: MagicItemRing, Rarity: RarityUncommon, Slot: DnDSlotRing1, Value: 150, Desc: "While wearing this ring, you can stand on and move across any liquid surface as if it were solid ground."},
{ID: "ring_of_x_ray_vision", Name: "Ring of X-ray Vision", Kind: MagicItemRing, Rarity: RarityRare, Attunement: true, Slot: DnDSlotRing1, Value: 750, Desc: "While wearing this ring, you can use an action to speak its command word."},
{ID: "robe_of_eyes", Name: "Robe of Eyes", Kind: MagicItemWondrous, Rarity: RarityRare, Attunement: true, Slot: DnDSlotChest, Value: 750, Desc: "This robe is adorned with eyelike patterns."},
@@ -193,17 +193,17 @@ func buildSRDMagicItems() []MagicItem {
{ID: "rod_of_absorption", Name: "Rod of Absorption", Kind: MagicItemRod, Rarity: RarityVeryRare, Attunement: true, Slot: DnDSlotOffHand, Value: 2500, Desc: "While holding this rod, you can use your reaction to absorb a spell that is targeting only you and not with an area of effect."},
{ID: "rod_of_alertness", Name: "Rod of Alertness", Kind: MagicItemRod, Rarity: RarityVeryRare, Attunement: true, Slot: DnDSlotOffHand, Value: 2500, Desc: "This rod has a flanged head and the following properties."},
{ID: "rod_of_lordly_might", Name: "Rod of Lordly Might", Kind: MagicItemRod, Rarity: RarityLegendary, Attunement: true, Slot: DnDSlotOffHand, Value: 8000, Desc: "This rod has a flanged head, and it functions as a magic mace that grants a +3 bonus to attack and damage rolls made with it."},
{ID: "rod_of_rulership", Name: "Rod of Rulership", Kind: MagicItemRod, Rarity: RarityRare, Attunement: true, Slot: DnDSlotOffHand, Value: 750, Desc: "You can use an action to present the rod and command obedience from each creature of your choice that you can see within 120 feet of you."},
{ID: "rod_of_rulership", Name: "Rod of Rulership", Kind: MagicItemRod, Rarity: RarityRare, Attunement: true, Slot: DnDSlotOffHand, Value: 750, Desc: "You can use an action to present the rod and command obedience from each creature of your choice that you can seeou."},
{ID: "rod_of_security", Name: "Rod of Security", Kind: MagicItemRod, Rarity: RarityVeryRare, Slot: DnDSlotOffHand, Value: 2500, Desc: "While holding this rod, you can use an action to activate it."},
{ID: "rope_of_climbing", Name: "Rope of Climbing", Kind: MagicItemWondrous, Rarity: RarityUncommon, Value: 150, Desc: "This 60-foot length of silk rope weighs 3 pounds and can hold up to 3,000 pounds."},
{ID: "rope_of_entanglement", Name: "Rope of Entanglement", Kind: MagicItemWondrous, Rarity: RarityRare, Value: 750, Desc: "This rope is 30 feet long and weighs 3 pounds."},
{ID: "rope_of_entanglement", Name: "Rope of Entanglement", Kind: MagicItemWondrous, Rarity: RarityRare, Value: 750, Desc: "This rope is long and weighs 3 pounds."},
{ID: "scarab_of_protection", Name: "Scarab of Protection", Kind: MagicItemWondrous, Rarity: RarityLegendary, Attunement: true, Value: 8000, Desc: "If you hold this beetle-shaped medallion in your hand for 1 round, an inscription appears on its surface revealing its magical nature."},
{ID: "scimitar_of_speed", Name: "Scimitar of Speed", Kind: MagicItemWeapon, Rarity: RarityVeryRare, Attunement: true, Slot: DnDSlotMainHand, Value: 2500, Desc: "You gain a +2 bonus to attack and damage rolls made with this magic weapon."},
{ID: "shield_of_missile_attraction", Name: "Shield of Missile Attraction", Kind: MagicItemArmor, Rarity: RarityRare, Attunement: true, Slot: DnDSlotChest, Value: 750, Desc: "While holding this shield, you have resistance to damage from ranged weapon attacks."},
{ID: "slippers_of_spider_climbing", Name: "Slippers of Spider Climbing", Kind: MagicItemWondrous, Rarity: RarityUncommon, Attunement: true, Slot: DnDSlotFeet, Value: 150, Desc: "While you wear these light shoes, you can move up, down, and across vertical surfaces and upside down along ceilings, while leaving your hands free."},
{ID: "slippers_of_spider_climbing", Name: "Slippers of Spider Climbing", Kind: MagicItemWondrous, Rarity: RarityUncommon, Attunement: true, Slot: DnDSlotFeet, Value: 150, Desc: "Walk up walls and across ceilings as if the floor were merely a suggestion."},
{ID: "sovereign_glue", Name: "Sovereign Glue", Kind: MagicItemWondrous, Rarity: RarityLegendary, Value: 8000, Desc: "This viscous, milky-white substance can form a permanent adhesive bond between any two objects."},
{ID: "spell_scroll", Name: "Spell Scroll", Kind: MagicItemScroll, Rarity: RarityCommon, Value: 50, Desc: "A _spell scroll_ bears the words of a single spell, written in a mystical cipher."},
{ID: "spellguard_shield", Name: "Spellguard Shield", Kind: MagicItemArmor, Rarity: RarityVeryRare, Attunement: true, Slot: DnDSlotChest, Value: 2500, Desc: "While holding this shield, you have advantage on saving throws against spells and other magical effects, and spell attacks have disadvantage against you."},
{ID: "spellguard_shield", Name: "Spellguard Shield", Kind: MagicItemArmor, Rarity: RarityVeryRare, Attunement: true, Slot: DnDSlotChest, Value: 2500, Desc: "While holding this shield, you have advantage on against spells and other magical effects, and spell attacks have disadvantage against you."},
{ID: "sphere_of_annihilation", Name: "Sphere of Annihilation", Kind: MagicItemWondrous, Rarity: RarityLegendary, Value: 8000, Desc: "This 2-foot-diameter black sphere is a hole in the multiverse, hovering in space and stabilized by a magical field surrounding it."},
{ID: "staff_of_charming", Name: "Staff of Charming", Kind: MagicItemStaff, Rarity: RarityRare, Attunement: true, Slot: DnDSlotMainHand, Value: 750, Desc: "While holding this staff, you can use an action to expend 1 of its 10 charges to cast _charm person_, _command_, _or comprehend languages_ from it using your spell save DC."},
{ID: "staff_of_fire", Name: "Staff of Fire", Kind: MagicItemStaff, Rarity: RarityVeryRare, Attunement: true, Slot: DnDSlotMainHand, Value: 2500, Desc: "You have resistance to fire damage while you hold this staff."},
@@ -213,12 +213,12 @@ func buildSRDMagicItems() []MagicItem {
{ID: "staff_of_striking", Name: "Staff of Striking", Kind: MagicItemStaff, Rarity: RarityVeryRare, Attunement: true, Slot: DnDSlotMainHand, Value: 2500, Desc: "This staff can be wielded as a magic quarterstaff that grants a +3 bonus to attack and damage rolls made with it."},
{ID: "staff_of_swarming_insects", Name: "Staff of Swarming Insects", Kind: MagicItemStaff, Rarity: RarityVeryRare, Attunement: true, Slot: DnDSlotMainHand, Value: 2500, Desc: "This staff has 10 charges and regains 1d6 + 4 expended charges daily at dawn."},
{ID: "staff_of_the_magi", Name: "Staff of the Magi", Kind: MagicItemStaff, Rarity: RarityLegendary, Attunement: true, Slot: DnDSlotMainHand, Value: 8000, Desc: "This staff can be wielded as a magic quarterstaff that grants a +2 bonus to attack and damage rolls made with it."},
{ID: "staff_of_the_python", Name: "Staff of the Python", Kind: MagicItemStaff, Rarity: RarityVeryRare, Attunement: true, Slot: DnDSlotMainHand, Value: 2500, Desc: "You can use an action to speak this staff's command word and throw the staff on the ground within 10 feet of you."},
{ID: "staff_of_the_python", Name: "Staff of the Python", Kind: MagicItemStaff, Rarity: RarityVeryRare, Attunement: true, Slot: DnDSlotMainHand, Value: 2500, Desc: "You can use an action to speak this staff's command word and throw the staff on the groundou."},
{ID: "staff_of_the_woodlands", Name: "Staff of the Woodlands", Kind: MagicItemStaff, Rarity: RarityRare, Attunement: true, Slot: DnDSlotMainHand, Value: 750, Desc: "This staff can be wielded as a magic quarterstaff that grants a +2 bonus to attack and damage rolls made with it."},
{ID: "staff_of_thunder_and_lightning", Name: "Staff of Thunder and Lightning", Kind: MagicItemStaff, Rarity: RarityVeryRare, Attunement: true, Slot: DnDSlotMainHand, Value: 2500, Desc: "This staff can be wielded as a magic quarterstaff that grants a +2 bonus to attack and damage rolls made with it."},
{ID: "staff_of_withering", Name: "Staff of Withering", Kind: MagicItemStaff, Rarity: RarityRare, Attunement: true, Slot: DnDSlotMainHand, Value: 750, Desc: "This staff has 3 charges and regains 1d3 expended charges daily at dawn."},
{ID: "stone_of_controlling_earth_elementals", Name: "Stone of Controlling Earth Elementals", Kind: MagicItemWondrous, Rarity: RarityRare, Value: 750, Desc: "If the stone is touching the ground, you can use an action to speak its command word and summon an earth elemental, as if you had cast the _conjure elemental_ spell."},
{ID: "stone_of_good_luck_luckstone", Name: "Stone of Good Luck (Luckstone)", Kind: MagicItemWondrous, Rarity: RarityUncommon, Attunement: true, Value: 150, Desc: "While this polished agate is on your person, you gain a +1 bonus to ability checks and saving throws."},
{ID: "stone_of_good_luck_luckstone", Name: "Stone of Good Luck", Kind: MagicItemWondrous, Rarity: RarityUncommon, Attunement: true, Value: 150, Desc: "While this polished agate is on your person, you gain a +1 bonus to ability checks."},
{ID: "sun_blade", Name: "Sun Blade", Kind: MagicItemWeapon, Rarity: RarityRare, Attunement: true, Slot: DnDSlotMainHand, Value: 750, Desc: "This item appears to be a longsword hilt."},
{ID: "sword_of_life_stealing", Name: "Sword of Life Stealing", Kind: MagicItemWeapon, Rarity: RarityRare, Attunement: true, Slot: DnDSlotMainHand, Value: 750, Desc: "When you attack a creature with this magic weapon and roll a 20 on the attack roll, that target takes an extra 3d6 necrotic damage, provided that the target isn't a construct or an undead."},
{ID: "sword_of_sharpness", Name: "Sword of Sharpness", Kind: MagicItemWeapon, Rarity: RarityVeryRare, Attunement: true, Slot: DnDSlotMainHand, Value: 2500, Desc: "When you attack an object with this magic sword and hit, maximize your weapon damage dice against the target."},
@@ -248,7 +248,7 @@ func buildSRDMagicItems() []MagicItem {
{ID: "wand_of_wonder", Name: "Wand of Wonder", Kind: MagicItemWand, Rarity: RarityRare, Attunement: true, Slot: DnDSlotOffHand, Value: 750, Desc: "This wand has 7 charges."},
{ID: "weapon_1_2_or_3", Name: "Weapon, +1, +2, or +3", Kind: MagicItemWeapon, Rarity: RarityCommon, Slot: DnDSlotMainHand, Value: 50, Desc: "You have a bonus to attack and damage rolls made with this magic weapon."},
{ID: "well_of_many_worlds", Name: "Well of Many Worlds", Kind: MagicItemWondrous, Rarity: RarityLegendary, Value: 8000, Desc: "This fine black cloth, soft as silk, is folded up to the dimensions of a handkerchief."},
{ID: "wind_fan", Name: "Wind Fan", Kind: MagicItemWondrous, Rarity: RarityUncommon, Value: 150, Desc: "While holding this fan, you can use an action to cast the _gust of wind_ spell (save DC 13) from it."},
{ID: "wind_fan", Name: "Wind Fan", Kind: MagicItemWondrous, Rarity: RarityUncommon, Value: 150, Desc: "While holding this fan, you can use an action to cast the _gust of wind_ spell from it."},
{ID: "winged_boots", Name: "Winged Boots", Kind: MagicItemWondrous, Rarity: RarityUncommon, Attunement: true, Slot: DnDSlotFeet, Value: 150, Desc: "While you wear these boots, you have a flying speed equal to your walking speed."},
{ID: "wings_of_flying", Name: "Wings of Flying", Kind: MagicItemWondrous, Rarity: RarityRare, Attunement: true, Value: 750, Desc: "While wearing this cloak, you can use an action to speak its command word."},
}