A Celebration, Some Closure, and Giving It All Away

2023 marks my 40th year in the games business, making games pretty much continuously since 1983. Yes, I’m old. To mark this auspicious occasion, I’m hanging up my debugger and retiring from game dev (yeah, right). Obviously I’m still gonna mess around with the odd prototype here and there (told you so), but I don’t think I have another full project in me. My last published game, Immortal Darkness: Curse of The Pale King, was the best, most satisfying project I ever got to work on in my long career. Given the resources I had at the time, it’s as close to the game I always wanted to make, as I could get. Because I’m retiring, I also retired the game from Steam, and now I’m giving it away for free so more people can play it (link below). Think of it as a Holiday gift. I’m proud of the game and I reckon it’s a good project to end on.

You can download the game from here;

immortaldarkness.com

Because this silliness involves my game, I planned on writing a Gamasutra blog as a followup to the other dev blogs I’ve posted on there. Sadly they shut their blogs down, so here it is below instead. Enjoy!

——————

I originally wrote a series of blogs over on Gamasutra, about developing and publishing my game, Immortal Darkness. I want to talk about what’s next for the game, getting closure, and moving on.

We published Immortal Darkness in November 2018, to high hopes and expectations. If you read my last blog post on here, you’ll know that things didn’t really go as we hoped. The game languished and the company we set up to develop the game, withered and died. People went their separate ways, and I ended up owning and managing the game personally. The game has sat on Steam for the past 4 years, now selling a couple of copies a month, and slowly falling into neglect. The version of Unity the game was developed on is old and tired, and there were cracks showing. Updating the game on the Steam store became a problem, and its issues and need of a refresh sat in the back of my head, pecking at me to do something about it.

I’d not played the game for a long time, essentially ignoring it and hoping it wouldn’t break. But then one evening about 2 months ago, I randomly fired the game up and spent a satisfying and enjoyable 4 hours playing through the first 6 levels or so. That play session brought back a lot of good memories and also a little sadness, of dashed hopes and dreams not realized. We’d planned a sequel, with even grander scope and story, but that all hinged on the success of the first game, which sadly never happened.

When we decided to make the game originally, it was very much a passion project. Something my partner and I had always wanted to make, and so we poured everything we could into its creation. We were just 2 guys with very (very) limited resources, and development was slow and difficult. Both Damon and myself are old pros with careers going back to the 80s and 90s. We knew what we were getting into when we started the project, and we were seasoned enough to push through all the hard stuff, and ultimately we pulled it off. It was never really about the money for me personally (well maybe a little), because I really just wanted to make something cool that people could play and enjoy. I love the idea of willing something into existence; creating something from nothing and having it become part of poeple’s lives and experiences. That’s always been a big motivator for me, creatively.

I wont rehash what I’ve said before too much, but when the game didn’t do as well as we hoped, and all the air got knocked out of us, it took a long time to recover. We questioned the quality of the game, the design, the art, the coding… but now the dust has settled years later, I think it was mostly a lack of exposure, marketing, community, and awareness. Not that any of that was the fault of the people helping with those aspects of the project, rather it was simply a lack of money. All the stuff you have to do, after the game is done and published, costs a lot of money, and frankly we were left with a pittance to spend by the end of development. My partner took it harder than me, putting an end to his indie developer aspirations, as he threw himself into his full time game dev job. For me, it was disappointing for sure. I wanted two things for the game. First, I wanted lots of people to play it and (hopefully) find some enjoyment in it; delighted by a trap or puzzle we’d labored over. Second, I wanted to do more. I wanted to build a small independent game dev studio, and make the sequel. I’ve had a pretty good career in the games business, spanning almost 40 years (yeah, I started in 1983). I have a long history of making games and being involved with startups, and I have nothing to complain about. I’ve done it all, and I’ve had a fantastic time doing it. But I still wanted to have my own, small, indie studio, making cool games that I wanted to make. That’s probably most developer’s dream. So that was the hardest hit for me, and despite being an old, cynical pro, I still had the hope that Immortal Darkness was that one lottery ticket, that if it hit, might fund my dream studio.

