So recently I’ve had the ‘itch’ once again to dive into custom content creation for Ultima III: Exodus. While I know there are small few people waiting for the remaining Ultimore adventures from Joel to be adapted I decided instead that I wanted to break into new territory using the knowledge we had gained from converting A World Divided and Egypt.

So the other week I went live on Twitch and streamed the beginnings of a brand new Ultima III scenario. I had some ideas on what I wanted to do and how I wanted to shake things up a little.

Since the Ultimore adaptations we’ve spent a lot of time sifting through Hex code looking for X/Y co-ordinates amongst other things.

I say ‘We’ because it wasn’t just myself but also Lord Ponsonby (creator of the UltiExo Ultima III editor) and Fenyx4 (well known in the Ultima community and ongoing curator for the Ultima Patcher).

From those long hours spent pouring over Hex Code we discovered all kinds of neat things like the location of the towns, cities, dungeons, moongates, exotics, etc.

Ironically we never used any of it, as Joel and others who used the old Apple II map editors back in the day for one reason or another never figured that part out or implemented it.

But… now that I’ve started a brand new scenario all that ‘stuff’ is very relevant. I’ve already moved the first city/castle and the first dungeon. I wanted to move the Serpent and the location the player shouts EVOCARE (as well as changing the word itself) however the X/Y co-ordinates for this are a little tricky to find. So too are the new party starting X/Y co-ordinates. I mean, I know where a new party spawns on the map but I need to find the part of the code that designates that location. Why? Because for my scenario I want the player trapped in a small valley until they venture to the bottom of the nearby dungeon, get the mark and learn the word to exit the valley.

It’s different. Really different. But for now not happening. Back in the code though I did find things like the prices for Weapons and Armour. The Gems and Torches from the Thieves guild seemed to be stored in a different format though, more digging required. There was a suggestion that we up the price of Gems to stop players just ‘Peering’ every dungeon level and actually force them to do a bit of manual mapping. Not a bad idea.

Another thing I wanted to avoid was how ‘gamey’ Ultima III is. Big long counters with written words like ‘Bobs Weapons’ and ‘The Olde Shoppe’. If you have a look at the Tileset for Ultima V you’ll see Origin shifted away from this and instead used shop signs and such. If I were somehow able to replace the ~20 letters in the Tileset I could free them up for some far more interesting tiles. Windows, fences, tombstones, a suit of armour, etc. All decorative stuff, sure, but it would bring an entirely new aesthetic to the game not seen in Ultima III before.

So, this time I employed the help of ChatGPT 4o. I uploaded the SHAPES.ULT file and told it to have a read of the Ultima III internal formats over on the UltimaCodex website. Nobody really makes games in CGA any more, and they definitely don’t do it like they did some 40 years ago. Using just the data on the UltimaCodex website wasn’t cutting it. I was getting mostly rubbish, but when I told GPT to ignore the information on the UltimaCodex website and instead work backwards from the facts we knew (80 tiles, 16×16, CGA colour palette) I got something that looked closer to the tiles used in the game.

I could see it was some kind of interlacing issue. Back to Google, and I discover a website that discussed reading raw CGA data and what’s involved. Back to GPT “Oi! You! Read this website and try decoding SHAPES.ULT again!”. This time… it worked.

I’m not a coder, I leave all that hard work to Ponsonby, but with some time and nothing more than the use of the English language I’d manage to get ChatGPT 4o to decrypt the SHAPES.ULT file. Awesome! Now I need a program to edit these tiles, preferably in C#, the language Ponsonby codes in. It took a few attempts but we got something that is *mostly* working. It’s decrypting, letting us see the tiles, zoom in and out, choose from a CGA palette, and paint new tiles. It’s not encrypting properly though before saving. We could spend a few more hours in ChatGPT getting that to work but Ponsonby feels that he can simply reverse the decryption process and it should do the trick.

Neat.

So now it’s time for me to start working on all new custom CGA tiles for Ultima III: Exodus.

Hopefully we can find either a way to move the EVOCARE snake teleport event or the new starting party location. If we can, this is shaping up to be a scenario that really pushes Ultima III into new and unseen territory.

Ponsonby accidentally lost his original source code for the UltiExo editor and is currently rebuilding it from the ground up. While time consuming it’s not a bad thing as he’s making it faster, better, and with even more features.

We’re looking at incorporating the separate program that imported maps from the old Apple II map editor, which allowed us to speed up conversion of the old Ultimore scenarios dramatically.

We’re hoping to add a feature that auto fills the NPC list for any given town/castle by looking at the actors on the map and propagating the table with their X/Y information automatically.

We also want to be able to include the ability to edit the EXODUS.BIN file easily (without the need for a Hex Editor) and allow users to move the location of towns, castles, dungeons, moongates, etc. with ease as well as edit vendor text, prices, and the like.

When it’s done Ponsonby is hoping to really give the whole thing a spit polish and release it to the public. So consider the creation of my own custom scenario driving the software and testing it as we go. No promises on any of this stuff though okay?

There’s room too to including things like the ability to edit conflict maps, and the IMG files like Brand, Fountain, Shrine, and Time. Maybe even DEMO.ULT and MOVES.ULT so you can create your own unique introduction sequence?

As always, no ETA on any of this stuff but it’s exciting to be in the thick of it again and I look forward to releasing some of it in the near future.

Finally, I think I’m tempted to keep the ULTIMORE name. I don’t think Joel would mind, in fact I like to think he’d be flattered. I’m not sure what the full title would be just yet but something like ‘ULTIMORE: A New Beginning’ has a cool ring to it. What do you think?

UPDATE: After another hour or two fiddling with it I got it working. Looks like completely custom graphics are on the menu –