Finishing Touches

Alrighty. The gameplay, graphics, art, music, and sound are all complete. I have a few finishing touches to put on it:

  1. Some of the background music has a different average level than the others, so I’m normalizing that all out
  2. I want to add the credits
  3. I need to provide a manual, so I’ve got to write that. Shouldn’t take long


But effectively, Mop of Destiny is complete, and should be showing up sometime tomorrow evening (Tuesday, PST).

Until then, here is the final boss music:

Final Boss!


Scripting’s done. And I use the term “Scripting” lightly.

All “scripts” are hard-coded into the game. For instance, a sample short script would look like the following:

    Add(new StopMusicPoint(m_audio));
    // Whistler fades in.
    Add(new CreateEntityPoint(this, m_audio, m_renderer, m_world, "Whistler", "Whistler", Vec2(14,1)));
    Add(new LerpEntityVarPoint(this, "Whistler", "alpha", 0, 0.5f, 50));

    Add(new DialogPoint(m_audio, m_renderer, 0xFF7FFF7F, 20, "Sound\\3-1.ogg",  "<WHISTLER> 'Nuther seal down, Jack?  Good for you!  Man, you're sweatin' like a look like you could use a towel."));
    Add(new DialogPoint(m_audio, m_renderer, 0xFF7F7FFF, 20, "Sound\\3-2.ogg",  "<JACK> Silly me for leaving home without it.  Arthur Dent would be so disappointed."));
    Add(new DialogPoint(m_audio, m_renderer, 0xFF7FFF7F, 20, "Sound\\3-3.ogg",  "<WHISTLER> Who?"));
    Add(new DialogPoint(m_audio, m_renderer, 0xFF7F7FFF, 20, "Sound\\3-4.ogg",  "<JACK> Just a...nevermind."));

Basically, that creates an entity named “Whistler” given the entity type “Whistler”, lerps its alpha value from 0 to 0.5, plays a bunch of dialog (the dialog point both plays the ogg dialog sound file and displays the text), then ends.

The SkipTo lets the script know that this is the point that it skips to when the user skips a cutscene. I’m not using it to make unskippable sections, it’s just a quick hack because I’m also using scripts to set up the background music at the beginning of each music zone, so I don’t want the player to be able to skip THAT.

Anyway, a couple of screenshots to tide you over. The first shows a script that’s running (along with the shopkeeper, Whistler P. Higgins), and the second shows the game running in wireframe (That’s right, I’m not using textures! For anything!)

Click to enlarge

Anyway, I hope to finish up the history details in an entry soon…I haven’t had much time to do so!

Ruins! Blocks! Ruins Made From Blocks!

Again, not much energy to say stuff. I remember what sleep was like. I remember it fondly.

Level 2 is not quite as varied in appearance as level 1 – it’s a bit narrower in focus.

Here are a couple screenshots. Jack’s standing on a falling block in the second shot.

Side note: Keep in mind, when viewing these screenshots that I have a strict “NO TEXTURES” policy. Every detail is a polygon. The idea was to have total resolution independence. There are a lot of polys in my little 2D sidescroller. …In retrospect however, maybe I should have just had textures.

Click to enlarge

Level 3 tomorrow! I hope to have the background art done by the end of the weekend.

…then all I have left is the cutscenes/music/sound. It’s a bit of an uphill battle to finish, but sometimes those are the most fun battles.

Trial By Fire.

15 days left. The gameplay is done and in “test” (a bunch of friends are playing through it). Thus, I had that terrifying moment where you send out your creation to the world and hope that it works.

…then someone reports that there’s a serious bug which you quickly fix.

That’s how it goes.


The Gameplay Prototype

So when last we spoke, I had set my schedule. I had just a few short weeks to get a complete gameplay prototype running. So I started where every game developer seems to start: With the graphics.

I mentioned before that the graphics were simple. Polygonal, no textures. Writing that took about a day (very, very simple code). I checked it in on August 12th.

Next up: Input. No sense in gameplay if you can’t PLAY it. I took the input code that I wrote for my old NES emulator and modified it slightly for my new uses. That gave me automatic keyboard/joystick control.

Side note: Never initialize DirectInput after initializing Direct3D, because it does bad, bad things to the window interface. DirectInput subclasses the window, which Direct3D doesn’t like, so D3D doesn’t like to restore the state of the window correctly after doing a Reset (i.e. for switching between fullscreen/windowed).

Blah blah blah, wrote a bunch of stuff, got the gameplay test done. Only a few days behind schedule, on September 4th.

A Note on the Art Path

So, my original “art path,” as it were, was amazingly complex.
It kinda went like this:

  1. Create object in AutoCAD.
  2. Export from AutoCAD to .3ds
  3. Use a 3D modeling package to import the .3ds
  4. Manually fix up the incorrectly exported colors
  5. Export to .ase
  6. Run custom converter from .ase (an easily parseable ASCII file format) to my own mesh format.
  7. Profit!

This eight-hojillion step process was a pain and, moreover, had one fatal flaw in it.

Check out step number 3. AutoCAD was incorrectly exporting the object colors.

As it turns out, AutoCAD has the ability to set truecolor values to objects, but it also has a built-in 256 color palette (likely left over from the olden days). Now, when ACAD would export, instead of exporting my delicious true colors, it would export the nearest match in the color palette. Consequently, I had to fix them up later.

This became a problem when I tried to do my first test background – Fixing up all of the colors was way too time-consuming, so I had to find a better way.

FIRST I tried to import the DXF directly into the 3D modeler. However, it ALSO screwed up the import.
SECOND I tried to write my own DXF reader. As it turns out, the object that I’m using as my building block (the REGION) is one of the only TWO types of ACAD object that are encrypted in the DXF. Which is stupid.
THIRD I found a third-party program to convert REGIONs into PolyLines, which I WOULD be able to read. However, this program also dropped the same color information I was trying to preserve, thus ensuring that every last person in the universe has screwed up the color import/export with ACAD files.

The Solution!

I found out that AutoCAD has its own API for writing plugins called ObjectARX. Essentially, I downloaded it and wrote an export function from AutoCAD directly into my mesh format. It does the following things: Scan the scene for regions, and for each region it finds, triangulate it (using ear clipping) then write that to the file.

So now, my art path has become:

  1. Create object in AutoCAD
  2. Export directly to my mesh format, with correct colors intact.

Much better.


I don’t have any new screenshots. What I *DO* have are two of the songs from the game.

The first one is the song that will play during the main menu on game startup. It’s the piano version of the main theme.

Piano of Destiny

The second is the first-level music, which IS the main theme (thus, both songs have the same melody).

Theme of Destiny

Anyway, it’s amazingly late and I work tomorrow, so that’s all I have time for today. Backgrounds truly begin tomorrow!