Craig Stephen Cooper

Author and Engineer

The Marduk Engine

Marduk is an RPG engine I’ve been working on for the better part of a decade. I’ve stopped and started several times, and made several rewrites. It started with the Allegro Game Library, making a migration to DirectX, and then leaving that horribly convoluted neighbourhood for the life of a drifter in the back of my mind for a few years, briefly bunking with SDK’s like Irrlicht and Ogre, before finally returning home to Allegro.

Hopefully it will mature into an actual game, if my other personal projects will allow it, that is.

Marduk is an RPG engine I’ve been working on for the better part of a decade. I’ve stopped and started several times, and made several rewrites. It started with the Allegro Game Library, making a migration to DirectX, and then leaving that horribly convoluted neighborhood for the life of a drifter in the back of my mind for a few years, briefly bunking with SDK’s like Irrlicht and Ogre, before finally returning home to Allegro.

Hopefully it will mature into an actual game, if my other personal projects will allow it, that is.

Marduk is an RPG engine I’ve been working on for the better part of a decade. I’ve stopped and started several times, and made several rewrites. It started with the Allegro Game Library, making a migration to DirectX, and then leaving that horribly convoluted neighborhood for the life of a drifter in the back of my mind for a few years, briefly bunking with SDK’s like Irrlicht and Ogre, before finally returning home to Allegro.

Hopefully it will mature into an actual game, if my other personal projects will allow it, that is.

More recent developments

After a year working on other projects, including conference presentations in Cyprus and London, I returned to expand on this work.

Early 2013 saw a change from using TileStudio - a simple tile editor with limited capabilities besides a very useful ability to define your own file format. I did some searching and found Tiled. This made TileStudio look like a plastic tricycle compared to a roaring monster truck. It allows multiple layers, multiple object groupings, context-sensitive tile placings (properly creating a boundary between grass and gravel, without you having to select the tiles manually), and it's XML-based format allows you to insert objects of any type having as many properties as you like. This was exactly what I wanted. I used an open-source library to load Tiled XML files, courtesy of Tamir Atias, although I will probably write a map compiler when I've programmed all the features I want.

Throughout 2012 I had to do a lot of Python programming. One thing I found really useful was it's dictionary function, which is similar to STL maps. Except the former can have any type as a key and value. I wanted to have that kind of functionality in order to pass configuration parameters to objects (I'd save me having to call setters and getters, and would also allow me to load configurations from files). I was able to use the Boost Utility Library, which contains a Variant type similar to the one found in QT. This allowed me to create a Parameter class capable of containing many different kinds of data. Combining this with an STL map allows me to create functionality similar to Python's dictionary. I even made it so Parameters could hold lists of parameters within them, creating nested lists. This has become an extremely integral part of my engine.

I've had some sparse experience with QT, and I really like the idea of using signals. In fact I had an idea for an OOP language completely driven by signals, which could be used to intuitively create powerful multithreaded software. I didn't do that here. Boost also has a signals and slots library, which I employed in the engine. Objects (like NPCs, etc) can connect slots and signals to other parts of the engine, and listen for triggers from other objects. An example of an application is that I could now encapsulate input into a singleton class, and have it fire signals for each input event. Then objects in the game like the Player can subscribe to these events. All of it functions quite intuitively.

All of this came together with the Lua interface. Using parameter lists, I can transfer Lua tables to and from my engine, allowing complex data structures to be modified by scripts. Configuration lists can be uploaded from a Lua script for, say, a battle. Moreover, scripts can easily be resumed by having the script connect to a signal to be fired when the behaviour it's waiting for has been exhibited. For example, the player making a selection in a list or an NPC reaching a destination on the map. In earlier incarnations of the Marduk engine, this was extremely difficult to program, and Boost has made it so much easier.

I'll say, I've had a lot of fun working on this incarnation. With a few more tweaks and further testing, I can declare the over-world component complete, and begin building the database facilities on top of it. I think I'll use SQL for it. Once that's complete, then comes the battle engine. With enough testing, the engine will be complete!

Then I have to get motivated enough to actually create an RPG out of it...

Downloads

A great accomplishment for me, if I may say so, is that I have been able to program this engine to be cross-platform. Currently I have builds for Debian Linux, and Windows 7. A version for Mac OS X is in the works too. Download links are below.

Bug reports and feedback are welcome. Remember, this is a demo, and the main objective was to show off the capabilities of the engine, not my (in)experience at level design.

Early developments

The engine began a redesign from scratch in early 2011. I developed a new application framework, including owned and shared objects, resource management, simple keyframe-based animation, particles, and user interface.

Here's a video of the user interface in action.

 

Old versions

Here you can download some of my old engine demos. Note that these will likely NOT work at all. See the design notes and history to find out why.

FileDescriptionLink
Marduk 1.5 (MinGW32)The Marduk Engine, compiled with MinGW32. Download
Marduk 1.5 (VS 2003)The Marduk Engine, compiled with Visual Studio .NET 2003.Download
Map EditorThis is a map editor for the engine. It comes with tile sets and the un-compiled map shipped out with the engine demo. Download
Database EditorThis is used to create data for characters, weapons, items, enemies, etcetera. It can open the database shipped out with the demo. Download
Engine FrameworkThis is a basic engine framework. Essentially a bare-bones systems from which you could make any kind of game you like.Download

Note: These download links are to another site belonging to me. They should be safe. However, they'll only work on Windows. I've never tested them on anything later than XP, so if you have Vista or 7, don't expect them to work.