As I sat there, playing through puzzles and traps I’d completely forgotten about, fondly remembering the joy and pain, and challenges of coding them, it struck me that maybe I could still satisfy that first hope I’d had for the game, namely more people being able to play it. It was created to be played, after all. That’s its only real purpose, money aside. So I decided there and then that I would just give the game away for free. It would certainly be easier to do that than try and resurrect it commercially. It also fit nicely with my plan to retire the game (and myself), plus it’d make a cool, fun Holiday gift to everyone!

Fast forward 2 months and the game is finally available as “freeware”. I retired the game on Steam, and put up a website where people can download the game for free. Even this seemingly simple task took time. Fixing old bugs and tweaking stuff in the game, getting the game retired, winding down my partner agreement with Steam, making a website, creating EULAs and installers… But now it’s all done and the game is available to download and play.

Untangling the game and myself from Steam was a process. I had to post an announcement and assure Valve that the version of the game sitting in people’s Steam Libraries would continue to work as expected (it will), and that I will continue to offer support via email, etc. (I will). I completely understand the need for this. The customer is king (to a fault), and they have to be OK with the change in status of the game. Removing the Steam dependency freed me up to fix long standing bugs and make some improvements to the new, free version, including additional keyboard controls (WASD) that people had been asking for forever.

All that said, and as cathartic as this has been, I still believe it’s good to be rewarded for your work, and I’m not someone who hates money at all. I’ve provided several ways for people to show their appreciation if they choose, offering ways to “tip” using various payment systems. A big “Buy Me A Coffee” button is on the title page. It’s the only nag there is, and I don’t think players will mind it too much. Of course I’m not banking on it making any money. That’s not the point of this exercise, but it’s there if people want to use it.

So think of this as my Holiday gift to the world (Awww, bless). I hope you enjoy the game as much as we enjoyed making it. Cheers!

You can download the game from here;

immortaldarkness.com

Well That Didn’t Last Long!

Blogs are old fashioned now. Someone told me they’re like vlogs only in black and white. Funny stuff that! Everyone who’s anyone is doing a vlog, and blogs are dead. The way people consume information in this modern era is very visual and stimulating, and I’m not sure people even read nowadays. Sadly, I’m not good enough looking to do a vlog, and it’s also a lot more work than typing random thoughts into a text box in WordPress.

Looking around Youtube and following along with various dev vlogs, it seems that it’s more important to do the vlog stuff than it is to make the game. In fact, a lot of the vlogs I watch are of projects that will never be finished, and it’s more about the steady stream of noise to feed their “community” than making the game. Fair enough and all good, if that’s your bag, and that’s your goal. Vlogs and sharing your project on social media platforms is all part of building an audience, and a massively important part of making a commercial game. I get it, but no matter how hard I try, it’s not for me really.  I honestly don’t have the energy or time to make videos and edit them, and I absolutely don’t have anything interesting to share visually, or say even.

I suppose it really comes down to motivation and what my ultimate goal is. I’m motivated to make my game, but not share drivel about it on here. My ultimate goal is to make my game and sell a few copies. Does having a blog or a vlog help with that? It can, I’m sure, but I just can’t be bothered really. It’s hard enough making the game, without all the dog and pony show stuff. The really funny thing is, that I’m just talking to myself here, and no one gives a flying fuck about my project or what I’m doing, so the existence of this blog is even more of an anomaly. So why am I doing a blog? Honestly, I have no clue. So, I’m not going to be doing a blog any more. Too much of a distraction and not enough to say.

If you’ve read this far, you probably think I’m being mardy or something, or throwing my toys out my pram because no one is paying me any attention. Perhaps that’s true. Not sure I care. I’ll probably still drop the odd post here as the project progresses, but really, posting to Twitter, YouTube and Facebook will be enough. TTFN!

Back To It!

OK, my detour this past week into web site development has come to an end. Mission accomplished, and everyone is happy.

And so I turn my attention back towards my little game project. Hooray!

I was in the middle of coding various weapons, and so that is where I rejoin the fray. I have 3 weapons left to write before the weekend, which is scheduled to be 2 days of glorious housekeeping and game design.

I’m excited (weirdly) and looking forward to getting back to it.

The Best Laid Plans..

I have a fairly tight, albeit self imposed schedule on this new game project, and so far I’ve been doing OK, keeping on track, checking stuff off my task list and making steady progress. And then 2 days ago, I got a call from a friend in distress; Her website, which I built for her about 5 years ago, needed a good overhaul in preparation for new clients and an upcoming business opportunity.

