Archeology vs. Engineering: contrasting approaches to long-term maintenance of IT Systems

Thinking about programming and maintaining a system in a team environment, where the system has a long life and the team supporting it experiences turnover.

When I program I know exactly wtf I mean by . I understand its purpose and design, and this makes me fairly confident that I know what is and what it does or is supposed to do. My ability to solve problems when I code from scratch is limited by my ability to understand the problem and to conceive of a solution. Often what I can come up with is inferior to what the greatest minds can come up with, but for many problems I can come up with something acceptable, and code it in such a way that it is very easy to understand the code, because I like to write code that is written in a way that lends itself to understanding.

When I look at someone else’s , I don’t know wtf they meant when they coded . I have all kinds of questions about what was in the programmer’s mind, how they understood the problem, what they handled in and what they elected not to handle in it, and so on. It helps immensely if I know the language and any frameworks or libraries well, but often when you’re inexperienced that’s not the case. And, especially with larger, older things that have been built up over time, that becomes a very steep learning curve. Until I’ve had enough exposure and experience to , I feel very uncomfortable, uncertain, and unconfident that I understand any part of . And, if is sufficiently large, I never get over this, and it ends up limiting and paralyzing me in my efforts to become a better programmer.

If I built it, then I know why, and I can be in a position to know better later when I’ve learned more and maybe decide to change my mind based on some revelation. 

But if someone else coded it, unless they coded it in such a way that the code clearly expresses its intent, and/or they’ve commented it extensively, or documented it somewhere, explaining their rationale in detail, I can only speculate, and depending on whether I feel like I am smarter and more knowledgeable than they are, I might or might not feel comfortable making a change. I would at the very least feel uncomfortable making a change that I could not roll back quickly/easily if something broke, ideally in a test environment where there would not be serious consequences. But I might not feel confident that a change would be instantly and obviously noticeable; often things break in very subtle ways. Having a suite of unit tests is very useful here, but it’s often the case that there are no tests written.

Even when a system has extensive documentation, there’s no guarantee that it is up to date, or accurate, or correct. Other people often have very different ideas about what and how to document, and how much detail to include, and where to put what information. All systems of documentation seem to involve significant tradeoffs, and there is no silver bullet solution to documenting adequately.

I call such situations IT Archeology, rather than IT Engineering. It’s very much like discovering a lost culture’s artifacts and trying to figure out how their civilization must have been structured and how daily life must have been lived, and then trying to adopt those ways and live by them yourself in order to understand them better. By contrast, IT Engineering is what you do when you have a solid foundation of understanding of the problem domain that provides the context that it works within, and knowledge of the system and the technology stack that it is built upon.

At the moment, I am wrestling with how one moves from an Archeology paradigm to an Engineering paradigm. But it’s an observation I’ve noted many times in my experience, and it seems quite common. I am interested in advice from developers who have to deal with this sort of thing about what approaches actually work.

Game Review: Busy Busy Beaver by Daniel Linssen

A close shave resulted from a precision fall in Busy Busy Beaver

TL;DR: A fun, quick puzzle platformer, Busy Busy Beaver isn’t as difficult as Linssen’s previous game, the amazing Javel-ein, and is perhaps just a bit less engaging, but it’s charming sense of humor makes up for it. If you’re up for an hour’s worth of platform puzzles, try it out. Built in just 40 hours of marathon game jamming over a weekend, it’s remarkably polished for a game produced so quickly.

Download Busy Busy Beaver here.

You’re a beaver. You need wood to build up your house. Collect the wood, until you have enough, but make sure you don’t touch spikes or eat so much wood that you have no platforms left to get back home.

Simple, yes? The challenge is mild to moderate until the last few levels, but it’s a relaxing kind of intellectual challenge, where you don’t have to think too much, but just enough to make the game interesting without being frustrating.

I got stuck on the very first level, until I learned this tip: Press Down+Z to eat wood that you’re standing on. (I actually tried this early on, and couldn’t get it to work, which left me confused as to how to beat the first level, until I learned the secret: To eat down, you have to be in the center of a grid block. The level is laid out over an invisible grid, and if you’re standing on a grid line, you won’t be able to eat down, even if you’re standing on a grid line between two blocks of wood. As a player, I would have expected to eat both blocks when straddling a boundary, rather than neither.)

Getting into version control with GameMaker Studio

