Finally finished Bioshock

There are two important things about finishing Bioshock

  1. My plan to finish games before moving onto the next is working
  2. I can do one of my first game breakdowns

Bioshock is a fairly complicated game made out of simple pieces. I find that most games that I like, Bioshock being one of them, have a design that almost spells itself out to you as you play. Bioshock still leaves lots of flexibility and provides elemental pieces that the story leads to you. In this way, the progression in the game is kept interesting even though the classes of characters you fight is very limited.

Up unto this point there haven’t been and SPOILERS. If you don’t want any SPOILERS…please stop reading here.

<–SPOILERS SPOILERS SPOILERS SPOILERS SPOILERS SPOILERS SPOILERS–>

Story

The story in Bioshock took me a little to get into. For me the key to a good story in a game is to involve the character in nearly every game event. Bioshock really does base the story around you and the progression (I went good, saving all the little sisters) makes you feel involved. I wasn’t hooked until the midway point and I didn’t think the story came together at all until the last three levels. Overall the story arc of first being intimidated by the big daddies and then having to become one to defeat Fontaine was awesome. The key thing Bioshock has taught me about story telling is to build up relationships and questions at the beginning of the game and then turn both those relationships and the need to get answers on the player later.

I am always a sucker for games that have different endings. Even if I never watch them all myself, knowing they are there is a draw to a game for me. Must be the result of Wing Commander burning branching story into my mind as an early gamer.

Weapons

As a first person shooter, the interactions in the game are basically all with weapons and plasmids. The amount of selection is incredible. With about 6 weapons and at least 2-3 ammo types per gun there are up to eighteen options with guns. The ammo types are a great way to scale weapon firing types without having to model anything more from the gun. But then there were 5 weapons that could be upgraded as well! So the amount of customization is handled very nicely by just having a few additional visual meshes on the weapons.

Having a camera/research element was a great way to get the names of the creatures you face as well as making you realize that your opponents are different even if they look the same.

Plasmids are probably the most unique element of the game and they opened up some very interesting options. Much of the base elemental stuff like fire, freezing and electricity was shared with the ammo so you could get interesting shared effects that make implementing features like this much cheaper on the engineering side. The things that weren’t in weapons were story elements like the insect swarms and the hypnotize big daddy. In this way, nearly everything gets repeated use and can function as a weapon.

Taking over turrets and security bots was another great way to increase your firepower and play with different tactics.

Weapon design in this game was excellent and it was implemented in a way that made my engineering side smile. Everything is basically reused to maximum potential

  • One weapon, many types of ammo: Less weapon models and more customization
  • Elemental damage types (Melee, Fire, Freezing, Bullet, Anti-personnel, Armor piercing): lots of these damage types are reused either between plasmids and ammo types or they are used by the creatures in the game

Aiming is also a key thing Bioshock got right. They assist you more than most other games in three ways

  1. Projectile assistance: You don’t need to be pointing at your target, within a certain distance of the reticle it will shoot towards the closest enemy
  2. Crosshair following: After being on a character it will follow them even if you don’t with the controller, actually turning your view
  3. Crosshair glue: I’m not sure if this is the same as the above or not, but it seems like you get slowed down on your target.

The assistance they give makes this work as not only a twitch shooter, but it also works for RPG fans that don’t want all the precision aiming.

Character Upgrades

Outside of upgrading your weapons/plasmids, there were several things to enhance yourself with in three different categories. Having the upgrade system in the game not be point based and having it fit in with the game fiction was a very clever choice. I never felt removed from the world fiction when upgrading myself. The self gating of the slots by having to pay to open new ones was great to limit characters within the world fiction.

Enemies

There is a good selection of enemies. Something like 3-5 splicer variant models used to make up numerous classes of splicers. A few classes of big daddies. Security bots, turrets…and that is about it outside of boss battles. They make so much out of so little it is awesome.

Graphics

Many people marveled at how Bioshock looked and gave the engine credit. I do think that their engineers did a great job, but what really makes Bioshock shine is the consistent art direction and the delivery of those assets. In a game like this, and in most first person shooters, you need to spend more effort on the world than you do on the characters. The amount of style this game has is awesome. The world assets are all solid and reusing these assets never gets old. This game also paints a vibrant picture with lighting. I don’t think I have seen another game that can get away with using so many primary colors in lighting and not look completely fake or over the top.

Summary

I think that great games could run on any system and I think Bioshock could have been an interesting game as a side scrolling game. I don’t think it takes technical innovation to make great games anymore and I think Bioshock’s success is grounded in execution and substance, not technical flair.

