My first mod was just a reskin of the character in the first Quake, it didn’t have any actual purpose and only showed in the player selection screen for multiplayer (I didn’t have internet at that time) and when you “exploded out” the last boss.
It was with the first Neverwinter Nights, however, that I truly got into modding. I remember as a kid how it was satisfying to build your map in the editor, write a new spell or add scripts to convert your imagination in realty, albeit a fictitious one.
More than a decade has passed and modding has become mainstream and is a powerful way for game developers to create a community around their game and give them added longevity but, more to the point, in my opinion, it empowered the user and cut down the distance between video games and traditional games: you are less confined to what the game designers wanted you to experience and you can get more intimate with your game and “use” it in any may you want.
From the get-go one of my design goals was to make Wizards’ Duel moddable. Every asset can be modified, the game logic will be scripted in external files for the most part and “modules” will be supported natively. Like many choices in development and engineering in general, this strong goal can be both a curse and a blessing.
One of the first suggestions that a new game developer gets from the more experienced ones is to “make a game, not an engine“. This is a really valuable lesson that every programmer, both novice and accomplished, should understand and make their own: it is very easy to get over yourself and start a project too large for your own resources, be them time, skill or quite simply the will to see the end of a project. This is orders of magnitude more important for hobby projects like WD, where you don’t have a schedule that forces you to to be productive fast and now instead of taking your time to design the most powerful of the systems, balancing efficiency and elegance. After months the original impetus and enthusiasm will fade and soon you hard disk will be filled with half baked projects, none of them really even resembling a full game.
Having a fully moddable game looks dangerously like making a game engine but this is not the goal of this project not my intention.
On the other hand, however, designing the game taking into account modding, and data driven development in particular, means having such a level of flexibility that even a small group of inexperienced people can lower the development costs on the long run. This gain is more difficult to quantify and explain, and is something that becomes more evident with experience, but I can make an example. Right now I am working on the graphical outputs of the game, in particular the “world view” user interface object. Instead of defining a WorldView class and implement the objects that I wanted to draw as static values (like the background, walls and characters), I used a factory that takes an XML definition of the WorldView and builds the world view as a series of layers with custom parameters. This particular design allowed me to easily put to screen the various mockups that Daniele provided me without ever having to touch a line of code. Since this is our first game and we are mostly going on by continuous iterations and prototyping this approach proved to be an invaluable time saver even after just a few months.
<worldView width="800" height="480" cellWidth="64" cellHeight="64">
<backgroundLayer blend="ALPHA" texture="tex_fire03_walk_base.png" type="UNDEFINED"/>
<tiledLayer blend="ALPHA" mask="tilemask_floor_01" maskBlend="MULTIPLY" name="FLOOR" texture="tex_fire03_walk_base.png" tileScale="2"/>
<tiledLayer blend="ALPHA" mask="tilemask_wall_facing_01" maskBlend="ALPHA" name="WALL-FACING" tileScale="1"/>
<objectsLayer blend="ALPHA" scale="2"/>
<tiledLayer blend="ALPHA" mask="tilemask_wall_shadow_01" maskBlend="ALPHA" name="WALL-SHADOW" tileScale="1"/>
<backgroundLayer blend="MULTIPLY" texture="tex_fire03_atmosgradient01.png" scale="4"/>
<backgroundLayer blend="ADD" texture="tex_fire03_faraway_gradient01.png" static="static"/>
<lightLayer ambientRed="0" ambientGreen="0" ambientBlue="0" blend="ADD"/>
Hopefully I will be able to strike the right balance between moddability and getting things done and I truly hope that someday someone will enjoy our game to the point of deciding to open up one of these configuration files and creating something new and original.
What are your modding experiences? What do you think should be moddable and what is just too much over-engineering?
Thanks for reading.