Version control makes sense whether you are working alone or with a team. It should be a mandatory practice. But you won’t be able to enjoy the benefits of version control unless you know how to do it right. If you’re working with a team, it’s essential that you all know how to do it right. This article will help you get started.

(more…)

What I learned while on Facebook vacation

Hi. My name is Chris, and I’m addicted to Facebook.

Kinda not seriously, I really am. I use it all the time. I have it on my phone, it’s with me everywhere. I can see what’s gong on with my friends, what’s going on in the world, in various communities that I have interest in, many of them related to my game development career. It’s really great for that.

Last Friday, I decided to act on what I’d recognized for a while to be a problem with the amount of time I spend using Facebook. On a whim, I decided to stop using Facebook, entirely, for two weeks. I didn’t want to disable my account, or delete it, but I wanted to see if I could build a space ship or cure cancer in two weeks if I just quit squeezing Facebooking into every spare moment of the day, and fb-multitasking even in many of the non-spare moments.

Since I didn’t disable my account, I can still receive messages from people. I can still post to FB via Twitter and when I update here the automated promotional post goes out there as well. So even though I’m taking a “Facebook vacation” I’m still not completely out of touch. It’s like “FB Lite” if there is such a thing.

The Experiment

I posted a see-you-later announcement, and removed the app from my phone. Well, I didn’t uninstall it, but I removed it from the quicklaunch screen, to make it harder to access, and made an agreement with myself that I would not launch it unless there was a legitimate need during an emergency to do so.

My see-you-later post announcing my Facebook vacation

Preliminary findings

So I’ve only been on “vacation” since Friday, and today’s Monday. Yet, I’ve already learned a lot. Hence, this post.

Sunday, I cleaned the house. I cleaned all the living spaces. Not the basement, or garage, or the spare bedrooms, but the living room, dining room, kitchen, front porch, bathroom, and main bedroom. All in one day. My place hasn’t been this tidy in probably over a year. I did it by waking up at 9:30, and cleaning all day, until around 5pm, mostly at a relaxed pace, not trying to rush through it, but just not stopping to get distracted by anything going with Facebook. Go me.

OK, so I haven’t read a book yet, but that’s still pretty awesome, isn’t it? I could have guests over. REAL SOCIAL! Without embarrassment!

Everything’s a tradeoff

Like any good addict, I couldn’t actually stay completely away from Facebook. I found that there really are times when I’m not doing anything with my time, and it doesn’t hurt to catch up with what’s happening. If I’m waiting in line, at the car wash, in the bathroom, or similarly tied up but idle, fb is pretty harmless.

The problem is if I get sucked in to fb-land and can’t stop checking my notifications. There’s always one more notification. Responding to notifications generates notifications, and if the person on the receiving end of your notifications responds, you get into a volley, which ends up turning into a [negative] feedback loop.

It’s particularly bad when you’re arguing some important issue with your friends and have to be right. Projecting your opinion feels like a form of power. Like, maybe by winning the thread you can persuade others and change the world a little bit, bringing about the utopia you always knew you could build if only you had godlike control over the universe and its inhabitants. Not necessarily. Maybe you are influencing people, but can you measure it? Is it perceptible?

I’m a sarcastic smart-ass, so I like to chime in with a funny comment on just about anything and everything, often at the risk of coming off like an asshole, even if there’s no real point to it other than to be witty. I’m not really an asshole, but I play one in real life. All the time. I’m hilarious, so I’m told, but I don’t know that it’s worth trading being funny on Facebook for whatever else I could have been doing with the time. Now, unless someone’s paying me to write jokes, I think there’s probably better things I could be doing with the time. Joking around and laughing with friends and being the quick witted guy everyone likes feels good and boosts your ego. But it’s a cheap form of validation. Nothing like a real accomplishment, like summiting Everest, or helping another person who needs it, or building something cool. As a proxy for achievement, it’s a false nutrition.

“Outrage porn”, inspirational memes, the politics of self-righteousness

A substantial proportion of content on my fb wall feed is not directly generated by my Friends, but is Shared content. A lot of it is interesting, some of it is even useful. I’m not sure how much of it is valuable. A lot of it is political stuff in a negative vein: Look how bad $other_party is. Look how bad $not_us is. $Bad_news is fucking up the world.