Posted in Game Breakdowns, Game Design | Tagged | 2 Comments

The next “next generation” has its work cut out

I was thinking of how we are probably approaching another generation of hardware and wanted to share my thoughts on the topic.

The next generation is going to have an uphill battle to sustain growth rates if the industry focuses on the traditional hardcore gamer. Next generation systems are historically sold on graphical advances and we are reaching the point of diminishing returns. Disruptive technologies like the Wii interface or guitar hero are drawing more attention than consoles themselves. Consoles are also running out of “obvious” technical innovations to draw on from PC gaming. To be successful, I belive the next generation is going to have to wait longer and carefully target interface evolution.

People are generally focused on how good games look. The advances from the NES/SNES days to the current generation of hardware is staggering. You could watch the PC market to see what consoles would be getting a couple of years down the road. If that is true today, even though the growth rate of graphic card power is staggering, the visual advances no longer match. If you show your average consumer Crysis and Half-life 2 you will not get nearly the reaction as from Super Mario 3 to Mario World. The Half-life 2 engine is still being used for game four years after its release and they are competitive quality. Graphics cannot be the main selling point for a new generation of hardware and Wii has arguably proven that for this generation by the Wii.

Nintendo’s tactic with Wii has been a suprise success. Not taking part in the graphics war and instead focusing on control innovation proves that audiences are looking for something new. Disruptive technology really defines the game industries progress. Games like Guitar Hero hinted that this kind of innovation could sell not only peripherals, but consoles. With the exception of the interface technologies like Wii and Rock band, nearly every innovation for consoles was first explored on PC. Wolfenstien 3D was the original first person game and it was a huge leap to see through your character’s eyes. Another leap was with Doom which added height, lighting and multiplayer. Doom would not have been the sensation it became without the disruptive influence on business networks at the time. I’m focusing on the example of first person shooters because they are some of the highest profile games in the history of gaming and highlight the delay between PC delivery of features and consoles (COD4, Crysis, Halo, Halflife, DOOM etc.). The issue right now is that there is not currently a disruptive technology available on PCs to point to. There was always a logical massive evolution for consoles to grow into. Currently there is not an obvious example of where the next generation can evolve.

Without a leading market to see what the next big thing on consoles is, what hopes do we have for a new generation? The most exciting thing developing in PC hardware right now is the generalized GPU. They are coming full circle to being general processors. The CELL in the PS3 is similar in design and so will Intel’s larabee architecture. What this means from a technology perspective is that people will be able to apply the hardware in more unique ways to solving problems. Graphically this could lead to some major advancement and differences in how games look if people leverage this technology. This is a huge if, but we may see some advancement. New interfaces are also available, be it brain wave or further advancing accelerometers. I doubt that neural interfaces will take off in the near future given the amount of time it takes to train on them. Voice recognition and camera interfaces haven’t really taken off yet in games. Three dimensional displays may be a huge hit if both film and games can embrace and push the technology. The time line for change in the home TV market is roughly a 20 year turn around if you use high definition as a format example. If none of these changes appear big enough to warrant a new wave of next generation, what should the industry do?

Going forward, the industry should focus on software sales from the current generation and extend the life time of this hardware cycle. Look at the longevity of the PS2 and how great some of the games late in the life cycle were. Will this happen? No, I actually predict that Microsoft will be on a four year cycle again and I believe we will see game quality drop for another year or two when games could innovate and advance with current hardware and the online space for another couple of years. For the gamer in me, I actually hope this console generation targets a seven year run. Even the technologist in me wants to see architectures like Larabee for a year or two on PC before they are on consoles. I guess we will find out in the next two years.

Posted in Industry Commentary | Tagged | 1 Comment

Build testing lua script (in progress)

As mentioned before, I am working on a quick script to generate project files in order to evaluate what build program I am going to use. The initial script hasn’t been that hard to write and I have been generating some projects to test with CMake.

The things that I have remaining to really make the script useful are:

  1. How to do cross file inclusion?
  2. How to test compile/build times with each build system?
  3. How to post code?

How to do cross file inclusion?
There are some easy ways to do this and some really involved ways. For simplicity sake I think I am going to leave the inclusion as is for now in sort of a “best case” scenario until I can time the different systems. Then I think that I will simply pick a random selection of headers to include in each of the files that is shared between each project time that I generate. The ideal would be to follow some of the techniques from Lakos’ Large-Scale C++ Software Design that is on my “to read” list.

