JoshJers' Ramblings

Infrequently-updated blog about software development, game development, and music

Do Androids Dream of Electric Chairs?

So, I’ve been working on the Intangibles. Otherwise known as the Unscreenshottables. Those things that improve the innards of the whole system, but you can’t really show off.

But first! A screenshot of something (to prove that my renderer can display more than just chairs):

One goal of this whole thing is that absolutely NO game logic will exist within the main EXE. It will all be loaded from script files (and eventually managed code assemblies).

I’ve gotten that up and running. The “scripting language” that I’m using is, in fact, C#. Basically, a script is an entity in the world, or an event, or any number of other things. They all derive from the IScript interface, which really requires three functions be implemented: OnCreate, OnTick, and OnKill.

I’ve exposed certain things to the scripting, like the math functions (vectors, matrices, quaternions), Camera control, texture/model loading, etc. There’s no direct access to the renderer, it’s all through the world data. You add objects into the world (which is setup by the main script), and it handles the rest.

I’m trying to make it as simple as possible.

80s Chair Band

I got bored and made a video of the chair demo. Why not? 😀

So here it is:

Woo!

WOO!

(2024 blog port note: this was once a link to Mop of Destiny winning first place in the gamedev.net 4e5 competition, but alas that page has long since vanished)

Historeez

For those who missed it:

Mop of Destiny Soundtrack MP3s!

On Power Outages (And Other Weird Things)

They suck. Our power was out for 9 days. For someone as hopelessly addicted to the Internet as I, it was like not having legs. Legs that could span the globe in an instant. Or at least under a few seconds.

The power came back on, predictably, about 2 hours after we had left for the airport to go home to Indianapolis for the holidays.

Thus, the tally of weird things that have happened in the 6 months since I’ve moved to Seattle area and started work at Microsoft is:

  • My car (Which already had $3800 in hail damage) has been involved in 3 accidents, 2 of which were definitely not my fault and the third of which I can make a pretty good case for
  • Approached by a guy with a knife near Pike Place Market. He didn’t threaten me with it, he just wanted to sell it to me for $5.
  • Almost punched by an angry chauffeur in a stupid-looking suit at the Sea-Tac airport because I had the absolute audacity to try to help him out and tell him that the name on his little sign wasn’t visible.
  • There have been floods and even a (mild, for Indiana) snow storm
  • 9-day power outage

Life: Always entertaining.

(Breakdown of Mop of Destiny’s development after the fold)

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).

Scripting

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",  " 'Nuther seal down, Jack?  Good for you!  Man, you're sweatin' like a pig...you look like you could use a towel."));
Add(new DialogPoint(m_audio, m_renderer, 0xFF7F7FFF, 20, "Sound\\3-2.ogg",  " 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",  " Who?"));
Add(new DialogPoint(m_audio, m_renderer, 0xFF7F7FFF, 20, "Sound\\3-4.ogg",  " Just a...nevermind."));
SkipTo();

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!)

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

The Clocktower

The art for Mop of Destiny is now 100%.

Here are some shots from the final level of the game. Yes, you can jump on the gears, and yes, tracing the clock face took a very long time.

Today, I will start the cutscene work.

Shadow Realm

Level 4, the shadow realm. If there’s one thing that Super Mario Brothers taught me, it’s that all enemy fortresses HAVE to be made out of bricks.

I’m not happy with the brickwork in the palace (it’s a bit flat)…I’ll fix it later if I have time.

ON WITH THE SHOW!

Moving on to level 5!