Politics isn’t unimportant, so political stuff has its place in the discourse of the business we conduct with each other on FB, but I think we’re getting the how wrong. Speech is a weak form of action. It’s powerful only if it inspires strong action: changing your behavior. Information is valuable, but its value remains only potential if you do not act on it. There’s a great deal of information which we can act on only in an abstract manner. I can’t do anything about Fukushima, or Deepwater Horizon, unless I want to completely disrupt my life and physically go there and volunteer to participate in the cleanup. I suppose perhaps that there are some number of people who read the news and then walk away from their status quo life and dedicate the remaining part of it to acting in response to that news story. But such people must be vanishingly rare. I mean, I might be able to write to my government and advise them to be careful with nuclear energy, or maybe suggest that they help Japan in some way. Maybe I’ll think twice about eating seafood. Beyond that, apart from any “human interest” satisfaction I might get from feeling informed about the world I live in, what value does it have? I just end up feeling despair, helplessness, bitterness, cynical, outraged. And I feel like this is how I should feel, as an informed person in a world going to hell at a seemingly exponentially increasing rate. But still — does feeling this way do anything to slow down the hell-goto rate? Does it make me a better person in anything but an abstract manner? At most I think I can say that it changes my spending patterns — slightly. I wish that I could say more than that. Well maybe not even. I wish that I wish that I could say that. But really, changing how I live my life too far out of the comfort zone that the culture I live in has prescribed for me isn’t really happening. I’ll wait like all the others for the crisis to reach the point of no return, and then and only then will we do things — but not because we were inspired by something we read on Facebook — it will be forced out of necessity.

The biggest problem with “outrage porn” is that all of it seems very important, and knowing about it makes you feel very informed. And it is, and you are, but you’re still not actually empowered to do things. Unless you’re the rare type of person who is out there already doing things. But the inertia of the vast majority of us who are living status quo lives will dampen the force you can exert on the world, to almost nothing — at least until most of us die off due to whatever the calamity is that we’re reading about this week. But almost nothing is still something. So, world-changers: as the anchorman said to the weatherman, “keep fucking that chicken.”

Facebook does provide value; whether it’s a net gain depends on you

Facebook does a [pretty*] great job of putting me in touch with people who I met casually one time and turning them into recurring bit players, and sometimes even friends, in my life. It helps me to not feel isolated in my interests, in my values. It helps me stay abreast of the news of the day, at least insofar as it is filtered by the echo chamber of the like-minded people I’ve Friended. It does a pretty good job of giving me a calendar with reminders for my social events.

*I say “pretty great” job because I don’t like the way that Facebook seems to meddle with who’s posts I actually get to see. I have something over 300+ friends, and yet it’s the same 20-ish individuals who I see posts from, or interact with. And for some strange reason they’re not all the people who I considered my closest friends. Over time, they’ve come to know me, and me, them, moreso than a lot of people who I considered my close friends. It makes me feel like this was less a matter that we had any choice in, and more what Facebook picked for me. Which is pretty disturbing, to say the least. Still, in spite of all that, it still provides what feels like a vibrant medium for social interaction with people I’ve chosen to interact with. But why this subset and not another clique of equally worthy and desirable friends? I have no idea.

More than anything, though, Facebook gives me an inflated sense of mattering. Every like, share, and comment is a tiny validation, and I crave that more than almost anything. That’s why I’ve been posting to Facebook since 2008 like they were paying me a dollar per word.

What do you look at? Who do you interact with? What do you share? What do you say? Most importantly, what do you do?

How to maximize your FB-value while minimizing time consumption

It’s Facebook nature to reward the trivial, and to trivialize the important. And it’s our job to go against that grain. Probably the worst thing about FB taking up every waking instant that I wasn’t actively engaged with something else was that it eliminated quiet time. The times when I used to think my deep thoughts, now were almost completely taken up by FB interactions, checking to see what someone commented to, seeing what the new notifications were. So many of the notifications are of things that I don’t care about, or updates to a thread that I read and participated in once and am now done with. But they keep sucking me back in. That red 1 just demands my attention, whether it’s something important and cool or something unimportant. Somehow, they just don’t get the filtering for that feature right.

