Recent blog entries for DrCode

There's certainly a disconnect between my open-source work and career.

Career: Laid-off 3 months ago. I apply for several jobs each week, and hear nothing back.

Open-source: We get fan mail every week. We've been interviewed for a couple on-line sights, and recently were contacted about another interview.

Say, dancer, sounds like your trip is going smoothly, or at the least, that the food is good!


The development group has pretty much evaporated, probably because there's not much to do. I'm finishing up a few minor features, and will then release an Alpha. This cleaning/debugging phase is the hardest part of any software project (because it's so boring), and I can understand why some open-source projects fall apart at this point.


When I interviewed, they explained to me how their software (all command-line) was developed under Windows, and so, unfortunately, was completely dependent on MFC container classes, and that it would be a huge job to rewrite. Therefore, I'd have to do my development on a Windows platform.

Well.... they were right about it being a huge amount of code (over 150K lines), and that I wouldn't want to rewrite it. Yet, the MFC functionality used (just CArray, CMap, CString, and CList) is easily duplicated in STL. So, having some experience in STL from my open-source project (thanks to Dancer), I didn't find it too difficult to write a wrapper that translates the MFC container classes/methods to equivalent STL classes/methods. Took less than a week, and now I'm happily working on a PIII running SuSE 7.0!

Haven't done serialization; that will be harder, but also more fun.

Now I'm trying to convince coworkers/boss that this MFC->STL wrapper might be a nice thing to open-source, as it will give us a bit of positive publicity, and that we might get help and testing from other users.

Open-Source Coolness

For two years, I worked on Exult pretty much by myself. At first, it was just a simple Ultima7 map browser; later, the ability to simply walk around as the Avatar was added. Finally, with the addition of the Usecode virtual machine, it became an actual game engine. But it was still fairly primitive; and, as a one-person project, it was doubtful that it could ever be a complete game.

But it was enough to get some attention, especially after the move to SourceForge. Willem joined to do a Win32 port, and has continued on doing other work. Dancer wrote the Linux and Timidity audio code, an area where I have no experience whatsoever. Tristan implemented the entire intro. screen with menus and opening animation, and has also written a Gimp plugin for editing U7 graphics. A developer named CoderInfidel did lots more decoding of the U7 data files, and also added the weapon animations. And 'Colourless Dragon' has figured out and implemented the NPC flags, fixed the movement code, and is working on support for Serpent Isle.

And finally, out of the blue, 'Kreed', who wrote the advanced 2XSal scaler for Snes, has contributed the same algorithm implemented in C++ for Exult.

This is all incredibly cool, allowing me to concentrate on the game engine itself. Anyway, excuse me if I'm starting to sound like one of the NPC's at an Ultima7 Fellowship Meeting.


More bug-fixing, this time trying to track down elusive and intermittent crashes. I may have found it, as there was a method getting invoked that modified a linked-list that was being traversed. On my Linux box, it caused the game to hang; but I'm hoping this was also the cause of the reported crashes in the Win32 version.


I may have overdone the combat code; the Avatar is getting into battles with the cats when you double-click on them.

Otherwise, progress is really good, with Tristan finishing the intro. screen and menu, and Ryan figuring out a bunch of NPC flags that I'd been ignorant of, and using them to fix the movement code. Meanwhile, I've partially figured out how theft is determined, and have (mostly) finished implementing support for poison and hunger. My next plan is to fix a few bugs (which some of my latest 'improvements' seemed to have caused), and then work more on the rendering algorithm (fixing glitches and maybe speeding it up a bit).


Not a bad time to be looking for a new job (not that I am, in case anyone I work with is reading this; this is all just observation). But finding a job these days is almost a full-time job in itself, as most places want to interview you for 6-8 hours. Not that I would know this first-hand; it's just something I've heard.


No more Mr. Nice-monster! With about 10 lines of code, the monsters with 'hostile' alignment now attack you when you get near. I'm probably going to add a cheat code to make them nice again, as it makes plot-testing much easier.

Meanwhile, Tristan is separating out code to make working on Serpent Isle easier, and the other developers are working on audio. It still amazes me how large this project has grown, especially since Exult was originally just going to be a landscape browser. I was a bit dubious about writing open-source at first; but it certainly is cool getting all this help from really talented people from all over the world.


Fixed most of the plot and conversation bugs that Ryan found, and managed to play all the way through the Skara Brae sequence. My guesses (the most recent in a long line) about the ABRT and CATCH opcodes seem to be working. I'm starting to feel really confident about Exult being fully capable of playing Ultima7, especially with six other really capable developers contributing to the project.

So.... how does one get more certifications? The only one so far is from Dancer, one of Exult's lead developers.

Work...!:-) Anyone need a C++ developer in the Portland, OR area? For a code sample of around 40K lines-of-code, grab the source at

