Experience sci-fi tactical combat and exploration in a procedural world that combines traditional roguelikes with an immersive modern interface like no other. Build yourself from components found or salvaged from other robots. Attach power sources, propulsion units, utilities, and weapons to become a slow tank bristling with weapons, or a fast-moving flier zipping past enemies before they even have time to react, or a stealthy sword-wielding assassin/hacker, or whatever else you can come up with from the salvage you find. The situation can quickly change as you lose components and rebuild yourself from enemy remains. You are the Cogmind. Discover what that means as you explore a living, breathing world ruled by robots.
Whew! I've finally finished putting together all the achievements-related features for Cogmind! As a large single system I'd like to provide a rundown of the whole process and reasoning here on the blog. It'll be divided into two articles, this first one exploring achievements in general, how they were selected and organized, icon creation, and underlying implementation. Next time I'll cover meta aspects like the UI and Steam integration.
I certainly spent a long time on this feature, so I guess the first question that comes to mind is why add achievements at all? In my case the answer isn't simply "it's just something games on Steam do to sell better" (although Valve recommends them for this reason :P), because after all Cogmind achievements are available to non-Steam players as well, and throughout development my focus has always been first and foremost on making the non-Steam version the best it can be as the "primary version"--Steam is simply a distribution platform.
When first starting out with achievement work, to help guide the development process I came up with my own list of reasons for adding them:
Although achievements are available both on and off Steam, having never played a game with achievements (or used Steam in any serious gaming capacity) I did have to spend some time researching how Steam handles them as well as how other devs have chosen to use them in their games. You'll see this information come into play a little more later, but starting such a big system without a decent plan laid out in advance is just asking for trouble.
A more specific area for early consideration was how to treat difficulty levels. Cogmind has multiple difficulty settings, so how do achievements work in relation to those? Here I thought through three different approaches:
Cogmind has a lot of achievements, and any time you have a lot of something it can benefit from some organization. I divided achievements into six categories, which comes in useful when there's a need or desire to filter or sort them, or even simply to assist with quicker recognition of an achievement's icon.
Some categories also further subdivide their achievements into "tiers" where appropriate (higher tiers being more difficult), similarly aiding in recognition and differentiation as we'll see later with the icon design.
Initial category distribution for first batch of 256 achievements.
Notice that these categories somewhat roughly align with the six reasons for adding achievements listed earlier, which probably isn't a coincidence :)
I didn't have any specific goal for the total number of achievements, just wanted to come up with what seemed like a pretty good variety covering as many aspects of the experience as possible. And while I could've eventually put together a large selection on my own, the process certainly benefited from player suggestions! Long before I started working on achievements, there was already a forum thread where players could submit ideas, and one of my very first actions when starting achievements work was to read through the entire thread and harvest any ideas compatible with both Cogmind's architecture and my aims for achievements, in some cases modifying them where necessary.
Aside from of course thinking up a fair number of achievement concepts from scratch based on my own play experiences, I had a couple other outside sources for inspiration as well:
Coming up with a good set of achievements was a very gradual process of adding new ones to the list and making repeated passes over that list to group them by likely category, although this was before the final categories were determined so it involved a bit of back and forth. At first there were a lot of uncertain achievements organized into tentative categories, and later on the appropriate categories (and specifically their names) became clear, further helping flesh out and finalize the achievements.
Even within categories there are subcategories. I mentioned tiers earlier as a form of subcategory, but for determining which achievements to add, more important than difficulty-based subcategories are type-based subcategories. For example the rather large Mechanics category is broken down into general mechanics, combat mechanics, alert, interactive machines, machine hacking, robot hacking, information warfare, flight, allies, and more. (My earlier summary of Style-related achievements also happens to essentially reflect a partial list of its hidden subcategories.) This level of subcategory was created purely for my own organizational and development purposes, though, there's no need to make them public.
Well, not public in the game anyway--may as well demonstrate here
how they appear in the game data for my own reference :)
Prior to building the achievements list I also set out some important guiding principles:
Again there was no target number of achievements, but by pure coincidence the final tally came to 256. It was originally 255, but after late-stage polishing I ended up removing a couple and adding a few :P. "Too bad" this is only the first batch--more achievements will almost certainly be added and end up ruining this rather appropriate number!
For now we can admire this number on the Steam store page.
The naming of achievements is important, but pretty straightforward so I don't have much to say about that other than pointing out the obvious: players like names that are fun/interesting/provocative/cool/punny/etc. There were plenty of opportunities to come up with a variety of names when there are so many achievements :D
Of course there are a lot more details to creating a good set of achievements beyond simply choosing and naming them!
While a lot of achievements are essentially binary ("player did X"), many others involve reaching certain thresholds, which usually means numbers. It was really nice to have so much score sheet data (including archives) and past analyses to draw on in order to set realistic values for these numbers.
Excerpt of run stats from Beta 4 (the full table includes 446,028 data points). Filtering and sorting this data is able to answer a lot of questions about balance and difficulty, suggesting potential achievement requirements.
I could adjust the difficulty of an achievement based on the precise reported performance of players in earlier Betas, and further informed decisions by recalling anecdotal evidence from player discussions over the years--I'm always listening to stories and this continues to help shape the game in numerous ways, the most recent example of which being achievement design. Being pretty familiar with the game myself (I'm decent at it and enjoy playing, too :P) also provides some important context for creating reasonable achievements for all skill levels. So in the end details emerge through a combination of hard data and subjective experience.
One of the things I wanted to avoid in the number department are a lot of repetitive achievements, as these aren't very meaningful. For example there are many different types of robots, but we don't need dozens of varieties of "destroyed 10 of this robot." In fact there are almost none of that type of achievement except where doing so is especially interesting, as with the Giant Slayer achievement discussed earlier.
Names can be fun and in a lot of cases not perfectly descriptive of the achievement, but descriptions themselves had better be clear. These I wrote (and sometimes rewrote, on later passes) with a mind towards "what are players going to ask about this achievement?" "What's not clear?" Once descriptions have satisfied that condition, they're also checked for consistency of tense, grammar, style, etc. (basically what should be done with any game writing :P), and at the end I ran a spell check on the final set to ensure no typos were overlooked.
Steam achievements don't have a wide range of functionality, but do at least support marking an unearned achievement type as "hidden," which shows only its name and whatever icon is associated with that state. (Or on the global achievements list for a game it'll show the achievement's icon and name, but still no description.) This offers some interesting possibilities, so I enabled the same feature in Cogmind and in order to take proper advantage of it spent some time thinking about reasons for whether or not to hide an achievement:
When creating an achievements list, my approach was to "assume hidden is the default state, what should I hide?" But another game might take the opposite route and come out with different results, i.e. hide everything and only reveal what's absolutely necessary (or nothing at all?).
Some players might even prefer this, because then they feel less obliged to play in a specific way and either all the achievements are surprises, or any descriptions that do exist might instead just be indirect clues to figuring out what that achievement requires. This would allow for an extra sense of accomplishment on earning one, but I decided not to have any like that for now. Maybe in the future as a fun expansion, depending on how players fare with the initial batch. (Note their icons could also contain clues, or not since icons for displayed achievements before they're earned can be non-specific.)
Of the final set of Cogmind achievements (as of Beta 6), 31.2% are hidden, exactly half of which are for plot-related reasons. Therefore 15.6%, or about one-sixth of all achievements, are hidden for one of the other reasons.
Initial hidden setting distribution for first batch of 256 achievements.
Oh my... When you've got 256 achievements, not only do you need good names and descriptions, but also a whole ton of icons to represent them!
At least ASCII art is fairly quick to produce, and I didn't have a choice with the style anyway, because 1) I am not capable of producing anything else decent, and more importantly 2) all of Cogmind's art must be CP437 in order to fit in the game (remember that Steam is the sideshow in this system--the game itself has even more achievement-related features).
I did, however, have to ensure from the start that icons would also be compatible with Steam. Their system requires 64x64 JPGs, in which I can fit up to a 5x5 grid of 12x12 pixel ASCII (12px happens to be the default size at which I draw ASCII art), so 5x5 it is.
But icons also need a border, and inserting a border into a 5x5 grid means all that's left for content is a 3x3-cell interior! This seemed ridiculously limiting, especially for "abstract" achievements, so after coming up with the initial list of achievement ideas I went through each category and sketched about 20% of them (since each category represents a different set of concepts). It started out well enough, and wasn't nearly as time-consuming as I'd feature it would be, either, so amazingly it actually seemed like this would work out in the long run. Limitations leading to interesting results is basically a cornerstone of Cogmind development, and this ended up no different :P
Thanks to REXPaint the drawing part was quick and easy, but it took longer to both establish the symbolism and ensure it was consistently applied throughout all of the icons. It was definitely fun working with the symbolism, and later when I started sharing batches of icons some regular players were pretty good at guessing the meanings of each, even without a description! (of course it helps greatly to have an understanding of Cogmind's ASCII mode...) So I think the system has worked out pretty well.
In terms of productivity, as usual it helped to draw all the icons over a very short period, making it less likely I'd forget some of the symbolism and either make mistakes that would need to be discovered later, or slow down the process by having to repeatedly review such a large collection of icons before continuing.
I also drew them all in a single file to make cross-referencing as quick as possible.
Cogmind's complete achievement icon spritesheet as it appears in REXPaint.
The code knows how to extract the icons and which is which.
Looking closer at the structure of individual icons, there are two main ways to differentiate categories: border style and color scheme.
Since nearly two-thirds (64%!) of the cells in an icon will be occupied by borders, they'd better be put to good use. Their first priority is to reflect an achievement's category--each should have its own unique style. The most basic category has the simplest style, but decisions for other categories had to take into account another factor: how many difficulty tiers would be required within that category. Some potential border styles naturally lent themselves to a greater range of modifications, making them more suitable for multi-tiered categories.
Before starting on the icons, I first designed a large collection of different borders, seeing which looked bad, decent, or good, and which could be expanded into a natural progression of multiple tiers. It's from that page of concepts that I'd pick the final set which best matched up with the requirements.
Achievement icon border style concepts. I generally started with an idea on the left and changed only one aspect of it for each new iteration moving to the right, or sometimes up or down if I wanted to try taking the concept in a different direction.
Higher tiers would need to look "cooler," essentially more intricate or elaborate. I eventually settled on this arrangement:
Final Cogmind achievement icon templates by category and tier, colored.
The Wins category doesn't use its full range as a "progression," as it has four border styles but only two tiers. The other two borders are for special subcategories of wins, specifically the core seven different win types according to plot, and challenge mode wins, so these have a different look from the tiered "special condition wins."
Border style is not the only way to differentiate categories--each has its own base color as well (demonstrated in the above template matrix).
Colors were picked with purpose. As an "extremely Cogmind" color, green is used for one of the highest level of achievements, Wins. As a "powerful, deadly" color, red is used for the special Challenges. As a category of "basic" achievements that don't really need to stand out, the Mechanics category uses dark amber (somewhat close to brown) as its main color. Colors for other categories were chosen for somewhat less specific reasons :)
Border colors for the templates are all dark, at 25% brightness (and backgrounds are even darker at 12%), but each category also has a base foreground color (100% brightness in the same shade) used for generic content like numbers. This way the numbers, as secondary bits of information, are somewhat connected to the category and background/border itself, at least more so than most other elements that make up the interior.
A sample of Style category icons with generic number components highlighted.
Most foreground characters are all quite bright as well (usually 70-100%), so while the border and background colors serve a supporting and informational role, they don't take over the entire icon.
As for icon interiors, colors used there are drawn from Cogmind's ASCII mode where possible, although in some cases alternatives were needed where a concept is not already associated with some specific color (sometimes required for abstract icons). Again though, in all cases colors were chosen with purpose, and where a concept is repeated across multiple icons those colors are applied consistently.
Locked achievements need a display icon as well, and there are about three ways to handle them:
Locked achievement icons.
Note that locked icons also reflect the relevant tier--essentially these icons are equivalent to the templates, with the interior replaced by dark question marks.
As for those PNGs, they are exported from the game via debug command in order to convert them from the internal format and assign proper file names. This isn't necessary for the default DRM-free version, but again Steam requires that achievement icons be 1) JPGs, and 2) 64x64. So I created a tool to output all icons, then use Photoshop to batch convert from PNG to JPG while also adding a 2-pixel black border around each (since in Cogmind their dimension is 60x60).
We've got names! Details! Descriptions! Even icons! But... achievements also need to actually make their way into the game :P
Once all the data and resources were defined and ready, next came the code and systems.
On an individual level each achievement is pretty straightforward to implement, being a quick check for the condition and corresponding call to a method to assign it if applicable. This process was made even easier by the fact (mentioned earlier) that a fair number of achievements are based on the existing score sheet data, which itself already tracks many hundreds of conditions and stats throughout a run. Implementing a related achievement could take as little as a minute or less since I don't have to search around for or confirm the right location in the source--just ctrl-f for the appropriate stat name!
Of course some achievements required new stats that I hadn't been tracking, so throughout this process I also ended up expanding score sheets by several dozen entries where it would help. In yet other cases some achievements required whole new internal variables to track special conditions in more complicated situations, basically those which had to be confirmed at more than one point in time to award.
Note that most games will actually use Steamworks' stats system for this kind of thing, but Cogmind has its own internal stats system so I could more readily use that, plus I wanted non-Steam Cogmind to fully support achievements as well, so relying on Steam for any help wasn't an option anyway.
Checking the internal stat value for whether to attempt
to award the Assassin achievement ("Sneak attack 15 hostiles.").
The above code doesn't do any heavy lifting because control should naturally be as centralized as possible to make any potential changes easier to implement down the line. So additional generic checks and the actual achievement award itself are handled by that single earnAchievement() method:
For now I've decided to not hand out achievements to brand new players, to help them focus on the tutorial messages and avoid overwhelming them with even more information in an already daunting interface.
I was originally thinking of ways to save on development time throughout all this, and seeing as a lot of the achievements were so straightforward, one of the possibilities was to... skip testing. Nope--too difficult to go against my standard practice of manually testing every little feature, so I tested all 256, too xD
Only a tiny percentage didn't work as implemented, but it's better to make sure they do rather than have so many players scratching their heads, or reporting bugs I could've easily found on my own. Setting up testing conditions was extremely fast with debugging commands anyway.
The final step was to integrate achievement data into score sheets as well, which I did in three areas.
Like gallery collection and lore percentage, at the bottom of the sheet in the section for general game data there's a new "Achievement%" which keeps a running tally of the total number of achievements earned so far, out of 256.
Cumulative achievement progress in a Beta 6 score sheet (recorded from one of the prerelease testers' runs).
Like the other two, this percentage is a fun and useful indicator of overall progress.
There's also the full list of achievements earned for the first time specifically on that run.
An achievement list as it appears in a score sheet.
And although it's possible to count the number of achievements in that list to get a total, the tally for the run also appears as its own entry in number form with the regular stats. This is more convenient for players looking for a quick count, and also for me when I run the data analysis since no extra work is needed to extract the number of achievements while analyzing global stats.
The final feature tacked on at the end is a way for players to reset all their achievement progress for whatever reason (without losing their other meta data in the process). It's a text-only advanced config option, but unlike other options this one is only discussed in the manual, not even listed in the config file itself, because players had really better be sure they want to do this and not accidentally trigger it. Manually adding "resetAchievements=1" to the file will tell Cogmind when it next starts up to erase all achievements.
I'm glad all this achievement work was handled late in development, i.e. after the core game content and features were completed, because it would've been much more likely for achievements to become a disorganized mess over time if it was added too early.
And I'm happy with the results--there's something for every skill level, and players appreciate them. Achievements are a great high-value meta feature (so yeah, no surprise that lots of games offer them, and Valve highly recommends adding them, too).
And that's it! Next up is another piece on how to provide ways for players to monitor and learn about their achievements, and hook everything up to Steam...
Time to start achieving! While Beta 6 brings with it a ton of other improvements and tweaks, the big new thing is a large collection of achievements to...
256 achievements are completed, each with their own icon, fully tested, and with a dedicated UI under construction. Also talk about AFD mode, the extensive...
About progress towards the upcoming release, to include a huge number of achievements... and a bunch of other features as usual. :)
No articles were found matching the criteria specified. We suggest you try the article list with no filter applied, to browse all available. Join now to share your own content, we welcome creators and consumers alike and look forward to your comments.