When I first started using FB in 2008, wall posts had a maximum length. It was something larger than Twitter, but in order to exceed that length you had to use an FB-app called Notes, which allowed longer content. Almost no one used Notes, or saw them, and eventually FB did away with the length restriction and merged notes and wall into a unified stream. But brevity was the order of the day. It’s how the new social media would defeat the old standbys of MySpace and Livejournal. And by tying your recognizable, public, real life identity to your account, FB ensured that the content we shared would be filtered to be “appropriate” for all our real-world friends, acquaintances, stalkers, and future employers, or that there’d be consequences. You don’t get deep or overly personal on Facebook, the way you once felt safe enough to on MySpace or LJ. But because it’s easier to find people, and the interface for sharing stuff (whether yours or just stuff you found on the web) is way better, FB won.

Since everyone’s there now, and FB has gravity enough to keep them there, at least for now, here are a few things I’ve observed that can help reclaim the time taken up by unrestricted facebooking:

  1. Don’t comment unless it really needs to be said. Refraining from commenting saves almost as much time as not reading at all. If you’re a fast reader, you can read quickly and not waste a whole lot of time as long as you don’t get bogged down in composing and posting responses. This is the secret value of the Like button; it’s a one-click response. It’s terribly shallow, and often it’s not contextually appropriate to “Like” things that aren’t good news, but are well-written or express something you agree with. But unless you have something truly great to say in response to something, maybe it’s the most economical response.
  2. Don’t click links. Not clicking every link that looked interesting or curious also saves me a lot of time. A lot of what people share is what we have come to call “link bait”. It’s like spam, only it’s stuff you might reasonably be curious or interested in and think is cool or important, because some friend of yours thought it was. Don’t bite. Clicking only on things that have a direct, immediate relevance to me helps. It’s very easy to get sucked into every little thing that flows down your Wall, but only if you let it. If you want to make clicking links a choice rather than a habit, it takes discipline, but doing so is necessary in order to reclaim your time.
  3. Use the “stop notifications” feature. If you do want to just comment once and move on with your life, use “stop notifications”. You won’t get the validation and satisfaction that comes from knowing that 6 people liked your quip, and you won’t get to sink hours into lengthy exchanges with Friends who have some minor semantic disagreement of fundamental importance with the way you said that thing you said. But generally, it’s worth it.
  4. Don’t refresh for the sake of refreshing. This is a sure sign of addictive behavior. If you scroll down to the last thing that you remembered seeing, don’t scroll back to the top and start again. If your wall is particularly active, it’s virtually guaranteed that by the time you catch up with your reading, there’s bound to be a new post at the top of your wall, or a new notification of someone liking or commenting on something. You don’t have to be on top of that at all times. In fact, unless you’re being paid to be, probably it’s not worth it. The Wall feed scrolls like a treadmill, and you need to be the one to decide when to get off. Do it, and get away and do something. Special challenge: Don’t come back until you’ve accomplished something worthy of actually posting about on your own wall. Not a photo of what you had for breakfast, but a true milestone in some project you’re working on.
  5. Skip all videos. You can’t skim a video. They take time. You can’t keep scrolling and read other stuff until they’re done. You said you gave up watching TV because you had better things to do with your time; this is probably even less well produced. Is it really worth your time?
  6. Don’t share it. Was it cute? Was it hilarious? Can’t resist posting it because it’s just too good? Don’t do it. You can use facebook without even being on facebook.com. The Share button is uniquitous. You can share just about anything you find. Think twice before doing so. Ask yourself: If someone else posted this on their wall, and I saw it, would it be a waste of my time? If answering that question takes too much time/thought to answer, then make a rule to only share one thing a day, and ask yourself “If I could only share one thing today, would this be it?” If it’s not, then pass it by and move on with your life. (If you hit 11:59 pm and still haven’t found something better to share, don’t go back and “rescue” your one share for the day.)
  7. Facebook needs a “digest mode”. I’d be very happy with FB if I could read a digest of the stuff my friends are up to in about 5-10 minutes of skimming, once a day, and then go on with my life, choosing to engage more deeply only where it really matters, whether by commenting or clicking a link to read more. I’d almost pay for that feature alone.
  8. Almost nothing is a complete waste of time. Don’t think about it in terms of wasted time. If you enjoy what you’re doing, can it be said to be a total waste of time? Rather, ask yourself, what would I most enjoy? Something other than using Facebook is almost always the answer. And, likely as often, doing something else while also facebooking from your smartphone is less than focusing your presence on the experience you’re having immediately. Checking facebook in the midst of the experience is like channel surfing to see if something better is on. Even if there is something better going on elsewhere, you’re right here, right now, so unless teleportation is possible, or Lassie is private messaging you a warning about Timmie being stuck in a well, and you have to go rescue him right now, you might as well be focused on the immediate experience you are having, and make the most of that. And don’t spend so much time updating your Wall with what’s happening right now. Experience it first, document it after. Unless you’re trying to be a reporter, live-microblogging everything you do, preserving the stream of your consciousness for posterity is mainly an exercise in narcissism. Even if you truly are leading a remarkable life, you’re just slowing down or missing things if you’re trying to capture it all and send it through your social media filters.

