It has been back burning for a while but it is a hard thing to come to terms with. Time for a brief history lesson! Nebulous started as a blank slate. It is Malchemist's first project and we built the engine from the ground up, starting with math libraries and feeble OpenGL classes. Over time our engine matured and actually became fun to play with.
Now, the initial idea for Nebulous was a procedurally generated 3D tower climb. Early on after some pondering and technical consideration, we decided against procedural generation in favor of lovingly hand-crafted levels. Rather than make an in-game 3D level editor we opted to leverage an already existing moddable solution — Blender. This may have been our downfall.
Having a powerful 3D tool like Blender at our disposal colored the expectation of our work. We knew what Blender was capable of and tended to aim for level design above our modeling skill. We had to teach ourselves Blender and the amateur quality shows in all of the levels. I'm not hating on our design — the levels we actually finished are fun — but I simply state the obvious that we are not very good at 3D modeling.
This constant discrepancy between expectation and result wore on us until level design advanced at a crawl. The last six months or so of development went by at a painful pace. We could have contracted outside help, but the level creation process is complex and undocumented. It would have taken considerable effort to bring someone up to speed with the eccentricities of the engine. Eventually we decided to take a break from the project.
Ultimately I think having an in-game level editor may have forced our design to be simpler and not have slowed us as much. Taking inspiration from games such as Little Big Planet or Sound Shapes, I think building levels with an in-game tool can clarify design and add value for the player.
What Went Right
- The engine. We learned an incredible amount about how a game engine should operate by starting from scratch. I'm not sure we will use it moving forward but it will allow us to examine other engines with a more critical eye.
- Level design. Designing our own levels has had a lasting impact on how we view level design. It is impossible for me to play a game without analyzing the level design, particularly sections aimed and teaching the player. This is something that will stick with us.
- Camaraderie. As a duo we lasted longer than we could have individually. We were able to keep the torch burning during dips in motivation.
- Management tools. We used Mercurial for source control and Redmine for issue tracking. Despite a small learning curve, both tools served us extremely well and we were able to collaborate effectively as a team.
- Style. Early on we decided to go with procedurally generated textures. This meant that rather than draw each material (which we suck at) we define each material as beautiful maths (which we are pretty good at). Combined with a pseudo-cell-shading outline technique we achieved a look that is unique and not too revolting. We decided against doing some more fancy techniques like bump mapping in order to further separate the style from modern render pipelines.
- The IGF. While the IGF gave us zero usable feedback, it essentially was a $100 Hard Deadline for us. We went into overdrive the last few weeks before the submission date and polished Nebulous more than we would have otherwise.
- Bullet physics. We tweaked the physics heavily to implement the grappling hook and spikes. Bullet ended up accommodating us well. This tech alone was responsible for much of the feel of the game. It's documentation isn't the best but the code is readable and understandable.
What Went Wrong
- The engine. While crafting our own engine was educational, I'm not sure we will reuse it. Porting to Mac was extremely hard because we did not have hardware to test it on. Also, shader and other OpenGL related errors plagued us throughout the process stemming from weaker cards and hardware we don't own.
- Level design. We are not 3D modelers and this slowed us considerably. An in-game editor likely would have helped as it would have simplified the building blocks we construct the world from. We could have focused more on gameplay elements rather than modeling proficiency.
- Secrecy. We held ourselves to high standards and only showed work to the public on a few occasions. We got motivational boosts when people played the game and the response was generally positive, we just didn't do it often. Some social pressure could have helped.
- Design creep. We call it "wouldn't it be cool if" syndrome. While I don't think there is a ton of cruft in Nebulous, we could have prioritized features better to get a fun, playable game faster. It was easy to slip into doing technically difficult things like high scores board, engine optimizations, etc. These are good to have but don't change the fundamental enjoyment of the game.
- Lack of deadlines. The IGF rush made us realize how important it is to have some kind of deadline to work toward. Through most of the project we were of the "it'll take as long as it takes" mentality with getting stuff perfect. The problem with this is you get diminishing returns perfecting certain features. I have no doubt we wasted a lot of time on things the player will never notice.
- Inadequate funding. Development time exceeded the initial estimate (of course) and eventually our financial situation was putting strain on those around us. This is not an easy mental state to be in and got worse the longer it lasted.
- Sparse playtesting. We had a decent list of people interested in the game but didn't manage testing well. Getting feedback during development might help us realize which problems are most evident to players so we can better focus our time.
In the end we are happy with how the engine feels but don't have levels to back it up. I believe Nebulous will see the light of day in one form or another. The control of the player feels too good to pass up. I hate structuring this post as a post-mortem because I really don't think Nebulous is dead. Still, it is not being actively developed and we need to give closure to the project.