Shoppe Keepers and Vehicles Update! November 2020

The previous update which focused on engine optimization and the introduction of the Blacksmith shoppe keeper was back in June. Life has threw me some curveballs since but I have finally managed to complete all remaining shoppe keepers and introduced the common vehicles including Magic Carpets and Ships.

Shoppe Keepers

These shoppe keepers are comprised of:

  • Bar Keepers
  • Inn Keepers
  • Guild Masters
  • Healers
  • Apothecaries
  • Horse Sellers
  • Shipwrights
  • Blacksmiths (already implemented)

The shoppe keepers all use a common interface originally seen in the Blacksmith update. There is an emphasis on retaining the original charm from the smack talking shoppe keepers while improving and streamlining the shoppe experience. For example, it is VERY easy to miss the gossip option in Taverns if you are just quickly picking up rations and leaving. In the updated Bar Keeper interface, the gossip option is easily seen and will save many players hours of frustration by giving hints for a small fee.

I also opted to allow you to try to buy items and services if you don’t have the money. Most modern games would simply grey it out – but I just love the smarmy responses (or violent response if you try to stiff the Inn Keeper!).


The classes Ultima V vehicles were added as well. This was a hard requirement since you will visit the Shipwright and Horse Seller and expect to actually receive the thing you bought. The vehicles include:

  • Frigates
  • Skiffs
  • Magic Carpets
  • Horses

The Details

This update was very grueling! It seemed that everytime I had to introduce the next shoppe keeper a new challenge would present itself. For example, when implementing the Shipwright and Horse Seller I had to completely overhaul the underlying sprite handling system. I scoured the previous reverse engineering of the save state to understand how to determine if the party had boarded a vehicle. It wasn’t fully documented, but as always the previous researchers provided invaluable hints. The super cool news is that the same sprite systems that are used for riding magic carpets etc is also used to display “odd” sprites such as the bats in the tower in Skara Brae – something that had been on my list for a while.

It was also an opportunity to begin to describe the monsters as they would appear in the overworld.

It has lead to me some interesting bonus feature ideas such as a travelling merchants in the overworld (there are no NPCs in the overworld currently). Just ideas for now, but lots of cool opportunities in the future.

Continuing Challenges

I did what no one is supposed to do, I chose a very large project as my first Unity/Game project. As a result I have been “learning on the job” and creating some pretty crummy early interfaces and code. You will see UI improvements with the shoppe keeper update such as the “player selector”. There continues to be a lot of previous work such as the ‘U’se item UI which is a bit rough around the edges and doesn’t even support mouse input. It’s not really a problem, just notable.

Around The Corner

I have had a few people ask for up to date demos. In the next few days I will release Windows, MacOS and Linux pre-alpha builds for testing and experimenting.

What’s Next?

As mentioned in the video, I will:

  • Spit and polish the UI and graphics
  • Add line of sight (attempt #3)
  • Either “monster stuff” or dungeons

The spit and polish involves updating some old UI elements to be keyboard+mouse capable and just provide a more consistent overall experience. I also believe there is a long way to go on the graphical fidelity and tuning. I have a long list that I maintain of things I could do better that I hope to tackle.

I will AGAIN try to add line of sight – it just never makes it high on my list and I am seriously worried about screwing it up – but it’s long overdue.

Lastly, I am desperately keen to move onto some “very different” from the stuff I’ve been working on so I hope to begin to tackle either some combat elements or dungeons. I will just see what side of the bed I wake up on.

Published by Brad Hannah

Cloud Engineer by day, pretend game developer by night!

2 thoughts on “Shoppe Keepers and Vehicles Update! November 2020

  1. Looking very nice! Watched the video, everything is looking more polished. I like the choice not to grey out unavailable options, but rather leave room for snarky remarks from the shopkeepers. Maybe some room to randomize/vary those responses eventually? I know in Ultima IV, every shopkeeper is basically a clone, so I am assuming Ultima V is the same.
    I noticed that there are two points of interface, I think. Like, you can click on the horse, as a button, or the ‘Buy’ or ‘Goodbye’ button. That is a little different from the original as well, no?

    Liked by 1 person

    1. Great to hear from you as always Cambragol!

      Each shoppe keeper is largely a clone of the other in the same class – however they do very often have 2 or more response options. You can see all the responses that involve variable replacement here: I simply randomize the response, so there is quite a bit of variety. A few examples have very specific responses such as Bar Keepers responding with the type of food they serve.

      As for the second point, there is some confusion there for sure. The “Buy” button is intended to indicate you are on the “Buy” page. When you are talking with the blacksmith you will see a “Buy” and “Sell” button. Perhaps the “Buy” button does not serve much purpose if there is only the single option. I will mull that one over, it may save some confusion.


Leave a Reply

Fill in your details below or click an icon to log in: Logo

You are commenting using your account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

Create your website at
Get started
%d bloggers like this: