Well sort-of. I had worked on v3.0 off-and-on for the past 10 years, approaching it on four separate occasions. But the commitment to actually finish and release it would not have been possible without a certain key event a few months back – a hard drive failure. And on this hard drive of course was all of the unreleased work I had done on the Exodus Project. Of course that sounds counter-intuitive, but it did ultimately lead to a finished product. But before that happened, I made three other attempts to start work on the project.
First Pass: Back in 2001, after completing the U5 MIDI Upgrade, I wanted to revisit the U3 Upgrade and revise its implementation. Prior to U5 I had largely been hacking away at the game’s binaries, overwriting old, unused CGA code with new EGA and MIDI code. But after seeing how U5 was coded I was inspired to create a similar driver-based model for U3, so different graphics implementations could be swapped in by configuration.
The major obstacle for me at the time though was a lack of a graphic editor / converter. I needed some kind of tool that would allow me to edit graphics in VGA and save them in a bitmapped format the VGA driver could easily read. For the EGA upgrade, I had written a command-line tool I called “Diligence” that printed the graphics out as ASCII characters with ANSI color escape sequences on an xterm console (high-tech graphics, I know) and allowed me to enter commands to manipulate the data. But for VGA I knew I needed something more sophisticated for editing and a simple command-line tool obviously wouldn’t cut it. This is the state the project had remained frozen in for a good six years, mostly because other obligations took priority to the point that I lost focus on the project.
Second Pass: In the Spring of 2007, while catching up on UtR updates, I stumbled upon something I hadn’t seen before regarding CGA – that there was something called a “Composite” mode. Apparently, if you had a real CGA card back in the day as well as a composite monitor, you could switch on a special “composite” mode which would cause a blurring or color smearing effect on the display output. This color smearing was exploited by game programmers to enhance color output on CGA cards from 4 colors to 16 colors. And, it meant that the ugly 4-color CGA graphics of U2 and U3 were never intended to be seen as such! In fact, the composite graphics of these games much more closely resembled their Apple II counterparts. (screenshots of U2 & U3 in composite CGA can be seen here on MobyGames) I began to think, how would the game experience change if they were played in this mode? Surely, composite graphics could be simulated in some way. Could it somehow be worked into the Exodus upgrades?
This inspired me to sit down and start working with the game again. I pulled out my old technical notes, interrupt lists, and annotated game code and within a month I had extracted the EGA and MIDI code I had hacked into the game into driver files, restored the original CGA graphics code into its own driver, and came up with a routine to simulate composite CGA video output into yet another driver. The first routine was horribly slow (and would end up getting rewritten two more times). The next step was to create a VGA driver… and that’s where work stopped again.
I should also mention that I came awfully close to releasing 3.0 at this point. I was very happy with the new driver model and the CGA Composite simulation algorithm in particular. I wasn’t sure however if CGA Composite was enough to encourage users to upgrade to the new release. VGA, on the other hand, would be “prettier”, but there was still the challenge of creating the VGA images. Ultimately my other obligations overtook my work on the project and the U3 Upgrade remained in limbo a bit longer.
Third Pass: By the fall of 2010, I had read some books on how to use SDL to build a game engine. I had set out to try and create my own Ultima-inspired game engine (dubbed Darkcore). I found that much of the graphics code could be borrowed from Diligence, which could already read/write images from the Ultima games. However, unlike Diligence, the use of SDL allowed me to render higher color graphics. After incorporating a routine to read and write the U4/U6 VGA tilesets, I realized I was half-way to achieving my long-standing goal of creating a VGA tileset for U3. All I needed was a way to actually modify the graphic data. Back in 2001, I expected to create my own editor. This time, I scrapped that idea in favor of importing and exporting the data as PNG. Then I could use a real image editor program (like Photoshop) to solve the editing problem – I just needed a save/load the data in an alternate graphics format. At this point, I shelved the idea of the game engine and instead decided to focus on the PNG image format. However due to several other factors going on at the time (i.e. moving out of our condo and increasing demand from work) I had to postpone work on Darkcore midway through the PNG coding.
Fourth Pass: About two months ago I was working on my laptop that contained all of my Exodus Project code, including the unreleased changes. With the battery almost dead I raced for the charger so as to preserve what I was working on at the time, but I was too slow and it lost power. However when I plugged it in and rebooted I was shocked to see that Windows wouldn’t boot! I was able to recover some of the data that resided on the Linux partition, but apparently the Windows partition had become a ground zero for bad sectors and various repair tools would not function on the drive. I had believed my Exodus work was all but lost.
I looked around to see what I had backed up elsewhere. I had taken a snapshot of the work I had done in 2007 onto another computer, but it did not include the composite CGA driver or MIDI driver code. Fortunately, I also found that I had packaged the driver assembly code in some zipfiles for an online portfolio. The documentation containing the annotated disassembly code was recovered from the laptop’s Linux partition. Darkcore was already checked into Sourceforge. Using all that I had found I started to piece everything back together. There were still a few small pieces missing but most of the core code was recovered. I had to rewrite some VGA palette code I had done earlier, rewrite the build scripts, and rewrite the hooks to the MIDI driver. Before I knew it I was back into re-developing the project.
This time, I knew I didn’t want to risk my data being lost again by another drive failure, so I checked all my code into a new Sourceforge Project, meaning the Exodus Project is now open source! Ironically, not long after creating the project my SVN repository corrupted on the second check-in (figures!). But I was able to recover quickly and it now uses a Mercurial code repository instead.
And now, after much delay, v3.0 is finally complete.