How to test compile/build times with each build system?
For my usage of this script I think that I’m going to just want to run a scenario and get all the results back. I’m finding that it is easier to edit the actual script file rather than doing a bunch of complicated command lines (glue/scripting languages are great for fast iteration) so I think I will actually combine the timing script in with the generation script. It should be fairly easy to get the times in lua to the second at least (I don’t mean profiling lua although that might come in useful later). So, one script but one of the issues I am running into with CMake and will probably have to look at with other tests is if I am using the same compiler and compiler flags or if this is just part of the test. I think I’m going to start with apples to oranges tests with the CMake file stuff at least but I will have to keep in mind if I will have a requirement for cross platform compilation on one machine. If I do have to cross compile, XJam might be a new contender. I also haven’t tackled the generation step of CMake within lua. I’m interested in any feedback on people that have done this.

How to post code?

Finally there is one other peculiar issue I didn’t really think about when I signed up for wordpress, I’m not sure the best way to post code snippets on this site. It seems like I can only post images, video and audio and not a good old text file. I think that something like Source Forge or Google Code are a bit of over kill for one file. In the short term when I think my code has the above described functionality I might dump it in one of those, but for now I will try and include it below for those interested and hope that it comes out looking ok. Keep in mind this is my first lua program so if I am missing anything long time lua programmers would recommend for style or ease of implementation, I am all ears.

— buildtest lua script
— Public domain C++ project generator for testing build systems from igamemaker.com
— You are free to use this in any way you see fit and any use of this
— code is at your own risk.

— ABOUT
— Version 0.1
— Currently the only thing working is the number of libraries and they are
— not currently doing cross library or even cross file inclusion so this is
— the most simple dependency possible.

— USAGE
— Use is basically lua buildtest.lua, you can specify the lib numbers on
— the commandline, but it is probably better to edit the GLOBALS section of
— the script

— TODO
— – Clean up code for distribution
— – Addin executables
— – Factor in a way to do multiple build files (JAM,KJAM,SCONS, etc.)
— – Find a way to time and test the builds (same script or separate?)
— – Determine if CMake always needs to regenerate files etc.
— – (time generation for add/removing files)

——————————————————————————-
— Functions ——————————————————————
——————————————————————————-
function createDir(dirname)
io.write(“Creating directory…”,dirname,”\n”)
os.execute(“mkdir ” .. dirname)
end

