Industrial Revolution Postmortem
Developer: Andrew Sage
Lines of Code: 8352
Coding: Xcode, Interface Builder, ClassBuilder (personal class building wizard app)
Design: OmniGraffle Pro - trial version
Graphics: Adobe Photoshop 7
Project Management: ProjectTracker
User Guide: Microsoft Word
Development Hardware: iBook G4 933 MHz 256 MB RAM running Mac OS X 10.3.5 initially and then 10.3.6
Test Hardware: iMac G4 800 MHz 768 MB RAM running Mac OS X 10.3.5 initially and then 10.3.6
Why Industrial Revolution?
In the run up to the uDevGames 2004 contest I toyed with several game ideas covering various genres. After some thought I had reduced the list down to three possibilities:
- Garden Pests 2 - an expanded 3D version of my uDevGames 2003 entry
- Platform game - 2D platform game inspired by the ZX Spectrum classic Manic Miner.
- Industrial Revolution - a board game style of game based around the British Industrial Revolution involving lots of inventing.
My first option was rejected as I could not really be bothered with OpenGL and the frame rate obsessed public.
My second option was rejected after a long debate in the iDevGames forums about whether or not the modern game player was tough enough for the kind of game play we grew up with 20 years ago.
My third option was the one that I finally went for.
I knew that my choice would not appeal to a very large a section of the game playing community. Pandering to the 3D high frame rate obsessed voter would have been an easier path to score votes, but I wanted to make a game that I would like to play. I wanted to make a game that requires some thinking to play and not something that you can just pick up, press fire and play.
I also suspected that, as my game would not have a story line, I would not be able to score maximum points in the voting. This was confirmed once a large chunk of the contest had elapsed. I fully respect the various issues that caused delays behind the scenes of the uDevGames 2004 contest, but it is a bit demoralising for a developer to find the scope of the project, i.e. the rules, going against them when clarification had been requested long before the contest started. Luckily by that time I had decided I was in the contest for the fun of taking part and not out to win otherwise there would have been one less game to vote for.
When it comes to game development Im more interested in the logic side of the game (my other projects such as FlipSquare, Chromacell and Metamorphosis point to this) and less interested in the look and feel. I guess this is why I cant get very enthused over the graphics stuff in FPS games even if I try. Industrial Revolution is a game that contains a lot of behind the scenes game logic.
Why Cocoa and Objective-C?
I briefly toyed with the idea of using C++ and SDL and making this a cross-platform game, however I was already working on yet another evolution of my Metamorphosis game using C++ and SDL so I wanted to do something different.
Ever since I first started developing on the Mac I've liked Cocoa and Objective-C so that is what I decided to go with. I know there are some people out there who would not approve of my choices, but it was my entry and not theirs.
A very important component of any successful project is organisation. In order to keep track of what I was doing and what I still had to do in the project, I used my Project Tracker application. The uDevGames contest was a perfect chance for me to put Project Tracker through a proper test in a realistic environment. The diary function proved very useful in allowing me to keep my development blog up to date on the uDevGames site. Recording every new idea, class and feature and noting every change to the design as I went provided an easy way of checking back on what I had done. It also provided a very useful document for writing this postmortem.
Just over half way through development (September 20th to be precise) I was introduced to OmniGraffle by a fellow Mac developer who unfortunately failed to last the course in uDevGames 2004. Using a trial version of OminGraffle Professional, I produced a set of class diagrams so that I could get an overview of how everything fitted together. My intention was to publish these diagrams as part of the development blog but time did not permit this. However the diagrams will be included in the source code released as part of the contest.
At the very start of the contest I made the decision that I would not let the game rule me. I would do the development when I had spare time and if the game failed to be completed in the three month window then it would not be the end of the world. Taking this non-pressured approach ended up being more productive than trying to cram coding into every waking moment. I feel that knowing you have to get something potentially complex finished by a fixed deadline can sometimes lead to the headless chicken effect where you spend the whole time sitting there thinking Ive got to do this! Ive got to do this! instead of sitting there thinking about the actual project.
Most of the initial development took place during my lunch breaks at work. This meant that for the first couple of weeks I spent no more than about 8 hours on the project. The first real long sessions of coding came about due to being stuck for hours on trains going to and from meetings.
Another opportunity for putting in some serious development time arose when I was away on holiday for a week. However, I again decided that a life in the real world was more important than the contest.
Even right up to the close of the contest I did not end up doing any of those lack of sleep coding sessions. However I must admit to losing more than a couple of hours around midnight on several occasions just playing the game and trying to claw back the money I spent on my railway!
Before I began coding I had an idea in my head of the distinct phases of development I planned to do. The plan was as follows:
- Get the basic Cocoa framework up and running this used the initial steps I had previously written for the FlipSquare tutorial
- Text based display of player assets (Office screen) such things as factories and trains
- Graphical display of player assets on a map (Map screen) this would just use placeholder graphics and text labels.
- End of game turn logic
- Expanding transport network
- Invention Tree
- Computer players
- Final graphics
- User guide
Its Still in Development!
Whenever Im developing a game, or any other application involving some kind of graphical display, I always use placeholder graphics right from the start. The final, or even appropriate but not final, graphics can be added once everything else is working. You can see that an alien is in the wrong place just as well if the alien is a green square.
This placeholder approach was what I used for my menuing / button system. In fact the system has been designed to allow full functionality and a quick game to be developed without any graphical work at all.
However I must say that I was slightly disappointed to find out just how many people who visit a game development site do not seem to understand this approach. If I was to get a positive vote for every person who questioned the point of having a tool tip appear beside a button that contained the same text then I would have won the contest! Apart from this little rant though I must say that the quality of feedback and interest for Industrial Revolution throughout development was very good. It was the public who convinced me it was worth carrying on after the rules fiasco.
How it Evolved
During the progress of the contest Industrial Revolution evolved. Some things were dropped before they were even coded. Other things were coded and then removed when it became obvious that they just did not work well. A couple of ideas only made themselves apparent during development.
The following is a list of what was dropped from the contest entry:
- Computer opponents
- Recruiting factory and construction workers
- Extended Invention Tree
- Additional transport upgrades
- Different maps
The following is a list of what was written but then dropped:
- Shop screen. Originally new transport and other things were to have been purchased from a shop screen. This screen was similar to the shop system in my uDevGames 2003 entry Garden Pests and a lot of the code came from that game also.
- Office screen as main screen. During early development the Office screen was the main screen where are all the moving of transport and other house keeping was carried out. The enhanced Map screen made a lot of this functionality redundant and so it was removed.
The following is a list of what evolved during development:
- The Icon Wheel. Originally everything was controlled via buttons but this was changed to use a circle of icons along the same lines as NeverWinter Nights.
- Technology Points. Originally the plan was to have various technology categories that the player built up and reaching various levels gave access to new inventions. This changed to a system were the technology points were researched from a research budget and then used to buy inventions. Had time permitted then Inventors would have been required to build up these points using their various skill categories.
Due to the fact that Industrial Revolution had no story line to it I knew from the start that I would not be able to win the overall contest. With this knowledge I decided not to bother worrying about music for the game. This was the case right up until the first day of voting when I showed the game to my line manager at work. As it happens he has a Mac and a collection of music hardware and software and so he offered to do me some music. The original idea was to have four pieces of music: title screen music, in game music, good end of turn music and bad end of turn music for when a disaster had occurred. However due to time and file size limits we just stuck with the one piece of music.
One of the goals of the uDevGames contest is for the developers to expand their knowledge. In my opinion it is always easier to learn something new when you have an actual use for it and the development of Industrial Revolution was the perfect opportunity for me to try out some new things.
I've heard a lot of people going on about how using scripts for various things in games makes life in development a whole lot easier by cutting down on compile times when making small game changes. Personally I was not convinced about the idea as I find it quicker to hard code things than adding layers of additional work to process files. However the phrase, "Don't knock it until you've tried it", comes to mind so I gave it a go.
The area of the game I actually tried it out on was the in game training tasks. One path I did consider taking the game down was to add levels to the game with each level requiring certain tasks to be completed. My plan was to have a script that would easily allow training tasks, and the possible level tasks, to be set up and loaded into the game. In total I must have spent about 7 hours getting this system working correctly. There was no way that recompiling every time after editing the in code task entries would take as much time as that!
What finally convinced me that Id really wasted too much time on the scripts was that in order for me to test some additional game features using their own tasks I would have had to create multiple script files and keep copying and renaming them compared to just commenting out a couple of lines of code.
The script episode had not been completely pointless though as it gave me a chance to discover and really get to grips with a lot of Cocoas string handling abilities. I have put this knowledge to good use in some other projects that Im working on.
I finally got to grips with selectors during this project. I started off using them for a couple of simple things, such as calling the relevant screen drawing routine dependent on the current game state.
Next I totally rewrote my Button class to use selectors instead of large chunks of switch statements.
Selectors also played a part in the training tasks, briefly in the shopping system before it was dropped, the Icon Wheel and Inventions.
This new understanding had the knock-on effect of causing me to become distracted from the contest with rewrites of sections of my planned Cocoa Desktop Games book.
The first task ahead of me is to fully document and tidy up the existing source code.
After the source code has been dealt with I will look at putting in the functionality that I had to leave out, with the exception of the computer opponents. I intend to get the game to a stage where it is completely playable with no opponents. Only when it is working will I add in the computer opponents.
However before I think about computer opponents Im toying with the idea of adding in some timers and giving the player the option of real time as well turn based play and even the option of mixing the two should they wish.
My other big plan for the game is to use the basic engine and build a construction kit for making similar kinds of games.
I also plan to produce a more detailed write-up of the development of the game and the revised construction engine for turning into a series of tutorials, or maybe include it in my still to be completed book. Another alternative is to maybe turn it into a course at the iDevGames university should it ever come into being.