Updated: Aug 22, 2019
Ever since beta dropped (and yes, the camera clipping fix did make it in, thanks for asking), I've been working exclusively on achievements. As I've said many times before, achievements are good because they give a tremendous boost to the single-player experience, add replayability, and are supported by Steam. I had a blast coming up with a list of them, all named using a suitable cow-themed pun, and now that nearly all of them are implemented as well, it's time to share.
Just a quick note, if you want to read a much more in-depth blog post about this, even bordering on a how-to, check out https://www.gridsagegames.com/blog/2018/05/achievements/ and https://www.gridsagegames.com/blog/2018/05/achievements-ui-design-implementation/. I stumbled upon them when first looking for information about implementing the Steam part (I don't know why I'm always so surprised that there's so little official documentation for these things), and they helped guide a few of my own ideas.
Alright, my list has achievements that are progress-related ("play on every map"), score related ("complete a quick game with at least X cows"), and at least one that deals with each map or game mode. They also run the gamut from "will be unlocked naturally with play" to "require feats of skill" to "probably need to be sought out" and even "purposely do badly to unlock" for a little extra comic flair. And of course, there's a master achievement for having unlocked all the rest.
My game has a dedicated achievements menu. Each page shows four achievements, their names, descriptions, icons, and a progress meter when applicable. I decided not to make any "hidden" achievements, so you can come to the menu and look up exactly what is required, and for things that carry over between games, see how close you are. (I.e., if you're trying to "shoot 500 times", you'll get an XXX/500 readout up until actually unlocking it). Everything is faded out, but still visible, until it is unlocked. It's a Steam requirement that each one have an icon, in both locked and unlocked variants. Usually, unlocked will be full color while locked is either black and white or muted, but I decided to reduce my work by making a generic locked picture that I could use for all of them at once. I also have so far managed to create all of the achievement artwork by taking screenshots of the models and UI I've already created for the game, to reduce my own headache.
I made two additional design decisions regarding achievements. First, only Player1 in the game can unlock them. So if we're going for the epic "abduct 500 cows", only Player1's cows get added to that total, so you can't grind in a 4-player match. Second, achievements are only checked and unlocked at the end of every game match. Indeed, any one that starts "win a game where..." could only be checked at this time, but the abduction one could happen at any time mid-game. Most games would check for this and pop up a notification as soon as the action happens, but I decided that I didn't want to risk my game's performance any more than was necessary. Because I would need to check for unlock after every abduction, every shot, every lure...and at a bunch of other times, you can imagine. And if I do need to unlock then, well, I need to force a save, hit the external text file... Much better to just keep counters for player actions (which would be necessary anyway), then iterate through and check the entire list at once at the end, while the game is sitting on a non-intensive menu. This comes with the added effect that, if you quit the game midway, you don't get credit.
Since the game was mainly done otherwise (new map art assets excluded) when I started this, I wanted achievements to sit on a layer on top of everything else and be as unintrusive as possible. This meant keeping a separate class with a whole slew of public static variables that the other gameplay classes could hit and update whenever necessary with no hassle. The next step is to actually add Steam integration by pinging the server at the same time I'm unlocking them in my game, and keeping everything separate will make this easier as well. ...But that'll be part of a future blog so stay tuned!