{"id":2678,"date":"2013-01-09T10:25:20","date_gmt":"2013-01-09T00:25:20","guid":{"rendered":"http:\/\/www.vectorstorm.org\/?p=2678"},"modified":"2013-01-10T11:27:03","modified_gmt":"2013-01-10T01:27:03","slug":"atop-a-week-in-review","status":"publish","type":"post","link":"https:\/\/www.vectorstorm.com.au\/2013\/01\/09\/atop-a-week-in-review\/","title":{"rendered":"Atop, a week in review"},"content":{"rendered":"

\"blahblahblah\"
\nI was intending to write this earlier, but it just never quite seemed like the right time to sit down and write.<\/p>\n

This is sort of a post-mortem on Atop. \u00a0“Sort of,” in that I may return to it someday. \u00a0Actually, let’s strike that. \u00a0This is a post-mortem. \u00a0If I do continue with Atop, it’ll be under a different name, and it’d appear under the “Full Games” category on the sidebar.<\/p>\n

“Atop” is the first ‘clone’ game I’ve ever done, where I’ve consciously taken another game designer’s work, whole cloth, and tried to replicate it as closely as I could. \u00a0I had good intentions here — it’s a very old game, but a very important one, and it’s one which cannot be played on modern machines without the help of emulators — which usually means pirated copies of the software. \u00a0I’d assert that from a historical game design perspective, it’s as important a design as, say, Elite. \u00a0And I really wanted to be able to point people at an implementation of the game that they could play with to get a feel for what the game was about, and why it’s important.<\/p>\n

So my intentions were good.<\/p>\n

<\/p>\n

But I’m really not thrilled at completely copying a game design like that. \u00a0It’s much too close to my personal “ethical behaviour” boundaries, and that really killed my enthusiasm for completing the game within the week.<\/p>\n

On the last night before the deadline, I was convinced that I was going to miss the deadline — that there was no way to finish the game in time. \u00a0In practice, I made it by removing progression (ie: making it a single-level game), by leaving out sound, and by leaving out any of my usual framing around the game (intro sequence, preferences settings, credit scroll, etc).<\/p>\n

There were also bugs in both the OSX and Win32 builds which were initially released; \u00a0the OSX build was looking for libraries in an incorrect location, and the way that I was capturing the mouse made it impossible to move the game window in the Win32 build. \u00a0Both these issues have been fixed. \u00a0The Win32 fix was a library problem; \u00a0the bugfix is in latest trunk of the Vectorstorm codebase on Github.<\/p>\n

The OSX fix is a harder problem. \u00a0I haven’t yet figured out the right way to fix it; \u00a0it will affect every OSX build of any Vectorstorm project I do (or anyone else does) until I figure out the correct fix. \u00a0(If any of you are cmake experts, send me an e-mail!)<\/p>\n

Anyhow, with that out of the way, here’s the post-mortem:<\/p>\n

What went right<\/h2>\n

Graphically, the game came together very quickly. \u00a0I was able to swipe a lot of code from MMORPG Tycoon 2, most notably including the sky, the water (with a few modifications), and the system for procedurally generating models, which is being used for all the objects which sit on top of the island, in Atop. \u00a0I’m very pleased that the visuals give me a similar feel to what I remember from playing Sentinel on an Amiga computer, back in the day. \u00a0The “transition to new body” sequence is mimicking something I vaguely remember from a remake from about ten years ago, which doesn’t seem to exist any longer.<\/p>\n

The game rules themselves were implemented almost exclusively inside the “Map” class. \u00a0If you ignore the other bits of the code, the codebase actually looks a lot like a pure C game, with hardly any OO abstraction at all. \u00a0I’d forgotten how quickly you can throw things together, if you’re not busying yourself fitting abstractions over everything. \u00a0(By contrast, MMORPG Tycoon 2 would be very, very difficult to develop that way, as it’s a substantially more complicated game)<\/p>\n

One thing I’d always felt was a weakness of The Sentinel was not knowing where the Sentinel was looking. \u00a0Early on in development, I added visual indicators to the game so that you could see the sentinel’s vision cone in the world. \u00a0After several plays, I realised that the change made the game less fun; \u00a0that part of the tension of the game was having to divide your time between working to absorb and climb, and looking over toward the distant sentinel and trying to gauge how much time you had left before it saw you. \u00a0By just drawing what it could see onto the ground, that tension suddenly vanished. \u00a0I feel like noticing this and taking the feature back out again was really good exercise for my inner game designer.<\/p>\n

The game showed up a lot of bugs which have crept into the Vectorstorm library over the past year. \u00a0These include things such as temporary display lists being rendered with an incorrect transform matrix, and vsMeshMaker \u00a0objects being happy to merge vertices even if they are of different colors. These bug fixes are all now in the public Vectorstorm trunk.<\/p>\n

What went wrong<\/h2>\n

It took me far too long to decide what I was going to do. \u00a0For a game where I decided to use a wholesale copy of someone else’s design, I really shouldn’t have spent the first four days trying to pick a topic; \u00a0I could have started right from the get-go. \u00a0When I first started the week, I started on a 3D physics-based game which required a controller for input. \u00a0And I bought a new controller to do that, and installed a driver to use the controller. \u00a0And the driver took over my computer such that after connecting a controller, no mouse would work again until rebooting the machine. \u00a0And the driver came with no uninstaller. \u00a0It took me a good day or so to get the machine back in proper working order. \u00a0Lesson: do not install new hardware during Game In A Week<\/strong>.<\/p>\n

It’s actually been a very long time since I played The Sentinel, and my memory of its rules probably isn’t exactly right. \u00a0There is definitely a bug in the AI in Atop, which allows the enemy to attack you whenever it can see you, whether or not it can see your square. \u00a0According to my memory, it should only be able to attack you if it can see your square. \u00a0(This is probably a case of the enemy doing a vision check against the wrong point. \u00a0I didn’t notice the bug until a few days after release)<\/p>\n

The lack of level progression is a major problem for Atop. \u00a0Part of what made the game work so well was the mechanism for moving from level to level. \u00a0The idea was — there are 10,000 levels in total. \u00a0When you complete a level, the amount of energy you have spare will determine how many levels you skip. \u00a0So if you did really well in a level, you might skip 20 or 30 levels. \u00a0Or if you only barely snuck through, you’d have to move on to the very next level. \u00a0It gave motivation to try to have the highest possible energy before absorbing the sentinel. \u00a0Which is a motivation that is completely lacking in Atop. \u00a0Lesson: \u00a0Allocate and plan time for metagame; \u00a0don’t leave it as a detail to be implemented at the last minute!<\/strong><\/p>\n

In the original game, if the sentinel could see you but not see your square, it would create a “meanie” from a nearby tree, and the meanie (if it could see you) would force you to hyperspace. \u00a0I never liked this rule. \u00a0It feels like an ugly hack to deal with that situation. \u00a0It’s a bad situation, the “what do we do if the sentinel can see you but can’t legally attack you” situation. \u00a0I don’t know what the right thing to do in that situation is. \u00a0And this situation doesn’t come up in Atop since (due to a bug) the Sentinel just attacks you even if he can’t see your square. \u00a0But I really would have liked to have found an elegant way to handle this situation.<\/p>\n

Final thoughts<\/h2>\n

It seems like making a non-trivial 3D game inside a single week is a stretch for me. \u00a0I barely managed this one. \u00a0The last one, “Lord”, took me seven weeks to finish, and was basically unplayable even then. \u00a0Additionally, I now know that working on ‘clone’ games — even ones which I have affection for — is somewhat demotivating for me. \u00a0I suspect that I’ll not be doing that again.<\/p>\n

Tomorrow, I’ll actually post some things about the development that’s been ongoing on MMORPG Tycoon 2, honest!<\/p>\n","protected":false},"excerpt":{"rendered":"

I was intending to write this earlier, but it just never quite seemed like the right time to sit down and write. This is sort of a post-mortem on Atop. \u00a0“Sort of,” in that I may return to it someday. \u00a0Actually, let’s strike that. \u00a0This is a post-mortem. \u00a0If I do continue with Atop, it’ll…<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"spay_email":""},"categories":[39,17],"tags":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/po9WK-Hc","_links":{"self":[{"href":"https:\/\/www.vectorstorm.com.au\/wp-json\/wp\/v2\/posts\/2678"}],"collection":[{"href":"https:\/\/www.vectorstorm.com.au\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.vectorstorm.com.au\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.vectorstorm.com.au\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.vectorstorm.com.au\/wp-json\/wp\/v2\/comments?post=2678"}],"version-history":[{"count":1,"href":"https:\/\/www.vectorstorm.com.au\/wp-json\/wp\/v2\/posts\/2678\/revisions"}],"predecessor-version":[{"id":2688,"href":"https:\/\/www.vectorstorm.com.au\/wp-json\/wp\/v2\/posts\/2678\/revisions\/2688"}],"wp:attachment":[{"href":"https:\/\/www.vectorstorm.com.au\/wp-json\/wp\/v2\/media?parent=2678"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.vectorstorm.com.au\/wp-json\/wp\/v2\/categories?post=2678"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.vectorstorm.com.au\/wp-json\/wp\/v2\/tags?post=2678"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}