Sleep and What We Are

I hope everyone is having a good Memorial Day weekend! As there’s no rest for the wicked (and money doesn’t grow on trees), I’ve been working a bit, trying to wrap up the new Super Win content, fix whatever bugs may still be lingering, and hopefully make some improvements to perf and stability while I’m in there.

In case you missed it, our latest game NEON STRUCT came out last Wednesday. Since it’s David’s game, I’ll let him talk more about its reception when it’s time, but I will say it’s interesting to watch how it’s been trending relative to both Eldritch and Super Win, especially in light of the amount of mainstream coverage each game has received. It certainly calls into question some of the ideas I’ve had about how to approach Gunmetal‘s launch when that time comes.

I’m 99% done with the speedrun courses for Super Win. On Saturday night, I took about three hours and did a complete playthrough of the game looking for bugs in the minimap system or speedrun courses. There’s still a lot of stuff left to fix, and a few unsolved problems with regards to how to treat certain secret areas on the map. I’ve been aiming for the end of May or start of June for a launch date (June 1 in particular has been my ideal target), and I believe I’m still on track to hit that date, but in light of some other obligations and circumstances (which for one reason or another I can’t elaborate on here), I’ve been leaning towards either delaying this update or decoupling it from the price drop. I still have a little while to figure this out, so we’ll see which way it goes.

This week has been strange in that I’ve spent a lot of time working on various programming tasks which I’ve ended up reverting. I’ve had an idea for while to try to add support for a callback system that would use (non-static) member function pointers and a target object to circumvent a common pattern that I find myself running into in which I have to make a callback to a static function, passing in the target object as a parameter and then running a function on it. Although this feels like a simple process on the surface, C++’s handling of member function pointers makes it somewhat difficult. The crux of it is that member function pointers are typed differently depending on the class they belong to, which means that, barring any sort of trickery, the thing that makes the callback needs to know the class of the thing that receives the callback, and that defeats the purposes of the system, which is to be flexible and generic; the caller shouldn’t need to know anything about the callee. I prototyped an initial implementation of this a few weeks ago before going on vacation to Nebraska, rejected that version, and recently came back to the problem, believing I’d found a solution. After a few days of off-and-on work, though, I’m not really sure there’s a way to do exactly what I’m trying here, and in the absence of a really strong need for such a feature, it’s probably not worth pursuing further.

I had another similar experience this weekend. I ran into a case where it felt like it would be nice to be able to chain together any number of fullscreen postprocess effects, each a separate draw call, without having to set up the corresponding data in my render pipeline, which has historically been cumbersome to deal with when draw calls must happen in a specific order, as these would. The trouble in this case is that my renderer has been very specifically built to perform optimally in one way, and circumventing that behavior to make it act differently without breaking or losing the perf gains of the normal path turns out to be a rabbit hole of special case behavior. Eventually, I spending a few hours poking around in this code, I had to ask myself whether the motivation was strong enough, and in this case, it wasn’t. So I reverted that work.

I’ve had to discard or roll back work before, but it is unusual that I’ve had cases like these in such rapid succession. I think I’m itching to get back to work on core features after spending a couple weeks doing primarily content creation work on Super Win. That work just isn’t as satisfying, and it’s also weirdly emotionally draining. Even after just a week or two or level building and writing for Super Win, I’m already starting to feel the funk that loomed over the last few months of development on the original release. I’m hoping the procedural content generation scheme and loftier game systems design I have planned for Gunmetal will help stave off that mood, since it means I should be spending more time in code and less time building content that might only be seen once.