She’d commissioned a family friend to do the overhaul, but things didn’t go so well, and 3 valuable weeks were lost to the wind. So with a scant 5 days before her deadline and big presentation, enter yours truly, reluctant hero to save the day. Poor Woman! Although this slightly derails my dev schedule, I’m happy to jump in and do the work. Did I mention I hate website development?

I’ll be back in a few days!

The Pickup Artist

After my lazy weekend working on the high score stuff, which I ultimately shit-canned trying to keep the game in scope, I got my head down to finish up the pick-ups and power-ups in the game. I’ve been working on in-game pick-ups the past couple of days. Pick-ups are bonus items like secondary weapons, power-ups, and points, that various enemies drop or get spawned by the game arena.

I don’t have an artist for this project, so I’m doing all the art myself. When I say “art”, I use the term very loosely indeed. If you knew me better, you’d understand why this is actually hilarious. There are a few special people out there who can do multiple things well. All singing, all dancing, plus juggling too.. “Triple-threats” or those unique one man bands who can draw and code and design in equal measure. I hate them all, because I can only do one thing well, and that’s code. I used to say that I pissed code when I was younger, because it flowed out of me so well, I guess. Now I’m old and things are slower and more mellow, I like to say I can code til the cows come home.

Anyway, what the hell has any of that go to do with pick-ups and power-ups, I hear you ask? Well not much actually, so lets get back to the point.

The game has a primary weapon, which is upgraded through power-up that the actual game arena will spawn. The player can rush to collect these, increasing the utility and power of their primary weapon each time.

There are collectible secondary weapons that are dropped by enemies the player kills during the game. These include a shield, homing missiles, gravity well, slow-mo, and “Death Blossom”. There are an equal number of offensive and defensive (CC) secondary weapons and they’re upgraded by collecting the “Power Crystals” that enemies drop when they’re killed. For example, each time the homing missile is upgraded, the number of missiles fired increases by one (up to a maximum of 4), with the final upgrade making the missile’s explosion have a blast radius that will kill multiple enemies, rather than just the one it hits. Additionally, there are pick-ups that will clear the warp and weapons cooldowns, bonus points, and “Super Power Crystals”, that give a big boost to your secondary weapon.

All of this work is complete (99%), and is ready to go into the game, and so the rest of this week is all about secondary weapons, because I need to code the weapons that the power-ups give you 😀 I’ve been looking forward to coding these for a couple of weeks because I think they’ll be fun to do and to tweak to get right. So next up is the “Wingman” weapon, which gives you a number of semi-intelligent helpers that protect you and help kill stuff too. A “Slow-mo” weapon that, well, slows everything down for a time. A “Gravity Well” weapon that bends bullet trajectories and swallows unwary enemies. And a “Death Blossom” weapon that is a weapon of last resort, and can only be used if you’re about to die. Obviously an homage to The Last Starfighter.

Gonna be a busy couple of days 😀

Building a High Score Web Service (Considerations)

As part of this new game, I’m planning on having a global high score system where players from anywhere can post their initials and have them displayed across all game instances, and on the game website. Technically, doing that is pretty straight forward. You have some code running on a web server that receives and processes HTTP requests, and depending on what the service does, it’ll stash data in a database or maybe produce an image or whatever, and return some response to the requester. Simple in concept, but to build and architect a service that can scale and handle abuse, is nuanced and not at all simple.

I’m not going to get into architecture or scaling here, because at the end of the day, how I solve that is really based on the resources I have available and my personal framework or scripting language preferences for the back end. And that stuff is ideology and whatever I use there will be someone with a man-bun telling me I should use the latest new Google framework. Meh! The actual web service I am building is very, very simple and a regular LAMP stack will work just fine for my requirements. So that stuff aside, this leaves security and abuse. How do I stop some malicious asshole from spamming the service, trying to break it for the lulz, or maybe, more innocently trying to cheat the high score system?