Exult (Ultima7 engine)

Our newest team member, Ryan, has not only been fixing lots of my poorly-hacked code, but has also been playing through the game, and finding lots of plot-related bugs. For me, this means more work on the Usecode-interpreter, which has been the most frustrating, and the most satisfying, part of this project.

And I think I've got the solution to most of the problems. First, the ABRT opcode, which I was interpreting the same as a RET, is really like a 'throw' in Java; it not only returns, but passes its effect upwards to the caller. In addition, the 0x4 opcode, which I was interpreting as a 'jmp-if-done', is really a 'catch', and the previously 'unknown' opcode, 0x40, is always the target of a 'catch'. So if a called function returns with an ABRT, control should pass immediately there. I'll give this all a try tonight.

World News

I'm a news junkie, and have been following the Middle East peace talks almost hourly. It's depressing, but I see no way the two sides can compromise on Jerusalem when both have religious reasons for their claims. My proposal (which, of course, nobody really cares about:-)) would be for them to share sovereignty, with a city council made up of representatives from both sides, and an integrated police force.

I know it seems improbable that the two sides could ever trust each other to do something like that. But then, weren't Britain and France mortal enemies for hundreds of years, with each claiming the other's territory?

Exult (Ultima7)

We're in the cleaning-up phase, which for me, means playing the game and looking for holes. My main enhancement over the weekend was getting teleports to work. In addition, I fixed a bug that allowed monsters to walk through walls, smoothed out the walking animation, and fixed a combat bug where your character wouldn't attack when you wanted.

As usual, testing the above revealed more unsupported game features: traps, sleep fields, poison fields. These appear to be instances of 'type 1' eggs, which I had thought were only used for creating monsters. So... more reverse-engineering is required here to figure out the data format.


Took my daughter to see Pokemon2000. Actually, it wasn't bad at all, with an almost RPG'ish sort of plot. And some really nice animation.

Exult (an SDL-based engine for playing Ultima7)

Seeing great progress in all areas. Suddenly, the Midi's sound great, thanks to Dancer and Ryan. Tristan's got the intro. movie working beautifully, including the Guardian's speech. And I finally have the horses facing the right direction when you turn the carriage (yes, one of the major advances in comp. sci!)

So what's left before we can release an Alpha:

    1. Implement the starting menus.
    2. Finish the combat system.

Kind of scary to think that after more than two years, this project may actually be finished. And it's even scarier to think about all the bug-fixing, testing, and cleanup to be done before it's really finished.


After nearly 20 years, I'm reading Lord of the Rings again. The first time I read it, as a teen, it was great. But when I read it the second time a few years later, it seemed contrived. Now that I'm somewhat (but not a whole lot) more mature, I'm enjoying it more than ever, and see why it's inspired so many writers and game designers.

New Advogato Features

New HTML Parser: The long-awaited libxml2 based HTML parser code is live. It needs further work but already handles most markup better than the original parser.

Keep up with the latest Advogato features by reading the Advogato status blog.

If you're a C programmer with some spare time, take a look at the mod_virgule project page and help us with one of the tasks on the ToDo list!