About Ultima 1 Revenge
Ultima 1 Revenge began in 2007 as an attempt at reverse engineering the Ultima 1 files (REVENGE stands for REVerse ENGineering Effort). Similar to Exult and other engine ports, the goal was to decode the game files and use them to create tools, the culmination of which would be a new game engine.
This project has always been an on-and-off thing and has never really had ambitious goals, but at the same time it has been a great learning experience and some interesting file format information has emerged as a result.
Aside from sporadic file format research, the major incarnations of this project were the following:
- First attempt in 2007 using C and SDL.
- Second attempt in 2012 using C# and XNA. Good: Progress was great, and 2 demos were released. Bad: Not cross platform, and Microsoft gave up on XNA.
- Online map viewer in 2015 using PHP and AJAX.
- Third attempt started on 30th December 2016 using C++ and SDL2.
A demo has been released for Windows. Get it from the downloads page. Configure the path to the folder where your original Ultima 1 is located, and you're good to go!
- To decode the Ultima 1 game files and better understand how the game itself works internally.
- To have fun and learn.
- To build a well-structured and maintainable codebase.
- To build tools that work with the original Ultima 1 game files.
- Moving around the overworld
- World wrapping
- Animated tiles
- Food gets deducted every 2 moves
- Inform & Search implemented except for dungeons
- Full screen
- Save world map
- Screenshot capture
- Configurable game settings
- Arrow keys: Movement
- Space: Pass
- F8: Saves screenshot to screenshot.bmp
- F9: Saves world map to map.bmp
- F10: Toggle full screen
- I: Inform and Search
- [ / ]: Cycle through player transports
To configure game settings, you can create a file called gamesettings.txt and put it in the same directory as the executable. The file can take a set of key/value pairs as in the following example
U1Path = C:/games/Ultima 1 Graphics = T1K Scale = 2
You should set the path your Ultima 1 game directory as the value of the U1Path setting. Do not change the other two settings at this point (stuff still needs to be implemented). Default values apply for settings you don't specify.
An engine is currently being built. It has a fully working map viewer for the overworld, with some animated tiles but not much else. A lot of work I had done in past iterations can be ported to this new codebase without much effort including:
- CGA tileset support
- Loading/saving player state
- Town maps
There is also a lot of work to be done gathering information about the game to be used in the engine, including:
- Lists of locations (towns, dungeons, etc) on the map to be used for Inform & Search, and for Entering
- Numerical aspects such as prices, damage ranges, etc which will power certain subsystems such as combat and Transacting. Infinitron's site is a great starting place for this.
After the new codebase is brought up to speed with previous work, the following can be worked on, which go hand in hand with loading/saving player state:
- Inventory management
- Cheat functionality to speed up testing (so you can easily get various weapons, transports, etc)
The following subsystems are next:
The cheat functionality will make it easy to work on remaining aspects of the game:
- Dino's Complete Guide to Ultima 1: The First Age of Darkness has lots of info about the game, including some file format info.
- Ultima Thule! has lots of game stats (e.g. lists and prices).
- Ultima 1 Reverse Engineering: Decoding Savegame Files describes the process of reverse engineering the game files.
- Announcing Ultima 1 Revenge, my article about Ultima 1, this project, and the first demo.
When will it be ready?
It won't. Even if it reaches maturity, there will always be things to improve and new tools to create. This is a learning project that will take a long time to shape and grow. And like any other spare time project, there is a real risk that it will never blossom. If the project is abandoned, there will still be a wealth of code, tools and documentation available that came out of it (as with the previous incarnations).
Setting unreasonable expectations would only serve to mar the fun and experience of developing this project. Thus, if you want to play Ultima 1, just use DOSBox. There is nothing in this project that you actually need.
What do I need to play?
The original U1, SDL2, and SDL2_ttf.
What is the difference between the original U1 and this?
The original U1 is playable.
Why Ultima 1?
How big is the team?
It's just me, and I'm not very big. I won't grow anytime soon, though the team may.
Can I join?
Whether you can code or not, there are various ways you can help. Developing a game is tedious enough; learning the inner workings of an existing game adds to the complexity, but it can also be very rewarding. Visit Dino's Ultima Page and get in touch from there if you want to contribute!
What technology are you using?
C++ and SDL2. I don't write C++ for a living; a lot of this is new to me. Nonetheless I'm trying to build a well-structured codebase; among other things you'll find the RAII and MVC patterns in there. If you're a C++ developer, you'll very likely be able to teach me a few things. :)
The choice of technology is mainly to be cross platform. I am developing mainly on Windows, but it is easy to port to Linux and other platforms.