User customization is the most important tool for creating player narratives. And I’m not talking about just hats and colored shirts. Remember in Deus Ex where you A) roasted those soldiers with your Willie Peter rockets, B) took out those soldiers by luring them into your minefield, C) snuck by all those soldiers without firing a shot or Z)…
Our best stories, the ones we tell incessantly to our friends, are created from user choices. We all love a great narrative, but it’s even more fun when we created it!

A quick intro: My name is Kee-Won Hong, and I’m a brand new indie developer working on my first title, Contract Work – a Kickstarted project that recently went into early public beta. It’s a cyberpunk shmup, mixing the action genetics of retro 2D shooters with the customization of modern action-RPGs, creating something that allows people to play in the way they’re most comfortable.

From the beginning, it’s been a game about player-generated stories, and that’s why it’s built around a powerful customization system: powerful for users in customizing a character, and a powerful tool for me as the content creator. After of six months of development, I’m happy to say that the system is doing a lot of what I want it to – it’s not perfect, but it’s the most exciting feature of Contract Work and should only get better. Here’s how I did it.




The Design

The first choice is whether you’re going to require users to have skills to get other skills (the skill tree model) or if you’re going to allow users to get any upgrade as long as they can unlock it. There are great reasons for going with a skill tree, but for Contract Work I wanted a ‘pay and play’ system – you can add any skill as long as you can pay for it.

The second thing to think about is how you want to implement your customizations. The simplest is just a +stats system (e.g. level 1 weapon skill gives you +10% damage). The more complicated option is to have upgrades unlock unique effects or abilities (e.g. flaming rockets set targets on fire). Numeric upgrades are much easier to implement, but players will generally enjoy/remember unique unlocks more. Contract Work uses a combination of both, in a ratio of one unique upgrade for every ten numeric upgrades.

You want to think about how you can add depth without adding complexity – more interaction at the point of unlock, but without increasing the user control workload. Implicit combos are a great example. In Contract Work, you can upgrade EMP grenades to carry a hack virus, which means all the upgrades you put into your hack programs can be transmitted through that virus. Gamers love thinking about and discovering combos! However, any time your upgrades requires users to learn more controls, try to implement that benefit in a simpler way. For Contract Work, I followed the rule that an upgrade could not add any new key binds.

Finally, figure out how your users are going to unlock your upgrades. For maximum effect, force players to make decisions about what they unlock. A customization system where you can get everything really isn’t a customization system!
Contract Work does this in a couple ways. Firstly, all upgrades cost money, and the better ones cost more, so you have to budget. Secondly, the selection of available upgrades is randomized, so every playthrough becomes unique. It creates those ‘deliciously’ brain-wracking scenarios where you only have enough money for double damage for your railgun or super fast hacking, knowing that you might not see either upgrade for the rest of the game!




The Technical

I don’t want to bore non-technical readers, so I’ll describe the technical guts from a high level (you can always e-mail for more details).

All upgrades are kept in a global container that I can easily access, so at any time during the game I can find out if a player has a certain upgrade. The upgrade object is built to be flexible; I can easily add attributes to it, like specifying it only works for a specific weapon/class. All the upgrades are stored in one list – I started with lists specific to weapons/abilities, but it was easier to keep all the upgrades in one list and sort by attribute (the full list isn’t referenced often, so it’s not a performance hit).

In addition, the upgrade list is one object that could be downloaded dynamically if needed (this makes pushing balance updates easier). As your rule of thumb: make your system flexible, because it’s going to make your life easier down the line.


The Results, The Future.

For the initial release of Contract Work, I launched with over 100 perks – six for each weapon and ability, and about 30 ‘general’ perks. Based on user feedback, there are a few things I’m planning to add and improve:

  • Price balancing – since the initial release, I’ve reduced the price of all upgrades by 50 percent, to give more flexibility when people are shopping.
  • Entry level classes – this is based on the feedback that it takes a while to be able to create a character based around stealth or hacking. I’ll be adding entry level classes that let you specialize in one of those areas right away by giving you a few random perks in that area.
  • Subcontractors – this is a way to add a little more control to the upgrade randomization described above. If you want to focus a specific set of upgrades, like maxing out your Laser Cannon or Hacking, you can hire a Subcontractor who will sell you those upgrades specifically. It’s less cost-effective, but lets you focus in a specific area.
  • Class specific upgrades – ties upgrades availability to a specific class, another attribute on my upgrade objects to check.
  • Expanding the hacking and skills – Contract Work started as a shooter, so the hacking and stealth options are thinner right now. The flexibility of the system should make it easier to add many more upgrade options in these areas, making them more viable choices.




There’s a lot of work to be done, but thankfully I won’t have to re-write my system to accommodate them. Instead, the bulk of the work fits into the ‘fun’ part of game design – dreaming up more fun upgrades for users to use. A good goal for any customization system is to make creating/adjusting upgrades painless because it makes it easy to give our players more options on how to play. And, as Sid Meier, puts it: “A good game is a series of interesting choices.” So let’s give our players those choices, and let them write their stories!


Kee-Won Hong started working on games in his spare time at school almost 15 years ago, blooding himself on the Half-Life and Unreal Tournament modding scenes. He recently worked for Chicago-based Toy Studio Games, of Mahjong Solitaire fame, before moving into full-time development on Contract Work under the name Iterative Games.