There is no simple answer or solution to this, certainly not with the resources I have available. Even if my service requires strong authentication, where the user is registered, and uses a token, etc., the nature of a web service is its availability and ease to hit with requests. Any script-kiddie could write a script to send requests at a high frequency. Anyone could sniff the request being sent by the game and figure out how to form their own requests and spam or cheat the service. Shit, they can just send any old stream of garbage to the service, and it would need to handle it. So there’s no way to stop someone from spamming your service, but you can mitigate some of this by using mature and readily available software packages that most hosting providers have available. Something like Fail2ban, that scans logs looking for unusual and potentially malicious activity and bans IPs. This is already installed and working on my web server, but has a potential issue for a game related web service, where people may be behind proxies used by multiple people, meaning if there’s one bad actor who decided to get themselves banned, all people on that proxy will also get banned. Not ideal! If there’s no way to stop spamming, how do we stop the spamming from breaking or bringing the service to its knees? A server IP ban at the firewall (Fail2ban), will stop any blocked traffic from ever reaching and hitting the service, so that will be in place. My hosting service have their own rules and layers of protection on their networks and can help mitigate persistent attacks if needed. Basically this is too big a problem for me to solve well given my resources, so I’ll have to make do as best I can.

Then there’s cheating and just people trying to break shit. That is guaranteed to happen, as there are a lot of twats out there, so it’s important to make sure the web service is as bulletproof as possible. It  must be able to handle with grace, any data that’s thrown at it. This just comes down to best practices and carefully scrubbing and cleaning any data the service will ultimately use. Requests must be authenticated to make sure they are coming from the actual game rather than a stand alone script. Tracking abusive or cheater IPs in another database and soft banning them. A possible option here, to take the validation load off the main DB, would be to hide the actual service behind another layer that uses a NoSQL DB to stash requests while some code chews on it in the background, and sorts the good from the bad, eventually sending good data to the actual service to be stashed as a purely internal, hidden operation. This approach could also provide a simple mechanism for metering traffic allowed into the service.

Tracking and catching cheats is more of an algorithm problem than anything else. The first thing would be to define what cheating or suspicious activity would look like. Knowing the rules of the game, it’s fairly easy to come up with a set of criteria that describes a valid high score. Is it impossibly high? Is it impossibly high for the length of time played or the wave/level reached? Are there too many requests from the same IP or user in a short period of time? Etc. Etc. There are all sorts of ways to break the problem down, and simply requires some thoughtful consideration and careful implementation.

Another thing that can be done to deter the casual or wannabe hacker, is to obfuscate the request to the web service, with encryption or misdirection, and protect it from manipulation with a checksum. This just makes it harder and more time consuming for someone to figure out, and because most griefers are lazy little oiks, they won’t bother. I don’t think this game or web service will be worth expending real energy on to hack.. LOL, who am I kidding!? When has that ever stopped someone from trying to break shit just because.

So there you have it. There’s a lot about web services that needs to be considered. If I was building this in a corporate or studio environment, I would definitely be more meticulous and “enterprise” in my approach, especially with the additional resources that would be available. I’m a one man band, building a silly little twin stick shooter on zero budget, so it’ll be as good as I can manage. Additionally, none of this is written in stone. I may just shit-can the global high scores idea completely if it proves too hard/risky, and I can’t come up with something reasonable, or it fails hard in test.

Of course if I was smart, there’s always a service like PlayFab where ALL that unpleasant crap is just done and handled for you. This is a very real option, provided you can justify the expense. As a small, one-man-band, hobbyist game developer, without a budget or any real hope the game will make any significant money, committing to a recurring expense is a tough pill to swallow. Also, because I’m a bit weird, I like to program stuff like this. I even used to do it for money at one time.

Anyway, I got super bored over the weekend working on this stuff, so have basically pushed the remaining tasks on the high score system (namely the in game GUI stuff), to the “back lot”. I got a big chunk of it out the way, and I’m looking forward to some fun coding next week making game pickups.

Enemy Wave Daily Dev Update: Day #1

Honestly, I didn’t get much done today. It’s Saturday and there are a ton of distractions all vying for my attention. I was supposed to be working on my high scores web service (which is mostly done), and the in-game UI and high score table functionality (which is NOT mostly done), but I ended up messing with camera code, playing in the back yard in the sunshine, and watching Davie504 and The Proper People videos on Youtube. Bah!

But wait, there’s an important lesson to be had here. A learning opportunity, if you will.

First, be realistic about working weekends, especially after a long, busy week where all you really want to do is veg out and put your feet up. Rest is really important!

Second, don’t be hard on yourself if this kind of thing happens. If it happens a lot, then yeah give yourself a good kicking or something, but once in a while is OK. It’s not like any of this is actually important or anything, so just enjoy your choices and get back to it ASAP.