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.
This commit is contained in:
Robert Dickey 2026-09-10 01:07:32 -05:00 • committed by GitHub
parent 2d38ed7c6a
commit 865a8cf218
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 8 additions and 0 deletions

View file

@ -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; }

View file

@ -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()