function writeProject(prefix, paths, filenames, filecontents)
for i, v in pairs(paths) do
createDir(prefix .. “\\” .. v)
end
assert(#filenames==#filecontents)
for i, v in pairs(filenames) do
outputFileName = string.format(“%s\\%s”, prefix, v)
local outputFile = assert(io.open(outputFileName, “w”))
outputFile:write(filecontents[i])
outputFile:close()
end

end
——————————————————————————-
— GLOBALS ——————————————————————–
——————————————————————————-
NumExes = 1
NumExeSourceFiles = 5
NumLibs = 25
NumLibSourceFiles = 500

if #arg > 0 then
NumExes = arg[1]
end
if #arg > 1 then
NumExeSourceFiles = arg[2]
end
if #arg > 2 then
NumLibs = arg[3]
end
if #arg > 3 then
NumLibSourceFiles = arg[4]
end
— TODO add asserts that these are actually numbers, do better parsing

io.write(“Generating project with “, NumExes, ” exes,”, NumExeSourceFiles, ” src”, “\n”)

math.randomseed(3) — Used to grab random header and function inclusions
— Generate Libraries
headerList = {}
local directories = {}
local fileList = {}
local fileContents = {}

fileList[#fileList+1] = “CMakeLists.txt”

fileContents[1] = “cmake_minimum_required(VERSION 2.6)\n” .. “project(BuildTest)\n” .. “include_directories(.)\n”
for iLib = 1, NumLibs do
directories[iLib] = string.format(“Lib%03d”, iLib)
directory = directories[iLib]
fileContents[1] = fileContents[1] .. “add_subdirectory(” .. directory .. “)\n”
— createDir(directory)

cmakefilename = directory .. “\\” .. “CMakeLists.txt”
fileList[#fileList+1] = cmakefilename
cmakefileContentIndex = #fileContents+1
fileContents[cmakefileContentIndex] = “add_library(“..directory..” ”
for iLibSrc = 1, NumLibSourceFiles do
— Header
hfilename = string.format(“%s\\LibSrc%03d.h”, directory, iLibSrc)
fileList[#fileList+1] = hfilename
fileContents[#fileContents+1] = (“// Generated header file\n”)

— Source File
filename = string.format(“LibSrc%03d.cpp”, iLibSrc)
fileList[#fileList+1] = directory .. “\\” .. filename
fileContents[#fileContents+1] = “// Generated source file\n”
fileContents[#fileContents] = fileContents[#fileContents]..”#include \<“..hfilename..”>\n”

fileContents[cmakefileContentIndex] = fileContents[cmakefileContentIndex] .. filename .. ” ”

— Function header and body
for iFunction = 1, 10 do
— Write out set number of function
functionName = string.format(“%s_Src%03d_Func%03d”, directory, iLibSrc, iFunction)
fileContents[#fileContents-1] = fileContents[#fileContents-1] .. “int ” .. functionName .. “();\n”

fileContents[#fileContents] = fileContents[#fileContents] .. “int ” .. functionName .. “()\n”
fileContents[#fileContents] = fileContents[#fileContents] .. “{\n”
fileContents[#fileContents] = fileContents[#fileContents] .. “\t return 0;\n”
fileContents[#fileContents] = fileContents[#fileContents] .. “}\n”
end
end
fileContents[cmakefileContentIndex] = fileContents[cmakefileContentIndex] .. “)”
end

writeProject(“cmake”, directories, fileList, fileContents)

Posted in Technical | Tagged , , | Leave a comment

Art training – Speed modeling

I have always had an interest in Art but most of my time and effort has gone into programming. Art creation fascinates me. One of the reasons I started this blog was to force myself to do everything needed to make games in order to live up to the I, Game Maker moniker. I’m looking forward to developing my art skills!

When thinking of the best way to proceed to develop my art skills in the limited time I have, the thought of speed painting or speed modeling came to mind (I first ran across speed modeling on 3dtotal). Based on my self assesment of my skills, I think I would get more mileage out of speed modeling so that is where I will start.

What are the rules for speed modeling? For myself it is going to a rapid 5 minute preparation that will involve gathering an image or two and thinking of what I am going to model followed by a 10-15 minute modeling session. Then I have to post whatever the final model looks like even if I don’t like it! That way I at least show my progression even if I am embarrassed with the end result. Since this is focusing on modeling, I’m not texturing to start, form is all that matters.

Modeling application – I’m going to be modeling with Silo as I find it a very fast modeling program even though I still consider myself a novice user.

Modeling topic – I have a feeling my first game is going to be a space theme so I’m going to start with starships.

Results

Tie Fighter

Reference

Results

B5 Shadow Vessel

Reference

Results (didn’t finish in time)

At the end of the day I’m not happy with the models, but I am happy with the progress that I did in 15 minutes and I do think this is going to be a good training exercise to develop my almost non-existent modeling skills.

Posted in Speed Modeling | Tagged , , , , , | Leave a comment

Technical Foundation

The following is what I consider the bare minimum list of things that you need to look for when you are starting a game project.

  1. Build system
  2. Revision Control System
  3. Supporting libraries or engine

There are many things people like outside of the above list, but the minimal ingredients that should get you going are listed above. The other thing that I want to be clear on is one of my quirks: I hate software that needs to be installed or version matched. I much prefer tools and libraries that are essentially independent.

Build System
Many times in the games industry the build system is considered a task for junior engineers, however I find that some of the people I respect the most in the industry realize how important a healthy build system is and give it the attention it deserves. The difference a consistent, correct and fast build system makes is the life line of a production. Selecting the right build system can be a challenge. What do I need?

  • Required: Correct C++ builds with dependencies, ability to expand to arbitrary data
  • Nice to have: Test support, Cross platform support, multi-core builds
  • Not currently relevant but might be in the future: Distributed builds

I have worked with Make, Visual Studio, NAnt, Incredibuild and SN-DBS in the past. I would like to take a look at JAM, KJAM, CMake, MSBuild and SCons.

Power of two games had a great post listing the challenges that they went through with SCons. That post was a bit of an inspiration for me to evaluate the above listed build systems. I plan on writing a script to generate some projects so I can compare the usage in all the above (even though Noel already posted his). I will post that when I have a bit more progress. I’m planning on starting with CMake since it can generate the most options and then adding in JAM/KJAm since they look the most promising.

Revision Control System

Doing a project without revision control is like jumping out of an airplane without a parachute. With freely available revision control systems no project should go without revision control. Ideally your revision control should be on a remote server and backed up (just in case you have a fire or some other tragic data circumstance like a drive failure).

Although there are a few revision control systems out there, to me their are only two choices: Perforce and Subversion. I have years of experience with Perforce and since I am working on my own, their free version works for me so the cost of the commercial version isn’t a factor yet. However, I have heard of more success using Subversion for remote development as Perforce works better when connected to the server. Simply as a learning exercise I think I am going to start my project with Subversion.
Supporting Libraries or Engine

The libraries or engine that you choose to use is mostly based on the type of game that you are building and the amount of features you want to build for yourself. My main intention with this site is to live by a “get it done” kind of motto, so my choices will be based on what I think is the fastest way for me to get started. I believe that most games, regardless of what they evolve to, can initially be prototyped in 2D so I am going to start with that kind of game.

The PopCap game framework has almost everything that I need: 2D Sprite rendering, Music, Audio, Font rendering, wide platform support. The only downside is that it is only for Windows. But hey…if I make something that sells I could always license the Mac version or write it myself.

Outside of the Popcap framework there are a few other libraries that I am interested in that fit my “works without support library” rules.

  • LUA: For scripting and faster iteration, I am interested in adding in Lua scripting support to my game
  • Box2D: For physics. This might be over kill and I will have to see if I need this or not for my game concept
  • SQLite: For saves/game data. Again might be over kill but would be a good learning project

Summary

I will be investigating what build system to use based on correctness and iteration times. The revision control system will be Subversion and I will be starting the project using the PopCap framework.

Posted in Technical | Tagged | 2 Comments

What is a game?

One of the things that I struggle with in my own projects is defining what a “game” means. To get a more official word on what a “game” is I decided to check out what Merriam-Webster had to say on the definition of a game. The relevant portion was short and sweet: “activity engaged in for diversion or amusement”. This description gives a broad range in what being a game means. I will break down what this definition means for me and for this site on what a “game” means.

The key word differentiating a game from other forms of entertainment is the activity portion. The following is a break down of the definition of activity:

  1. the quality or state of being active
  2. vigorous or energetic action : liveliness
  3. natural or normal function: as a: a process (as digestion) that an organism carries on or participates in by virtue of being alive b: a similar process actually or potentially involving mental function ; specifically : an educational procedure designed to stimulate learning by firsthand experience
  4. an active force
  5. a: a pursuit in which a person is active b: a form of organized, supervised, often extracurricular recreation
  6. an organizational unit for performing a specific function ; also : its function or duties
When looking up activity I didn’t think that it would really map well to the gaming space, but these definitions really do lead to some interesting question.
Lets start with the state of being active. The least active product that could potentially be called a game I can think of is Progress Quest. In Progress Quest you simply have to have the program active in order to participate, it does the rest. To me this tests the boundary of what it means to be “active” as a player. Is simply showing up enough to count as a game? For my belief in games, no this is not enough. However, progress quest does push the boundaries as the competitive aspect of keeping the client running can actually be seen as a contest. From my point of view running an application cannot be considered a game, the player must interact with a game on regular basis.
Vigorous or energetic action is usually what a game character is involved in, but there are some games like Wii Fit or Dance Dance Revolution that have the player involved in vigorous or energetic action. These types of games really get the player up and active, but that isn’t the type of game I want focus on. I believe a game should be a good game independent of its input system. DDR or Wii Fit could be played with an input system that isn’t as physically engaging and would still be games.
The third definition seems to map to games like The Sims or Serious Games. I think the simulation of reality is an interesting pursuit, but ultimately I like the definition of games being a diversion or amusement. This means the focus of games at this site will not be morality tales or simulations of realistic activities.

I don’t find the other definitions of activity map well to gaming. So the boundaries that we have defined so far is that you have to have frequent interaction with the game (strategy or email games like Laser Squad Nemesis would push the boundary of this). I’m not interested in the specific input to the game for activity as a game should stand on its own merits. And finally I am not interested in simply making a simulation of a known activity but I do believe that games can be educational.

After all that analysis, more has been eliminated than defined for what a game is. Rather than basing game on the broad English definition, next time I write on game design I will go with game definition through some of the history and evolution of video games.

Posted in Game Design | Tagged | 2 Comments

What is this blog all about?

It all really started with me sitting in front of an Atari 2600 and falling in love at the age of four. This story could be an example achieving your childhood dreams from a great book The Last Lecture, but somewhere along the line, the games industry changed a little to not match the dream I had as a four year old. Back then a programmer really did everything on a game: art, sound, design, game play logic. I currently work in the games industry and these tasks are now spread out over fifty or more people. I want to test out what I can do on my own to see if the advances in game creation tools and the availability of information means that it is still possible to make great games on your own. I still love my day job making games, but I want to try projects of my own making. Succeed or fail, I will be learning and sharing along the way. So begins I, Game Maker.

Posted in Uncategorized | Leave a comment