
Oh hai there! I know it’s been a hot minute since I have said any.. almost 2.5 years in fact! Life has been lifing and keeping me very busy – but I have been quietly working in the shadows. For those who don’t see my posts for the Ultima Dragons on Facebook – I will fill you in.
I have been building Ultima V Redux with the Unity engine since it’s inception. That means using C# and ultimately building in a 3D game world. Focus was put on the 3D aesthetic and enhanced UI controls. As I move forward I have shifted to a more bare bones game engine called Ebitengine (https://ebitengine.org/) based on the Go programming language. This a primarily 2D engine – but is far easier and less complicated to work with.
Over the past 9 months, I have somewhat quietly been redeveloping the core components in Ebitengine. I am still far from complete, and do not have as much functionality as I left off with my Unity project – but the development is much faster because many of the difficult details of “how Ultima V works under the hood” have already been solved. For example I spent close a month in my spare time getting the conversation engine up and running originally – but only ~8 hours so far for almost the same result.

So what is done so far?
A few things – but lots to go of course! A heavy focus on basic world and basic functionality have been the focus. I am largely following the same order I implemented with the my first attempt.

- Core gameplay loop and movement
- Lighting fully functional – with expanded screen size (16:9)
- Title screen fully animated
- Basic save game loading from “original save files”
- Enemy generation
- Overworld/underworld and “small maps” fully traversable
- Friendly NPCs generating and following all schedules
- Overworld monsters automatically generating (no combat yet)
- Boardable carpets, ships, frigates and skiffs
- Basic commands – Look, Klimb, Open, Jimmy, Push, Board, X-it, Get
- Quit/Escape menu basics plumbed
- Text based Debug console with autocomplete for quicker access to debug functionality
What you see is a essentially something that begins to resemble a game – but isn’t yet a game. You can move around the world, see the world moving without too much concern for you yet.

So what’s next?
I have my eyes set on what I call the core functions that still remain, these include –
- NPC conversations (reading conversation data is done – now to plumb to UI – 50% done) (Talk)
- World tile and time passage effects – ie. poison over time, lava injuries, falling down grates
- Inventory UI – both Use and view
- Z-Stats – show party details
- Looking at signs in the game world
- Shoppe Keepers – purchase goods from them
Much of these are UI based – which is admittedly one of the more difficult components in the new game engine – so doing them one after another is likely smart so that I can avoid ‘re-learning’ everytime I build one.
Conclusion
So, I ask you to be patient as I continue to try and sneak in development time in my spare time. I know I have been working on this for years – but visions change over time – and mine certainly has.
Bonus Section – Why Brad!?! Why!?!
I know many folks may feel like this is a step backwards – I hope to help you understand my thinking. You may disagree – but guess what!? I had a ton of people disagree about my 3D approach too, so I suppose I can’t please everyone 🙂
The Unity Complexity Problem
Here is what happened… I wanted to build a remake of Ultima V, I wanted that remake to be in a voxelated 3D world. I also wanted to separate game logic from the Unity engine itself – this resulted in two different source code repositories – one for game logic, and the other for the Unity presentation. On the surface this was a good idea – folks would be theoretically be able to pick up the game logic package and build on it without the Unity component.
HOWEVER this created never ending list of technical challenges. Trying to synchronize the result generated from one – into the other was difficult. I did succeed – it did work – but everytime some went funny, or didn’t work as expected, the troubleshooting was extremely tricky. It got to the point where I was actively avoiding certain efforts because I knew the troubleshooting would be so damn tricky.
The 3D Problem
Given that 3D was one of the main factors for starting this project – it does feel like a shame that it constantly got in the way of a good time.
A 3D game that knows it’s 3D is less difficult in some ways than what I was doing. I was faking out a 2D environment in a 3D space. I had a world where the Avatar would be on top of grass, which in the OG U5 would have just been a black box around the Avatar.

Now layer on lighting levels, shadows and perspectives and thing got a lot trickier. I had an entire system that I build just to account for the layering and the micro-adjustments of different models to make sure they stacked on top of each other correctly.
Similar to the complexity problem previously discussed – I had it largely working – but it was finicky and I loathed troubleshooting it. It took me away from the game world and game logic itself.

The “I want it to work without maintenance for a long time” Problem
Unity is an ever changing beast – it is large with frequent updates and support windows for each major release. Everytime a new version would come out I would try an upgrade. Sometimes it would break stuff and I would spend hours troubleshooting – sometimes a bug would present itself in a month or two.
If you look at the other popular Ultima remakes like Exult and Nuvie you will see they use SDL as a base. What does this mean? It means they use a more bare bones library which is likely to live for a very long time. This translates very little additional work required to be done to maintain compatibility in the future. I always worried that I would built something cool – and then in 2 or 3 years it would no longer function on modern OSes for one reason or another. This may be incorrect or naive – but I know the process for upgrading to a newer Unity version was too risky for long term running of the software.
So… I didn’t want to use SDL, because I didn’t want to write C++ – I wanted to write something simpler and something I was passionate about. So I chose Ebitengine and GoLang. Go is a popular compiled language that can compile for any of the major OSes, and Ebitengine is so bare bones that I feel confident that it will keep living for a very long time.
Bonus Conclusion
So… In short – I wanted a simpler engine, to build a simpler game world. The complexity of Unity and 3D world were getting in the way of the core game experience, so I made the difficult decision to reset. There is no going back now 😉









































