From 865a8cf2185829042f20b51e06523172caa2d378 Mon Sep 17 00:00:00 2001 From: Robert Dickey Date: Thu, 10 Sep 2026 01:07:32 -0500 Subject: [PATCH] fix: sell Bushido and Ninjitsu books through Tokuno scribes (#2622) Tokuno scribes currently load only `SBScribe`, so the existing Zento scribe does not offer the Book of Bushido or Book of Ninjitsu. Add the existing `SBSamurai` and `SBNinja` inventories when `Core.SE && IsTokunoVendor`. This reuses the existing book prices and default stock quantities. It does not change NPC placement, trainer behavior, or inventories outside Tokuno. ### Sources and reasoning - The [official UO Ninjitsu guide](https://uo.com/wiki/ultima-online-wiki/skills/ninjitsu/) identifies the scribe at Rokuon Cultural Center in Zento as a seller of the Book of Ninjitsu. - [UOGuide: Bushido](https://www.uoguide.com/Bushido), documenting standard UO, explicitly lists Tokuno Islands scribe NPCs as a source for the Book of Bushido. This supports adding both book inventories to Tokuno scribes. - Documentation distinction: the [official UO Bushido guide](https://uo.com/wiki/ultima-online-wiki/skills/bushido/) describes the Zento seller as a samurai trainer, rather than a scribe. The Bushido scribe change follows the explicit UOGuide description. These references do not independently establish the exact historical introduction date or original prices. ### Validation - Built the change in a customized ModernUO 0.15.6.145 deployment: Release, linux-x64, zero warnings or errors. - In-game with Mondain's Legacy enabled: both books appeared on the existing Zento scribe, and a player successfully purchased both. - Reviewed the expansion/location guard for pre-SE and non-Tokuno behavior; those cases were not gameplay-tested. This exact patch has not been built against current upstream main. --- Projects/UOContent/Mobiles/Vendors/BaseVendor.cs | 2 ++ Projects/UOContent/Mobiles/Vendors/NPC/Scribe.cs | 6 ++++++ 2 files changed, 8 insertions(+) diff --git a/Projects/UOContent/Mobiles/Vendors/BaseVendor.cs b/Projects/UOContent/Mobiles/Vendors/BaseVendor.cs index 178186ee0..a6467746b 100644 --- a/Projects/UOContent/Mobiles/Vendors/BaseVendor.cs +++ b/Projects/UOContent/Mobiles/Vendors/BaseVendor.cs @@ -121,6 +121,8 @@ namespace Server.Mobiles public virtual bool IsTokunoVendor => Map == Map.Tokuno; + public virtual bool IsTerMurVendor => Map == Map.TerMur; + public virtual VendorShoeType ShoeType => VendorShoeType.Shoes; public DateTime LastRestock { get; set; } diff --git a/Projects/UOContent/Mobiles/Vendors/NPC/Scribe.cs b/Projects/UOContent/Mobiles/Vendors/NPC/Scribe.cs index 0c072141c..27430a302 100644 --- a/Projects/UOContent/Mobiles/Vendors/NPC/Scribe.cs +++ b/Projects/UOContent/Mobiles/Vendors/NPC/Scribe.cs @@ -29,6 +29,12 @@ namespace Server.Mobiles public override void InitSBInfo() { m_SBInfos.Add(new SBScribe()); + + if (Core.SE && IsTokunoVendor || Core.SA && IsTerMurVendor) + { + m_SBInfos.Add(new SBSamurai()); + m_SBInfos.Add(new SBNinja()); + } } public override void InitOutfit()