Perhaps I’ll learn even more over the next two weeks, and update this post. But more likely, I’ll have built that spaceship and cured cancer. I have my time back, and can expect to spend a lot more of that time living.

Code snippets and syntax highlighting

I’ve been looking for a decent WordPress plugin to handle syntax highlighting for my code so that it will format neatly. I’ve tried a bunch of them so far, and am still not completely satisfied.

Requirements

  1. Has to correctly highlight GML syntax.
  2. Should support automatic line numbering
  3. Should work in both <pre> (for correctly-indented code blocks) and <code> (for inline textual elements in the middle of a paragraph that should be formatted as code.
  4. Nice if it treats <code> as an inline tag (this is definable via CSS, but it seems that WordPress’s TinyMCE visual editor will convert the entire paragraph into a <code> element, rather than just the content that is actually selected, making it annoying when you want to include some inline text in the middle of a paragraph and have it formatted as <code>.
  5. The font used for inline <code> tags should be typographically not-ugly when nested inside normal text.

After trying out a number of plugins, I’m currently using WP-Syntax, which seems to be the best out of the plugins I’ve tried so far. Overall this is a very good code formatting/syntax highlighting plugin, but for some reason the every-other-line background coloring doesn’t line up cleanly with each line of code, and it works using <pre> tags only, not <code> tags. WP-Syntax works with a couple other plugins as well, which integrates with the TinyMCE visual editor, and enables me to make a formatted code object downloadable.

I’m still looking for ways to improve the presentation of code, so if you’re reading this and have suggestions, please drop me a comment.

Simple GameMaker performance throttling

Here’s a quick tip for performance throttling in GameMaker.

Say you’ve got some code that you need to execute frequently, but if the game starts slowing down too much, you can live without executing this block of code.

Like, for example, say you want to spawn a new instance of some object very frequently, such as in the Step event, but if performance starts to lag you can skip it. You could try to test out how many instances the game can handle without frame rate dropping to an unacceptable level, and cap the number to something somewhat below the maximum. The problem is that this number will vary depending on the hardware. Someone running your game on an older, slower machine will not be able to sustain the same performance that someone with a brand new, high end machine. There really isn’t a true, one-size-fits-all number that works for every situation.

What you really want to do is base the cap on the current performance of the game as it’s running right now. To do that, wrap it up in an if statement like this:

if room_speed < fps
{
 //keep doing the thing that will eventually cause performance issues
}

The way this code works, as soon as fps drops below room_speed, it will stop doing the thing that contributes to the performance problem. This technique does not guarantee that fps will never drop below room_speed, but it will cause performance to stop degrading by not contributing to the problem once performance has degraded to the point that the conditional check takes the “false” branch.

If you don’t want ANY noticeable performance degradation, you may want to make the conditional check be something more like

if (room_speed + 10) < fps

instead; this will give you a little buffer to keep the fps enough above room_speed that you should not see any noticeable performance problems. Or, substitute the calculation room_speed + n with the literal value that you don’t want fps to drop below. Use this to ensure a safer margin of acceptable GameMaker performance.

Game review: Javel-ein by Daniel Linssen

I loved Javel-ein when it was first released as a Ludum Dare 28 Jam entry. It’s been expanded into a “Full Game” — I put this in quotes because, other than perhaps a lack of background music, there wasn’t anything about the Jam entry that felt incomplete or less than “full” to me. TL;DR: it’s a great game, it’s free, and if you run Windows, you can play it.

Get Javel-ein.

Game Play

You’re a guy armed with a Javelin, jumping and running through a 2D platform world of caves and lava pits. There are dangerous creatures, which you’ll need to kill with your Javelin. Once all the creatures are destroyed, you need to find the door to take you to the next level. The twist is that you only get one Javelin, and you have to retrieve it each time you throw it, leaving you temporarily defenseless. (more…)

Pixel art resources

I’ve been spending many hours today and yesterday playing Javel-ein and reading about pixel art. Javel-ein’s creator clued me into a 16-color palette he used to create the graphics resources for the game. Created by someone at pixeljoint.com named Dawnbringer, it opened my eyes to something I hadn’t given much thought to in my pixel art dabbling to date.

In my pixel art method that I’ve been developing, I have not expended much effort at all in choosing colors. My method has been to use the absolute smallest number of colors as possible. To pick the color, I simply pick “the color” — I don’t give consideration to the context, the lighting conditions I want to simulate, or anything else. To draw the Hulk, I said to myself, “The Hulk is green, pick a green that looks like Hulk Green” so I did that, and then I was done.

I don’t pretend at all that my pixel art method is the best. It is merely a method, and one that I’m able to work in quickly, and achieve results that I find acceptable. I deliberately do not concern myself so much with quality, but with speed. I reason that speed serves me best because with speed, I can iterate more quickly, and iterating will give me the experience that in time will yield an improvement in quality. Also, because I do everything in my games, I have to ration my time and distribute it between designing the game, programming, doing graphics, sound effects, testing, etc. So I don’t have a lot of time, and therefore speed is all the more important. But because my time goes to other things, I haven’t iterated as much as I thought I would.

My pixel art method is very primitive and newbie feeling, but I try to use that as a strength. But that’s not to say that understanding color and using it more effectively would not be very valuable. So far my approach to drawing has been more like a very young child than an artist. I take the fewest number of colors possible, use them iconically to represent the subject with what “everyone knows” is the right color — the sky is blue, grass is green, the sun is yellow, no surprises. For standalone subjects, and for the specific style I’m going for, this works. But when I integrate standalone subjects into a composition, if I want it to look cohesive, and minimalist, I need to give more thought to how I select colors.

Seeing the results in Javel-ein from what a well-chosen palette of 16 colors can make possible, I became very interested in using the palette in the color picker more. Until now, I’ve always just picked something in the RGB color wheel that looked right, but from now on I’ll be giving more thought to my palette ahead of time.

As well, I spent a few hours and created a few palettes for Paint.NET so I can select from a collection of pre-defined, general purpose palettes. I have Dawnbringer’s 16- and 32-color palettes, and several that I made for simulating the NES, Atari 2600, and Gameboy. I plan to try to use these for a while, to see how I can adapt to a constraint of a pre-defined palette of so few colors, and what that will teach me as a pixel artist.

From my reading, I know that there is a lot to creating a good palette, and I’m not yet experienced enough to do so, but I now know enough to start trying. It’s encouraging to read that even well-regarded, accomplished pixel artists struggle with selecting just the right colors for their palettes, and that it is not just me because I’m “not really an artist”. This is something I can learn, and get better with, and I just have to work at it.

In the course of learning, I need to keep a notebook for ideas and references. I figure sharing it publicly will only help to improve the quality of what I find. I don’t really have much original to say on the subject yet, so this is mostly a dump of links to interesting articles, discussion threads, and resources.

Pixel art communities

Pixel art tools

There’s a ton of them. I primarily use Paint.NET so far, but there are many others I’ve yet to try. I’m too lazy right now to put hyperlinks for all of them here, but you can find them by google.

  • Paint.NET
  • GraphicsGale
  • Pickle
  • PyxelEdit
  • GrafX2
  • Aseprite
  • GIMP
  • ProMotion

Palette Choices

Some very interesting forum threads on the philosophy and method of building up a palette.

  1. http://www.pixeljoint.com/forum/forum_posts.asp?TID=10695
  2. http://wayofthepixel.net/pixelation/index.php?topic=8110.msg92434

I’ll add more to this as my reading continues.

Updated Javel-ein released

One of my favorite games to come out of Ludum Dare 28, Javel-ein, has been developed into a full game by its creator, Daniel Linssen. I was amazed with how polished and balanced the original version of the game was, so this expanded version should be a real treat to play.

I’ll probably post an update with a full review once I’ve had a chance to play it. Review here.

Prior Art

Proof that I invented the idea of it first :-P

prior art