That was 2014

So I went a whole year without updating this blog, instead just working on Black Annex and being a slob. Instead of actually being constructive, here’s a raw dump of the entire past year’s worth of patch notes. Enjoy!

====RADIAL Builds====
ver 0.0.1
-First RADIAL build, end of “PAX Beta Demo” naming, which wasn’t a beta at all.
-Glide rendering is now always centered.
-Offloaded a bunch of settings to annexconfig.cfg

ver 0.0.2 (Shipped 01/02/2014)
-Glide rendering improved massively, now have independant “Window size”
-Screen blitting now a TON faster, about 50fps boost on my core i5.
-Fixed blitting issue which locked FPS at 30 despite reporting faster.
-SDL blitting is broken in this build. Glide only.
-Mac build now works on much older Operating Systems

Ver 0.0.3 (Shipped 21/02/2014)
-Total rewrite of Deceiver AI. No longer tries to flee outside map.
-Massively expanded RoomSpawn system to accomodate tutorial.
-Email/cutscene/text readout system implemented.
-Heaps of other stuff tweaked and fixed.
-Re-added the idle mouse cursor, now smoother.
-Loads of stuff

Ver 0.0.4 (Shipped 01/03/2014)
-Fixed bug where room spawn would be interrupted by scared enemies.
-Fast forward emails (except Welcome to Black Annex) by holding leftMouse on them.
-Space-bar can be used for lock-on as well as middleMouse now.
-Tutorial can now only be “Completed” by using a specially flagged door.
-Mouse automatically releases when window is inactive, captures again when active.
-Removed mousewheel scroller, was only meant to debug.
-Security cameras and Alarms always have a tooltip.
-Tutorial can now have “Follow on Mission”, so after tutorial, you play a real mission before entering Black Annex.
-Fixed graphics overflow after visiting Interloper zone.
-Agents that die or are hurt in the tutorial will automatically heal for the next mission now.

Ver 0.0.5 (Shipped 09/03/2014)
-Bug where room spawn could be interrupted should be REALLY fixed now, instead of causing crashes.
-Mouse now moves correctly during zoom/cutscenes.
-Added small floating indicator for “Kill Agent” targets. Removed old pulse effect.
-Deceivers are a little more scared when they see an enemy through a window now
-Deceivers continue to run around scared after sounding an alarm now.
-While walking to a distraction, deceivers now show “!” instead of “?” to indicate they’re not yet distracted.
-Throws distractions no longer affect people in Black Annex (or any NPC team mates)
-WSAD/arrow keys stretches camera about.
-Deceivers shouldn’t try to run to enforcers or alarms they can’t reach anymore (was causing some jamming and pacing).
-Scared Deceivers no longer try to escape through doors that people are standing in (or will shove you out of the way if needed)
-Silly new pretend BIOS bootloader

Ver 0.0.6 (Shipped 06/04/2014)
-Can no longer cause a popup box over someone who is no longer distracted by the time you get to them.
-Frameskip is back. Seems to work ok.
-Popup boxes with only 1 option were a bit graphically glitchy. Fixed now (thanks _SupSuper for complaining enough for me to fix it)
-Some tooltip descriptions changed.
-Main menu can’t be called while reading emails anymore.
-Mouse no longer “Magnetizes” to acquirables unless you can acquire them right now.
-Mouse no longer “Magnetizes” to alarm panels, terminals, or cameras. Easier to shoot people standing near those things now.
-Alarm panels always have a tool-tip now.
-Emails are just faster all the time now, except the “Intro” one. Fast forward is just EXTRA fast.
-Can no longer open main menu during any “camera zoom” event, like a mission intro or some cutscenes.
-Mouse no longer exists in-world when the camera is zoomed at all. Was too jarring.
-Main menu is a little better behaved in the “pre-game” levels (tutorial and first mission). Hides game logo until intro plays.
-Enforcers now make three very slightly differing attempts at pathfinding to their target before giving up and randomly “searching”. Seems better now.
-Drag-select is much less sensitive now, makes running/movement easier.
-Drag-select no longer interrupts camera events.
-You can tap ESC to skip mission introductions now.
-You can tap ESC to close popup boxes now
-Can’t use WSAD+CTRL key combo anymore
-Added “homename” to config file. Defines first metamap to load for Black Annex area (does not affect tutorial zones).
-Added “dialoutname” to config file. Defines the location the MODEM sends player to.
-First version of “Installations” menu implemented.
-Pathfinding routes with multiple keynodes now work properly. files no longer support forced clipping planes.
-Spawn-in doors now clip correctly on subsequent visits to missions.
-Agents spawn-out when transitioning to a new map now.
-”Kill agent” missions no longer break the protraits in the SOLUTIONS menu.
-Mission flow has been altered to allow the dynamics between Black Annex and Interloper missions.
-Escourt Missions implemented.
-Alarm panels weren’t actually alerting agents, just spawning them. They now do both.
-You can no longer click on agents in the field to select them. Use number keys or click portraits at the top-right.
-Fixed entity limit of 250 (cased by vision system). Unlimited entities per map now.
-All vision panning is now tweened instead of stepped.
-Vision cones in all companies are now FAR more visible, except in Black Annex and Interloper Industries.
-”MODEM” interactive item is now implemented. You can visit Interloper Industries and do escourt missions there.

Ver 0.0.7 (Shipped 6/07/2014)
-Absolutely massive content update (Black annex can be fully “Installed” now)
-The first ALARM-spawned ENFORCER (and nearby DECEIVER) in the tutorial has a much more forgiving patrol path now.
-One less camera in the tutorial.
-Interloper missions no longer appear in REBUILD or DEBRIEF
-HAYWIREed terminals now have a much smaller area of effect, and no longer emit a blue visible pulse.
-Friendlies no longer show vision tiles. (Including cameras)
-Interlopers would jam up when running to a path node but they see a distracted enemy along the way. I tried for hours to fix this but I just can’t work it out. Hacked it instead :(
-ACQUIRE on a RARE ITEM is now cancelled if the rare item melts into the floor while you’re acquiring it.
-Once a HAYWIREed terminal successfully distracts someone, it will need to be HAYWIREed again to distract again.
-ENFORCERs will no longer listen to DECEIVERs calling for help or alarms blaring if they’re already trying to go shoot someone. Less confused running around now.
-DECEIVERs no longer get stuck if a terminal is haywired just as they are taking a step away from it.
-Click to select agents is back again. Really needs tweaking to get it right, though.
-Doors that “spawn in” no longer remain on the clipping plane in their old secret location. Was causing rare door glitches.
-When you release a dialout call, you always return to where you dialedout from. Multiple modems send you to different places now.
-Removed the CALL RELEASED charges screen.
-Doors that trigger rooms spawns no longer fire when the room has already spawned previously.
-Movement is restricted when some rooms are spawning now (usually only in Black Annex and Interloper zone). Prevents player escaping map boundaries.
-Room spawns triggered by doors that cause movement restrictions now have a much shorter cutscene event.
-NPCs which spawn while the player is within their react zone no longer get stuck in conversation mode.
-Spawn-in doors are now correctly locked where appropriate.
-The “All agents dead” screen no longer allows you to Abort or Redeploy in the mission between Tutorial and Black Annex.
-REINVEST no longer heals your team completely. They lose 15% of their max health every time down to a minimum 3 Health, except in tutorial areas.
-Agents that are dead when you leave a mission will heal as per REINVEST healing rules when they return to Black Annex.
-Agents with <=20% health have red health bars to indicate critical condition.
-Agents with <=20% health are removed from your solution when you return to Black Annex
-The INSTALL staff member will not help you until you’ve completed at-least one real mission.
-Fixed crash on bringing >3 agents to a mission. Was introduced in a previous RADIAL build
-Fixed a few bugs regarding health of agents during mission transitions.
-Fixed SILENCE ability. Was broken in the last few builds.
-Loading screen no longer has debugging text. Minor other changes. Slightly different flavor text for different loading situations. The old “Hints” from the PAX demo removed finally.
-Option menu is in, Resolution and Fullscreen options are working and saving correctly.
-When health is so low that a healthbar should actually be completely blank, a small red pixel appears to avoid confusion.
-Fixed bug where, if all 3 characters had exhausted health, some would not be removed from solution after mission end.
-Max pathfinding nodes now can be set in .cfg file
-Some changes to pathfinding code. Trying to get a tiny bit more performance out of it. Not perfect…
-A new little indicator appears on the edge of screen for alerted off-screen agents.
-Deselecting an agent on their way to do something like acquire or haywire now causes them to go do it when they get there still.
-Doors that trigger new rooms to spawn, now spawn rooms 25% slower. It was a little too fast for some complex rooms to form fully.
-”Installations” menu has been massively developed.
-Added “Lock-on” tutorial email.
-Game timer no longer has an upper time limit (unless you play for 550 quadrillion years, according to google’s math.) (uses a 64bit unsinged integer for “Seconds passed” now)
-Scared DECEIVERS lose interest in being afraid much faster if they’ve passed on their fear to someone else. Not perfect, but a bit better now.
-Thrown distractions are now MUCH more interesting.
-It’s a little harder to accidentally change agent selections due to frantic clicking now, you have to hover over an agent for about .5 seconds before selection works.
-Throwing a distraction at a wall will (almost always) now make the distracted agent actually stare at the wall instead of just at the tile the distraction landed on.
-If another agent is standing in the “distraction tile”, agents will attempt to look at distraction anyway.
-Camera vision cones have red outline now. They pan slower now, too. Less organically, more mechanical. For @hailtonothing with love
-NOT YET STABLE: DISABLED FOR NOW (A* Pathing now uses SelectSort instead of BubbleSort. Much less frame drops on insane hectic situations.)
-Deceivers no longer react to scared deceivers or alarms going off. Game is much less unpredicatble and has less cascading horrible messes occuring. Overall flow improved A LOT.
-Dramatically changed behavior when you click on walls now. A bit more intuitive I hope…

Ver 0.0.8 THE ROAD TO REDIAL (This build was submitted for AIS Judges in 2014 and also QA by AIE Students in various stages.)
-HAYWIRE no longer starts performing automatically anymore. You have to click. Gives player a chance to see what it will trigger first. (Unattended haywire no longer works due to this)
-Alwaysrun is available in the config file for now…
-Popup boxes close less arbitrarily now. Was causing some confusion on double-clicks.
-A small pulse effect appears where a unit decides to move to.
-”Solution” is called “Agents” now.
-Selectsort pathfinding is back… for now… let’s see if it’s stable I guess.. (I think there still a bug :()
-Enemies no longer have to be distracted for you to DECEIVE attack them, it just makes it easier.
-Removed crash when you attempt to open Pending missions with no missions remaining but incomplete Interloper appeals.
-If accounts are still balancing, you no longer have to wait for it is finished to spend money, it instantly completes. (DEPLOY menu and EveryoneIsDead screen affected)
-The “Everyone is dead” screensaver is 10x slower now.
-Deployment costs are hidden if you’re not yet responsible for accounts.
-”Restart!/Redeploy!” button works properly again.
rw-nfltrtr map has slightly altered camera so interlopers can sneak past easier now.
redial_early map added patrol path for an enforcer that was missing them before.
redial_early map removed an invisible obstacle. Oops.
redial_early map removed a particular window. Moved an alarm panel slightly to avoid accidental triggers from a nearby camera.
-Background tiles slightly realigned to match the mouse cursor now.
-Vision tiles are slightly realigned to match the background tiles.
-Very rough “Free camera”, can be enabled in config file.
-Slightly decreased the “Hover to select” countdown. Probably not noticeable.
-Distractions last longer now, and are more guaranteed to make an enemy stare at a wall.
-Distraction emotes now flash for a moment before disappearing.
-Automatic HAYWIRE returns, and the HAYWIRE network is visible to DECEIVERS now at all times.
-DECIEVERs who are staring at distractions can still be distracted with HAYWIREd terminals
-Expanded Tutorial area to explain HAYWIRE in detail.
-Fixed a few animation problems with the Locked/Unlocked popup bubble. A little less confusing now.
-Now that door unlocking is working better, I’ve made HAYWIRE cooldown always take 500 ticks, instead of being relative to health of the Door.
-Alarms no longer can cause entities from “Locked Rooms” to spawn in.
-Right clicking yourself (enforcer) now fires south instead of not-at-all.
-Slight change to tutorial, deceiver before camera now watches door while distracted by terminal, forcing TAKEOUT.
-Second SERVER in the tutorial location changed slightly.
-Camera no longer jolts if you HAYWIRE a terminal that has not yet spawned (only impacted one area in tutorial)
-Sometimes if you were sighted by a deciever on the way to fix a terminal, he would forgot which terminal he was on the way to fix, and eventually glitch out and start repairing “nothing”. Fixed (I think).
-Lockon now emits an invisible pulse which finds the nearest enemy agent to where you clicked. Covers about 3×5 tiles.
-Lockon has a crosshair icon instead of “X” now. No longer jitters when agents move, either.
-Agent numbers over their heads are new icons now.
-Fixed bug where deceiver would lose interested in finding help if they ran past another deceiver along the way. They thought the new deciever would take up the cause so they’d give up.
-”Unattended” haywire works again now, if you order a deciever to haywire something and deselect them, it will still proceed.
-A few less instances of getting stuck now.
-INBOX/MAIL system implemented. Content is deferred to a file called inbox.list.
-Fixed graphical bug with cursor. Hovering over distracted agents would always imply they were interactive, even if you didnt have CAPTURE or TAKEOUT equipped.
-TAKEOUT is no longer available in the tutorial until it is mentioned to the player
-ACQUIRE no longer available in the tutorial at all. Will be introduced later in the game.
-The first mission you embark on before going to Black Annex is now the first REDIAL CORP area instead of the first RADAR WARD area.
-The pulsing effect on NETWORKs no longer speeds up/slows down based on number of entities in levels. Always 1 second pulse now.
-DECEIVERs can no longer lockon (bug was introduced in previous build).
-Corpses are now shifted graphically about 8 pixels down to help prevent some graphical glitches.
-Fixed small bug in clipping plane when you try to move one agent on a path between other agents, interrupting their moves.
-If you leave a popup box open after performing HAYWIRE, it will autoclose when agents arrive at their destination distractions.
-I’ve given back TAKEOUT to the player for the entire DECEIVER tutorial. If the player discovers it early, good for them. Either way, they’re forced to use it later.
-Spawned-in cameras are no longer see-though/shootthrough.
-Tutorial re-jigged towards the end, camera tutorial and teamwork tutorial added.
-Doors now close after triggering teleports in the tutorial
-Network diagram adjusted for East/West facing doors.
-The distance which scared DECEIVERs will search for alarm panels has been toned WAY back to create more predictable behavor.
-Fixed bug where if you lock a door that’s jammed open game would crash.
-”MISSION COMPLETE” popup now does a “slam down” effect to hopefully draw the player’s eye to it.
-Removed HALT button for now.
-Escape key instantly reveals email text (except the intro, sorry, I’ll be changing that dramatically later anyway).
-Emails no longer re-appear if you read them too fast while a camera cutscene is still playing.
-Tunebox is gone, new looping music tracks with fading, also loading “DIALOUT” sound effect added.
-Small tweaks to engine capabilities to handle the ending mission.
-Popups no longer auto-close at a random time forever once a door has been unlocked.
-Corpses now load per agent! No more placeholder data, uses real corpse sprite banks for player and enemy agents! Woop Woop! I dreaded this feature, but it wasn’t all that hard :D
-Added FreeMouse setting and TouchMode setting, works on touchscreens this way (and also for people who don’t like the relative mouse arrow mode)
RTR:05 [EBExpo 2014 Build]
-Removed tutorial style email from accounts unlock.
-Removed the first north expansion room from the tutorial.
-Tutorial waypointers now have offsets to better guide the player, and a few extras have been added a long the way.
-Alarms no longer become invisible if you bump into them a bunch.
-Small, some ad-hoc, changes made for EBExpo.
RTR:06 [Based on player experience at EBExpo, these changes were made to prepare for PAXAus]
-Small indicator points to EXTRACTION NODE at end of mission now.
-LockOn now automatically unlocks if your target is >25 steps away.
-First distraction is now against an armed enemy
-Player is killed instantly if they try to outrun the first distractable enforcer.
-First distraction event is hacked a little to cause pathfinding to be more intuitive.
-Can’t progress past TAKEOUT tutorial until you TAKEOUT.
-Fixed crazy camera on death bug.
-Your “Following” actions are cancelled if the entity you are following dies now.
-Extract node in RW-Entrance moved, and some changes made to layout.
-Added reminder email if you die on the first distraction
-Sequence breaking in tutorial no longer glitches waypoints.
-Player shouldn’t be able to trigger any emails while enemies are persuing in tutorial anymore.
-Extract node no longer continues warming-up after you leave the room.
-Extract node no longer re-opens for a moment while performing the actual extract.
-Fixed bug where rooms would arbitrarily not spawn if certain enemies were alerted (or killed during an alert) before triggering the room
-Cinematic engine for intro and ending built
-Triggers loaded from tutorial no longer impact the ending scene. Fixes bugs which occured if you finish the entire game in a single sitting.
-Corpses now only render once to the floor layer and then don’t need to render again, slight performance gain.
-Dead agents randomly drop a collectible “Capture Cube” which is the new method of CAPTURE for acquiring new agents. The old system will be removed.
-Can pick up collectibles/capture cubes from any angle now.
-Clicking an object you’re always interacting with no longer resets the interact timer or closes the popup box
-If youre spotted in some places in the tutorial you instantly respawn with a new email now.
-Mission control doesn’t appear until play agents spawn now. Aborting a mission before spawn occured caused massive glitches before.
-A lot of language has been changed to push the “REDIAL” themes.
-Added “Playercorpse” config option. -1 means player corpses disappear when respawn, 0 makes them persist. 0 is faster because they’re “inactive” renders.
-Popup autoclose works when you lock doors now, not just when unlocking.
-If enemy deciever encounters a locked door and feels safe, they will go unlock the door.
-Some lensebending calculations weren’t working. I added a second, more complex check, and did my best not to have this impact performance :S
-”Capture or kill” changed to “Kill” as capture system much different now.
-Weapon firerate is slightly staggered now. Less uniform fire rates.
-Fixed bug in cutscene renderer, now correctly supports neverending cutscenes.
-Max agents on a mission reduced to 4
-Can no longer spawn two NPC menus at once by clicking both really fast.

Merry Multiplatform-mas!

It’s been a while since I wrote anything heavily technical, so here comes some words to fix that!  Black Annex is going to launch for Windows, MacOS and Linux simultaneously now, thanks to some large amounts of progress I’ve made lately.

Let’s start by talking a little about how I make Black Annex.

Black Annex is written in BASIC, it’s almost pure QBASIC, but to make it work on >16bit operating systems, it’s translated to C at compile-time, links SDL for its interface work, and then compiles using GCC. This was, originally, handled by an off-the-shelf product called QB64. It worked really well at first, but I started to find bugs in QB64 as I started to push for higher framerates, modern features (Steam Overlay Support) and slightly unusual input methods (relative mouse movement, for one). QB64 really broke down at a few key points, and I knew I would have to fork my own version of it and change a lot of it to make it work. I know almost zero about programming in C, so the scope of doing this was very scary.

This was the reason I decided to focus on Windows first, and then worry about a custom compiler for Black Annex for MacOS and Linux post-release. Programming in C is scary enough for me, but targeting operating systems that I’ve never worked with would also make the job even bigger.

So, it was obvious that I’d need to use a custom fork of QB64 to compile Black Annex, but I wanted to make sure that the off-the-shelf version of QB64 would still compile it. I wan’t to make sure the game would “work” to some degree if people didn’t have access to my compiler, only the game source.

The first thing I wanted to change about the compiler was the way that the PAUSE key, and the ALT+ENTER keys worked. The PAUSE key, in QBASIC, makes the entire program execution just pause. This really messed with my delta-timing in-game, and I wanted to just disable it so I can control game pausing myself. ALT+ENTER toggles full-screen modes, which crashes the game if you do it while the game is loading in sprite sheets. I wanted to just completely disable that and make a menu option for full-screen.

Changing those two options would be my first adventure in the C source of QB64. QBASIC 4.5 for DOS is basically this library file called qb.lib, which contains all the information for translating your BASIC code into DOS interrupts and such. QB64 works the same, with a file called qbx.lib. All the changes I wanted to make live in a file called qbxlib.cpp, which I can modify, recompile QB64, and then recompile Black Annex to use the new libraries.

I spent many hours exploring qbxlib.cpp, it’s a big file and it’s really messy. There’s no tab-spacing or anything, it’s just a massive flat text document. I tried to get Sublime Text to do the “Auto Spacing” on it to make it a bit more readable, but it didn’t have an amazing effect. I navigated about and found some parts where keyboard input is handled and disabled the ALT+ENTER and PAUSE key behaviors. With that done, I left it at that. That was the only thing I really needed to do at that time.

Six months passed, and I found a bug. The first major change I had to make to QB64 was the way mouse movement is handled.

The bug wasn’t in QB64, or Black Annex, the bug is in SDL 1.2 (or, some would argue, Windows). QB64 uses SDL for keyboard and mouse input. SDL has a bug involving relative mouse movement. When using relative mouse movement with SDL, you’ll typically enable a flag called SDL_GRAB, which forces the mouse cursor to stay inside the program window. The bug is as follows: When you enable SDL_GRAB, then begin holding a key on your keyboard, the mouse movements reported by SDL will skip a few messages, resulting in pulses of “lag” in the mouse movement. Release a key and the issue goes away. Hold two keys and the issue returns, release one key (while still holding another) and the issue goes away. If you disable SDL_GRAB, the issue does not appear at all.

The issue appears because SDL_GRAB works by constantly warping the mouse to the center of the window after reporting mouse movements. It does this warp as fast as it possibly can. Windows can only record so many messages about inputs, and while holding a key, moving the mouse, and warping the mouse, information gets lost (or SDL doesn’t read the messages fast enough, I am not sure).

I was completely unable to fix this issue inside my BASIC code, I had to go back to qbxlib.cpp and write some hacks into the keyboard/mouse handlers there. I tried so many things, sending fake KEYUP messages to SDL, sending fake KEYUP messages to the windows even queue, and all sorts of terribly ugly hacks. Disabling SDL_GRAB and just constantly using SDL_Warp to warp the mouse myself. Using the Windows API to warp the mouse. None of these worked. The issue always returned.

In the end, I had to disable SDL_GRAB, and every time the mouse reaches past the inner 25% of the program window, warp it back to the center myself. This much slower warping (as opposed to warping constantly as fast as possible) made the issue go away. This was about one week’s work, between learning C, learning how to handle events in Windows and SDL, and actually coming up with a solution.

With this work done, I remembered the main roadblock I had originally encountered with the MacOS and Linux builds of Black Annex. Every time you moved the mouse, the entire game would just lock-up. Execution would resume as soon as you stopped moving the mouse. In the past week, I’d learned a lot about how mouse movement works in QB64, and I was confident that maybe I could actually make some headway in the Linux and MacOS forks of QB64 I had planned.

But, I had something else I’d rather work on with my new knowledge of C and the qbxlib.cpp file. I wanted to get the Steam overlay working. The Steam overlay only works if you game renders using OpenGL and DirectX, but QB64 just uses software “Surfaces”, so it was out of the question. I had been talking to Simon Roth a little bit about my issues with mouse movement earlier, and I mentioned the Steam Overlay roadblock. He said to me: “You can just render an SDL surface to an OpenGL texture, that’s what I did with VVVVVV”.

I understood the theory of what he was talking about, but I had zero concept of how to actually do what he was saying. The second major change I had to make to QB64 was the way SDL surfaces end up on your PC screen.

Googling “Render SDL surface to OpenGL texture” comes up with lots of results, and I had to spend a lot of time reading about what these people were doing, and how to make it work. It wasn’t too long because I had completely broken QB64, and ended up with it always just outputting a square window with an OpenGL-rendered triangle on it. Black Annex would be running in the background; you should still hear the music, but the rendering was just an OpenGL loop thingie now.

With loads of help from the goons in #sagamedev, I got the SDL surface that normally appears on-screen in QB64 to instead render to an OpenGL texture in a quad on-screen instead. Black Annex launched via Steam, and the Steam Overlay appeared. I had to do some work as far as communicating to OpenGL what resultions to use versus the size of the SDL surface I had initialized, so I hijacked QBASIC’s “OCT$” function (who even uses that, anyway). By using an existing function, I could ensure my code would still compile using an off-the-shelf compiler, but if OCT$ returned some very specific results, Black Annex would know that OpenGL was available and switch to using that instead. I changed the code for OCT$ in qbxlib.cpp so that it would always return a blank string of 22 spaces no matter what you sent to it, and then it would begin a sequence of initializing OpenGL. Making a call to OCT$ would first turn OpenGL on, then you need to send the width of your screen to OCT$, then the height of the screen. It looks funny to see these unexplained calls to OCT$ in the code for Black Annex, but there’s comments explaining what they do.

So I’d ended up with a build of QB64 that’s very different than the off-the-shelf version, and also supports OpenGL scaling, instead of the very slow scaling method I had used previously. Full-screen Black Annex is a lot faster now.

So next I turned to Linux with my new knowledge of how all this stuff works. I figured “I can probably get Linux working”. I installed Ubuntu on a Dell XPS17 I have spare (it’s not mine, I borrowed it for exhibiting at PAX). The XPS17 has an Optimus video card, so it took two instances of “Whoops, I broke everything, format” for me to get into Ubuntu (I don’t know anything about Linux so it was easy for me to break stuff).

I installed the vanilla QB64 onto my Ubuntu computer and compiled Black Annex. As it had always done, it crashed as soon as you moved the mouse. I jumped straight into the qbxlib_lnx.cpp file and got to work on finding what the hell the mouse was doing that made everything crash. It was a straight-up bug. The fellow who made QB64 must have just never tested relative mouse movement on Linux, because it just had a line that was telling program execution to literally pause whenever the mouse moved. I have no idea what the point of it was meant to be, so I just commented it out. Blam, Black Annex worked on Linux. I don’t fully understand Linux, so I’m not 100% sure how to deploy the game (it has these SDL dependencies), but with the game working, I ported all my OpenGL code over to the Linux libraries and I had Steam Overlay working on Black Annex in Ubuntu. The entire Linux effort took a single afternoon. It was an amazing result.

But then there’s Apple.

I have a really bad time trying to use MacOS. I get frustrated and fumble around and can’t find folders and get confused and end up installing Windows 8 on my iMac and breathe a sigh of relief. That is my relationship with MacOS up to this point. I recall the issues that I had with Black Annex on MacOS.

Firstly, there was the mouse issue, the same as Linux, game would crash the moment you moved the mouse. Then there was the ugly-as-hell terminal that would also run alongside the game reporting some kind of errors or something the whole time the game ran. Then there was this stupid .command file you had to run to actually start the game so that the working-directory would change before running the game so that it could find the SDL framework in its subdirectory. All these issues compounded with that fact that I struggle massively with MacOS made this seem like the scariest endeavor.

So I installed vanilla QB64 on MacOS and compiled Black Annex. It was exactly as I described. I quickly fixed the mouse issue, it was the same bug that had been in the Linux build, so the game worked at this point, but this horrible terminal window and the .command file you needed to use to start it was really ugly.

The reason it had this .command file was because all the SDL framework lives in a subfolder next to Black Annex called “common”, but in MacOS, when you run an executable (unlike in Windows), the program considers ./ to be the hard disk root, as opposed to the executable program’s folder. So when Black Annex looks for ./common, it wouldn’t find them. This .command file performs as chdir to the executable’s folder, and then launches the game so it can find all of its frameworks. I Googled the issue.

I found this program called otool, which you can use to find a list of every framework your executable relies on, and where it expects to find it on the hard disk. As expected, Black Annex was spending a lot of time searching for ./common. A little more searching and I found a program called “install_name_tool” which lets you change the URLs that your program expects to find its dependencies at. In fact, you can use “@executable” to direct these changes to areas on the hard disk relative to where the executable is located! So I wrote a little .command file of my own to change all the dependencies on an executable after it’s been complied by QB64, so the .command file wasn’t needed anymore.

Well, this worked all well-and-good for the dependencies, but what about the actual game content? It lives in a folder called “campaign” next to the Black Annex executable, and there’s no way in QBASIC for me to say CHDIR(“@executable”) or anything like that. I had to go back into qbxlib.cpp and perform a chdir in there by discovering the executable URL manually. This was a real fuckaround, with a lot of conflicting information as to whether it was even possible outside of ObjectiveC. Without delving into actual source code, I eventually found someone who had written a few lines of code to do what I needed, and worked it into my own uses.

So Black Annex would work now without a .command file to start it, the last thing was just this ugly terminal window that always insisted on being there while the game ran. It was just reporting “Warnings” constantly from the C source of Black Annex (which I never touch, considering I deal in the BASIC side of it only), so I wasn’t interested in fixing all the warnings hoping the terminal might go away if I did.

Well, I got distracted by something else…

I wanted to make a .app bundle for Black Annex. You know how on MacOS games are usually just these .app folder things that you just double-click on and the game runs? Well, I packaged up Black Annex into one of those and the terminal window I was arguing with just disappeared completely! I guess it’s just some magical thing where .app bundles just assume you’re not interested in debugging your software and hide that stuff.

I had to make one last change to libqbx.cpp’s new chdir code so that it would change directory to one inside the .app bundle and still find everything, but with that done, Black Annex would launch happily!

I sent the .app bundle to a friend who also has a Mac to test it out. He replied: “It says I need to install x11″. What the fuck is that? I have no idea what this means. It’s something to do with making Linux stuff work on MacOS. But Black Annex just uses SDL for everything and that works on Mac. Why is it using this x11 thing?

I went back to otool and checked the dependancies and saw this “x11″ thing in the list, it was loading something called “freetype”. I guess the default font that QBASIC uses is emulated in QB64 using this stuff. I don’t even use that font, I have my own text renderer I built for Black Annex. Sometimes I use “PRINT” while debugging, but I don’t plan on doing any actual QBASIC development on MacOS. So I went through libqbx.cpp, commented out every line that made reference to “TTF” font stuff, and remove every reference to SDL_TTF in the compilation process, and I was done.

I haven’t ported the OpenGL stuff to MacOS yet, but I now have Black Annex deployable on Windows, Mac and Linux. I still need to re-visit the Linux pipeline to make sure I’m not requiring the user to jump through unrealistic hoops in regards to dependencies, but the major work is done.

Black Annex will launch on all three platforms simultaneously.


At certain times, extra rooms are added to Black Annex during game-play. I actually cut this from the design doc about six months ago, but I was finally able to add it back in by piggy-backing on the system I build for spawning in enemies. It works in a much more complex way than the enemy spawn-in. With enemy spawn, there’s just an AI entity that’s invisible until it hears someone call for help.

When creating a new room, the clipping plane needs to be dramatically modified, and the zBuffer needs to be rebuilt as the room is spawning-in as well (the zBuffer typically only considers walls and static objects once when the level loads, and then never again because they don’t change.). There’s also the issue of “joining” tiles needing to appear to connect old rooms to the new ones, so certain wall tiles need to “listen” for a spawning room, and switch to a different type to connect to the new room.

In the video below, see how the new room actually “connects” to the old room, and a new window appears in one of the offices which wasn’t there before.

Let’s Distribute!

It’s now been a year since I first showed Black Annex (way before the game had been revealed publicly) to a distributor. I’ve spent the last year contacting distributors, getting to know them, reading contracts, researching them, and preparing a product for them. I’ve managed to get my head around *most* of the distributors that I have decided to launch with, and I thought I’d write a few words about each of them (except Steam because I’ve covered that well and enough already).

Hopefully you find some of this helpful in your endeavors.

gog header

Who Are They?: Some people call them “Gee Oh Gee”, I call them “Gohg Cohm”. I can’t remember which is correct. GOGcom are the biggest online digital distribution portal beneath Steam. They’re also a lot more exclusive, and have a much more targeted demographic. There’s no unified way to just put a game on to their service. Games on GOGcom need to appeal to the GOGcom audience, which does not exactly consist mainstream gamers. GOGcom used to be called “Good Old Games”, and build up a userbase of people coming to buy classic PC games repackaged and patched-up for modern PCs. This remains a huge part of their business still today, but they also welcome many new titles which appeal to a similar demographic. Retro City Rampage and Hotline Miami are obviously fantastic fits for their service, where-as Call of Duty or Street Fighter IV might not be so much.

I once said in an interview “Getting on Steam [via greenlight] means you won a popularity contest, getting on GOGcom means you made a good game.”.

Another important thing to note is GOGcom’s distribution model. They will not sell your game if it has any DRM, they won’t allow you to use your own installer, and you can’t use an icon of your choice for your game’s executable. All GOGcom games use an installer that has a couple of ads for GOGcom in it, and their games all use icons which feature art from the game in a little circle (at least as time of writing, it’s changed once before). I personally have no issue with any of these things, but some people might, I guess. Purchasers of your game can re-download the game as many times as they like by logging into their account on GOGcom, and they receive an installer which has zero DRM in the installation process.

What Will They Sell?: So, while GOGcom is an incredibly important player in digital distribution, there are some games that they will reject instantly, with fairly quick prejudice without even playing the game based on their initial impressions. You might need to accept that your game might never be a fit for their service.

They’ll sell finished games for Windows and Mac. No Linux and no Alpha funding/early access stuff. They don’t do demos, either.

Submitting Your Game: Back when I first contacted GOGcom, there was a tiny form you could use to email the team, and you’d just send it to “Business Enquiries” and tell them you were making a game. Eventually it would get into the right hands. Now, there’s a slightly more formal page to use at but it still just shoots an email to the people there and they’ll take a brief look at what you’re sending in. You’ll likely end up engaging in a dialogue with one of the business development people there after a short wait.

What to Submit: GOGcom very specifically advise you’re able to provide them with the following things before they’ll look at your game. Expected release date and price, a trailer or some game-play videos of the game, a build of the game for evaluation.

The evaluation build would ideally have 2-3 hours worth of playable content, and be mostly feature-complete. They’re obviously fine with missing features and lots of bugs, but they want to be able to sit down and get a really good idea of what the game is like before agreeing to anything.

Humble Store

humble header

Who Are They?: You probably know Humble for their “Humble Bundles”, which began with the DRM free “Humble Indie Bundle” and have since branched out into other (DRM inclusive) bundles, weekly sales, and their “Humble Store” and “Humble Widget” platform. If you’re planning on selling your game “Direct” (a link on your own website, which you drive traffic to yourself) your best option is to use Humble. They’ll give you a little box you put on your own page called a “Humble Store Widget” which lets people buy your game and download it from their service. Humble will take approximately a 10% cut of your sales in exchange for providing you with hosting and a unified purchasing platform.

For the buyer, it means that they purchase your game once, and can always re-download it from their account at humble’s website. However, they can’t make the initial purchase at Humble’s website, you have to drive the traffic yourself. Humble won’t help you market your game, or put it in front of customers’ eyes. They are your “Direct sales” platform.

What Will They Sell?: It seems like they’ll sell a lot of stuff. They even have a couple of movies on there. They’ll do Beta stuff. Windows, Mac and Linux are all cool, and you can throw in stuff like Soundtracks as well. They’ll let you give-away Steam keys with your games without hesitation, too. If you have an arrangement with other distributors for keys, Humble will let you put those in, too.

Submitting Your Game: Humble Store has a little web-form you need to complete to send them information about your game, it’s fairly informal. The URL to the form doesn’t seem to be something publicly available, so I’m not going to go ahead and post it here in case it’s meant to be a secret, but if you just email them at [email protected] and ask really nicely (I actually had to email three times to get a reply) they’ll link you to the form (It’s not the “Game Submission Form” on their support site, by the way.). You’ll need to actually supply them with some kind of build as part of the submission process. They’re not going to give you a hard time, once you have the form, just wait until your game is ready before you bother submitting.


amazon header

Who Are They?: Amazon are some massive online retailer. I bought a Bayonetta guide from them once, I think they’re a lot more popular in the USA than Australia so I don’t have a ton of experience with them from a customer perspective. They hate selling games to anyone outside the USA for some reason (even digital games) so a huge “fuck you, Amazon!” for that one. But other than that, they’re certainly a digital distributor with an “Indie Games” section. As far as scale goes, I’m not sure how many people are turning to Amazon for their digital download needs. I bought the BioShock triple pack there for $19.99 (had to create a fake USA account to do it) and it gave me Steam keys. That is my entire experience buying from them.

What Will They Sell?: Despite my back-handed comments about them, they actually do want to sell indie games, and they will talk to you and be helpful about getting your game on their platform. It looks like they’ll on-sell Steam Keys, which are emailed to buyers when they purchase. Get a load of this, though. You can go to your “Purchase Library” on amazon and just click “Download” to download the game directly from Amazon. This downloads a 1mb Installation file. This installer downloads a .html file from and puts it in a folder on your PC. This .html file has a Steam key in it. I thought that was pretty funny.

They probably actually do provide real downloads for indie games, but I just haven’t bought an indie game from them before, so I wouldn’t know.

Submitting Your Game: Amazon are actively seeking indie game developers, so you might actually get contacted by them if you’re making enough noise on the internet about your game. They’re really easy to talk to and, as I said earlier, they do want to sell your game. If you want to get in touch with them, send an email to [email protected] with the subject line “Bring Me Gamers”. Kinda dumb, but that’s what you do.

Greenman Gaming

gmg header

Who Are They?: Greenman Gaming is a pretty broad distributor. They seem to be, as far as content goes, pretty similar to Steam. They sell basically every type of PC game, they do Early Access/alpha funding, they re-sell keys from other services (almost primarily, actually) as well as running their own download service. There’s nothing particularly amazing about their service in comparison to others, but that’s no reason to pass over them. They have an easy-to-use system and a decent user-base. I’ve only bought my first games from them today just to see how it works and it really just consisted of them emailing my some keys and download instructions. Nothing I purchased was supplied by their own download service, all third-party (I purchased FFXIV and Reus).

What Will They Sell?: They’ll do alpha funding/Early Access, and they’ll sell Steam keys for you, but as far as direct purchases, I think they only do Windows games. I might be missing something, but I couldn’t find any Mac or Linux games on there.

Submitting Your Game: Much like Amazon, Greenman Gaming actively approach developers who are actively promoting their games. If you want to approach them, email Alistair at [email protected]. They’re pretty easy to talk to, and not the fussiest bunch in the world. They won’t really need to play your game before sending you a contract if you’re able to at-least demonstrate a working product to them with an active community around it.

Gamer’s Gate

gamesgate header


Who Are They?: Gamer’s Gate have been around for bloody ages. I think Penumbra Requiem was originally launched on there, because I bought that when it first came out on Gamer’s Gate but haven’t been back since (also, don’t buy it, it’s awful). They’re pretty similar to Greenman Gaming in that they just pretty much sell everything from AAA titles down to indies, and they have a piece of software you install on your PC to download the games that you have purchased. I managed to log in to my old account and for some reason I own a game called “Volvo The Game” along side Penumbra Requiem, so I guess that’s good?

What Will They Sell?: They’ve got Mac and PC sections, and it looks like they’ll also sell “Guides”, too. I believe they’ll do Alpha funding as well, as they’ve discussed it with me in brief in the past. They’re not very picky, and they’re happy to deal with indies.

Submitting Your Game: They’re actively approaching developers, so don’t be surprised if they email you out of the blue, but if you want to put something in-front of their face, email [email protected], they’ll want you to just give them the usual stuff like your planned release date, price, info about the game with some screenshots and a video, and a little write-up to help them understand what you’re selling them. Don’t stress over it, they won’t ignore you if you forget to mention something. They’re human beings; they’ll talk to you.


desura header


Who Are They?: Desura are awesome. Put your game on Desura. Just do it. Seriously, though, I left Desura until last because I wanted to book-end this post with my two favorite distributors. One way to think of Desura is that they’re a shop-front that sits on top of IndieDB, kinda. It’s the same account system and mostly the same content database. If you’ve got your game on IndieDB (which you really should) you’ve probably noticed there’s a “publish” button at the top there. That’s for selling your game on Desura. It’s super easy to aggregate your game content between IndieDB and the Desura shop page, and the IndieDB and ModDB community is fully integrated into Desura. Also, they’re an Australian company.

Desura uses a super cute client that runs on Windows and is really good (it’s low profile and easy-as-hell to use while actually having fun community features). You use the client to download games, but you can run the games independently of the client afterwards.

What Will They Sell?: Anything, really. They’re very open, you can put builds of your game up however you like, and they’re a popular place to run alpha funding and beta testing because of the large community there which are all interested in indie gaming. Desura is pretty much all indie games, mods, and community content, so alpha funding is pretty welcome there. Windows, Mac and Linux are all good to go with them. You can set your own price and really do whatever. They’re just swell.

Submitting Your Game: If you don’t already have an IndieDB page for your game, go make one. It’s never too early, even prototype stuff should have a page if you’re planning on expanding it as time goes by. Once you’ve got an IndieDB page up, just click the “Publish” button to submit it to Desura for sale. One thing they do require is that you provide at-least 10 screenshots of your game before they’ll sell it. Not sure why, it’s a definite requirement.

Comedy Option: Origin

hahahaahhaahhahaha no. (seriously, they charge you a bunch of money to sell games on their service and act like they aren’t actually desperate for decent games to sell and who the fuck buys games on Origin that aren’t Battlefield 3, Mass Effect 3 and Sim City?)

Black Annex – From Greenlight to Greenlit

greenlitBlack Annex has been Greenlit by Valve, and will be available on Steam when it is completed and ready for release. There will be no “Early Access” (or Alpha Funding) anywhere, through any distributor. It will also be available on many other distribution platforms. There is no release date.

So, with that out of the way, let’s talk about Greenlight!

Twitter announceI announced Black Annex to the world on the 2nd of April 2013. At the time, I had 551 followers on Twitter. I spent the next two days responding the public reactions to the announcement, and preparing a Greenlight campaign. In those two days, my Twitter follows jumped to 611 (This would be the largest jump in the month of April). This was the number of followers I would have to leverage my Greenlight launch. Black Annex was set to “Live!” on Greenlight on April 4th, 2013; exactly one year in to development.

The instant you launch on Greenlight, your campaign will appear in every Steam user’s “Greenlight Queue”. This is the extent of the marketing effort Valve will do for you. They will give you one shot in front of every potential customer’s face to convince them to say “Yes, I will buy that”. That is it. There is no prejudice, EVERY user is asked to vote. There is no concern for what genre of game they like to play compared to the genre of the game you’re selling, or what they might already know about your game. Everyone casts a judgemental eye on your campaign.

So, this is what happens on Day 1 on Greenlight, when Valve markets your game for you.


You don’t want Valve to market your game. Let me explain what you’re seeing in this image. The Yellow line represents “People who looked at your Greenlight campaign, and were asked ‘Would You Pay for This Game?’”; 2028 people. So, that’s how many people, thanks to Valve’s marketing push, were asked the question.The White line shows how many people actually took the time to answer the question (whether it was Yes, No, or Remind me later), which amounted to 1810. That’s not too bad. Not many people just moved on without voting. So we immediately see that when Valve markets your game for you, they get it in front of eyes that are actually interested in giving feedback. That’s a good start. Unfortunately, we look at the Green line next.

The Green line is how many of those votes were “Yes! I’d buy this!”. 805. 44%. So, less than half of the people that Valve drove to my Greenlight for me were interested in buying my game. Considering that the entirety of Steam’s user base was urged to vote, that makes sense. I don’t think Black Annex would even remotely appeal to the average Steam user. It has a specific audience. So with this day done, Valve’s marketing efforts very slowly start to wear off.

By my marketing push has just begun!

Now, there’s no question that I do not have the raw numbers Valve have, as far as audience goes. I will never have the number of views ever again that I got on that first day. That make sense, and there’s no point complaining about that. But, I have Valve beat hands-down when it comes to quality. If I drive someone to my Greenlight page myself, it’s targeted at someone who has a far greater chance of actually being interested in buying the game in the future. I don’t just spam in every direction, I made targeted moves in an attempt to actually get the elusive “Yes!” vote. I need my “Percentage of Yes” to be impressive if I want Valve to ever Greenlight me. Anything under 50% would be embarrassing; Valve already wrecked my percentage with their initial push, so I’ve gotta clean that up, and I only have small numbers to work with.

As a few days pass and I wait for my initial marketing to come into effect, we see their numbers cool off, and the percentage starts to creep to around the 50% mark. My first action has been to email about fifty websites, each one targeted directly at a particular staff member by name, with a hand written email in context of any previous talk we’ve had before. This takes a few days to prepare and send, and then for any websites to act on it. As the hits on my Greenlight page transition from “Valve Driven” to “Me Driven”, the “Yes” votes start to level out. By the 11th, we see a bit of a bump as my marketing is starting to move around the internet.

before viral

So far, the press has been as follows:

“Broadcast Syndication: Black Annex” -Rock, Paper, Shotgun
“Black Annex revealed with a kickarse trailer” -Pixels For Breakfast
“Black Annex Announcement” -TruePCGaming
“Black Annex: an isometric corporate espionage game built in QBASIC” -PCGamesN
“Black Annex – Corporate Warfare” -TheGamersPad AU
“A Crazy Australian Man Made This Crazy Video Game In QBASIC” -Kotaku Australia
“Local indie invites you to “steal, destroy, kidnap and kill”” -TheBlackPanel
“Isometric strategy stealth PC game Black Annex is a love-letter to Bullfrog’s Syndicate”
“Greenlight Spotlight: Black Annex” -Gamezebo
“Spotlight on Greenlight: Black Annex” -PCGamesN
“Head back to the world of 8-bit corporate sabotage with Black Annex”

So this was a good place to potter along at. Word slowly moves around a bit from these articles and people voting fairly evenly between “Yes” and “No”, but then this article went live: “Black Annex is the best QBASIC game you’ve ever seen”-PCWorld.


Black Annex went viral for 24hours because of the “It was written in BASIC” aspect. It was a very explosive time for the product which lead to articles popping up all over the internet, from Google News to Yahoo! Hackers News and a ton of places in-between. This, obviously, affected Greenlight in a very positive way.

So here we have the best piece of data to contrast “My Marketing” with “Valve’s Marketing”. Compare this to Day 1, and you’ll see how I had dramatically less over-all eyes on the campaign page, but a far better quality of visitor. 1345 votes were cast (compared to Day 1′s 1810) but 973 of those votes were “Yes!” (compared to Day 1′s 805). So that’s 72% “Yes” votes (compared to Day 1′s 44%), with a higher overall count of “Yes!” along with that. That’s a big improvement over Day 1 any way you look at it. The only way for me to have performed better on Day 1 is to have created a game that would have appealed instantly to a broader audience (a.k.a. a game with zombies in it).

To give you some perspective, for the entirety of the remaining time between this moment and being Greenlit, Black Annex would never have another spike in “Yes!” votes even 1/5th the size of that particular one. Not one fifth! It was an insane spike. Let’s move ahead a few days to the next spike (which almost was one fifth of that last one).

reddit spike


This spike is kind of interesting around the 29th of April as it was a return to the “Lots of views, not many Yes votes” pattern. The thing to notice here is that I got a lot of views, but a very small number of votes. The actual votes were very likely to be “Yes” though, so heaps of people came to my Greenlight with no interest in voting. What happened? I’ll show you.

I made this post on

So I made a post on Reddit almost completely unrelated to my game, but using my Greenlight page as an example of how to do something technical. This resulted in a ton of people checking out the little tip I was giving them. The ones who actually stuck around decided to throw me a “Yes” vote while they were there. This worked out really well, and become the second largest “Yes” spike I would ever achieve. It’s a good example of a kind of alternative way to get traffic to your Greenlight page. It’s still targeted to people I actually think would be interested in Black Annex, but also with a totally alternative reason to check it out. Keeping it fresh!

So despite the huge gap between “Number of Viewers” and “Number of Yes! votes”, the actual percentage of Yes/No was 64%, so it still helped heaps in re-gaining that “Yes Percentage” that Valve’s marketing had dropped so far for me on Day 1.

After this last spike, I backed off any massive marketing efforts and just kept tweeting all the time and marketing as much as I could. Rather than driving traffic to my Greenlight directly, I was more largely focusing on building up high quality twitter followers so that my marketing would have a better reach as time went by, and as PAXAus came closer. Greenlight activity slowed down, but twitter followers kept growing.

greenlight slowingGreenlight shows very little activity over this time.

png growthBut over this same time, I gained 108 followers on Twitter. During this, I would always block followers who were useless spammers like “I market your business!” or “I post links to porn and virus sites!”. I try to keep my followers list at a fairly decent quality.

During this time, thanks mostly to twitter, I was starting to get to know lots of super cool people who work in games journalism to some degree, and was often chatting about Black Annex and myself. Various articles would go online from time-to-time after a little chat, and eventually another spike came about thanks to Mark Serrells from Kotaku Australia putting this article online: This article aggregated to Kotaku USA as well, and Greenlight showed this in the graphs.



Now, these weren’t huge numbers (the largest spike there is 166 votes) but it’s an awesome quality of visitor, extremely likely to vote “Yes!” so it just helps on the overall appearance of my campaign. It’s really creating that image of “When people see Black Annex, they’re pretty likely to buy it!”. That matters, to me and to Valve.

Now, a little earlier this month I had flown to Los Angeles to go to E3. I took a laptop with me and had six interviews lined up to show some people Black Annex. While I was there, I met a YouTuber named GhostRobo (among a few other awesome people) who was super excited about Black Annex when I showed it to him on the show floor. After E3, he said he’d love to do a little video on Black Annex to help me out with Greenlight. That video would be the next spike that I would get on Greenlight.

Now, I’d heard over and over how “Youtubers = Greenlight votes” so this was pretty exciting, but Ghostrobo didn’t actually have a build of Black Annex with which to do a Let’s Play, or even show any new content that had not already been publicly shown. All he had was the launch trailer, and a recording of a live gameplay stream I had done a few days beforehand (more on this soon). So he threw up a video about Black Annex and I saw a nice little spike from that.

ghost robo

Obviously nothing amazing, but hugely better than just letting anything stagnate. Now, I mentioned that I had streamed some Black Annex game-play online, that was great. It gave me a nice boost in Twitter followers when I mentioned my Twitter name during the stream, and it gave me a little 40min video I could use to demonstrate the game to people. I sent that video to Rock, Paper, Shotgun and this happened:

rps 2


Another awesome spike (you can see GhostRobos spike just to the left of it there). RPS had basically just thrown up a quick writeup about my stream recording, calling the game “cute, silly, and interesting” basically. The really interesting this about this is how only about 50% of people who they drove to my Greenlight voted “Yes”, but almost no-one voted “No”. Rock, Paper, Shotgun readers are officially my favorite online community because of this. It’s not that they all love Black Annex, it just shows that if they’re not interested, they won’t say “This sucks!” and slam the “No!” button, they’ll just move on to something else. That rules! So yeah, I really appreciated that.

And that… was that, really. PAXAus came and went, and that was a campaign for twitter followers (you can read more about that in my previous blog post), and didn’t really cause a spike in Greenlight, it just kept the bump going after Rock, Paper, Shotgun’s latest article. I spent most of August just relaxing after PAXAus and catching up on smaller things. You can see how immediately Greenlight falls back down after you stop massive promotions.

almost doneI’d be lying if I didn’t say that I was starting to lose faith in my hopes of ever getting on to Steam. I was 78% of the way to being #100 after PAXAus, but it started dropping, and went down to 73%. I was only three-quarters of the way to #100, then there would be 100 more people in-front of me still! So daunting. I had managed to successfully combat my poor “Yes!” percentage that Valve had initially caused for me, and I was at 49% “Yes” and 50% “No!” (the margin of error was in favor of No).

Almost at 50/50 Yes/No, still needing about more 20,000 “Yes” votes needed on top of my current 12,000 just to be in the top 50 of Greenlight. So, on Wednesday the 28th of August, at 1am I had finished re-arranging my studio and setting up a really nice PC that I hardly ever use to be me new main workstation. I went to bed. I put my phone on the charger, set my alarm to get up for work at my day-job the next day, and put it on the floor.

Then my phone made the “You got a gmail” noise. I had just set up a new Asus Wifi access point and it wasn’t working properly. I picked up the phone and looked at the screen. It said

“Steam: Black Annex has been…” [Slide to Open]

I looked at it and thought “Why the fuck would Steam email me about Black Annex unless they had to remove it from Greenlight or I violated something…”, I slid the thing and my Wifi crashed and refused to open the email. I got pissed off, then my wife’s phone made the “You got a gmail” noise. She is also a “Creator” on my Greenlight page. She woke up from the sound and I said “What is that email? What does it say?” while I was turning off my Wi-fi so I could just check my email over 3G instead. I had to force-close GmailApp and re-open it so it was taking ages.

My wife was too tired to make any sense of what she had just read on her phone and wouldn’t answer me properly, she started going back to sleep.

I opened the email on my phone and blurted out loudly. “Oh my god, we got Greenlit. We got Greenlit”. It was about 1:10am. I rushed out of bed and got on my new computer.


So… that happened…

I don’t know why that happened…

Valve Greenlit 100 titles. I was more than 25% away from being in the top 100, this means games were passed over in favor of Black Annex. I was about 4000 “Yes” votes away from being #100 at the time.

But Black Annex got Greentlit. So that’s a thing that happened.

Thanks, everyone. Reddit, SomethingAwful Forums, Twitter… everyone.


Where We At

I’m at a stage with Black Annex at the moment where most of the development time is spent creating content, rather than working on the technical side of things. The features are nailed down (although some still not implemented) and most of the technical hurdles are overcome (except optimisation, there’s always room for more optimisations) so I don’t really get to just play around with code all that much in Black Annex right at this time.

So, one week ago I opened a blank new project and started creating something. This blog is always about the more technical side of what I’m doing, so here’s some video of something totally new.

Maybe one day it’ll turn in to something more.

A PAX Roundup

When exhibiting at something like PAX, you need to think about what exactly you’re trying to get out of it. Where your game is finished and available for sale already, your “Call to action” at PAX would be for people to buy your game. Black Annex isn’t finished yet, it isn’t even in beta and there’s no publicly available demo for people to play, so what is the “Call to action” for attendees who saw Black Annex at PAXAus? Three things, in order of priority (this doesn’t include vague things like “Get excited about Black Annex! Tell your friends!”, these are measurable things).

  • Follow @manfightdragon on Twitter
  • Vote for Black Annex on Steam Greenlight
  • Visit

For media at PAX, the call to action was:

  • Write something about Black Annex on the internet.

So lets talk about how I expressed these calls to action to the people I met at PAX (or communicated with online before/during/after PAX), and what kind of result it all had.

The first thing I had to do was prepare media for Black Annex at PAX. I wrote about 190 emails individually to media people who were granted media passes to PAXAus. For every person I emailed, I made sure I already knew a little about them. Do they follow me on twitter already? Do they follow me back already? Have I talked to them before? Have they written about me online before? What kind of stuff do they write about online? etc.

I build a huge spreadsheet of all this information in one place, and spent about three days (one month prior to PAXAus) writing all the emails up. I asked Mark Serrels (Kotaku Australia) for some opinion on how/when to send emails to press. Among the advice he gave, he also published an article on KotakuAU (which I think aggregated to Kotaku US maybe?) where he mentioned the insane effort I had put into press contact. You’ll notice the effect this article had on my Greenlight stats later in this post.

The emails I sent all were about 2 paragraphs long. Here is an example of one I sent:

“Hey, Dave! It’s Lance here (@manfightdragon on twitter, guy making Black Annex,, don’t act like you don’t know me). Anyway, you’ll be at PAXAus, yeah? I’m in the “Indie showcase” there, at booth 2330 specifically (theres a map app thing here: ) . If you don’t come say “Hi” to me at some point, I’ll be a big sad baby forever because I am literally a child.

So yeah, I better catch you there at some point!
(I’m also on the indie showcase panel at 8:30PM on Friday but that’s boring you don’t have to do that)”
Now, Dave already followed me on twitter, and we had talked in the past and he had DMed me his email address, so I didn’t need to mention twitter to him as we already have a relationship there. But, almost every email I wrote to press that day ended with:
“(PS. tweet me maybe, @manfightdragon)”
post email twittersSo I wanted three things from this exercise. Email replies saying “I will come say hi!”, people to actually come and say “hi!”, and people to follow me on twitter. The most immediate result was twitter follows (emails were sent on the 24th, you can see an immediate spike followed by steady growth.). About 80% of email I emailed replied, and about 90% were “Yeah, I’ll come see you!”. I had a short dialogue with everyone who replied.
So that was the main action I took to prepare for PAXAus. I hadn’t updated this website since getting back from E3, as it’s not really a marketing tool in any way at all.
So lets look at what happened during, and just after PAX in any measurable way I can so far.
The Press: The most immediate press results were in the form of tweets, here’s most of the ones I can find that happened during PAX (or just after):

Articles went online starting from the first day, and are still continuing now. Here’s a few I’ve seen so far:,pax-australia—three-days-of-gaming-costumes-and-queuing.aspx
There’s a few others floating around, but Google Alerts is probably the most awful way to try to track this kind of thing, so I can’t pull up a list of them easily right now. A huge part of the press result was meeting so many people, and I’m not in a lot of discussions in regards to further marketing opportunities, so this will span a fairly large time-frame.

pax twitersTwitter: At the booth, we had mints with our twitter handles written on them, and I had business cards with my twitter name. The mint trays also had little tags sticking out of them with @manfightdragon written on them. Twitter followers are probably one of the best things to get out of something like PAX, because they’re people who care about you, or your game, and they’ll help promote it for you. If you say something interesting, they’ll hopefully retweet it and spread it around super-fast. Twitter followers, for me personally, is the most valuable thing to have in promotion. Other people might be better that harnessing Facebook or Google+ but I can’t get my head around how to use those effectively. So, overall, a great result in twitter followers. I was telling a lot of people face-to-face, on camera, or on the panel “Follow me on twitter”. I wasn’t giving anyone my email address or any other way to contact me.

pax greenlightGreenlight: Okay, let’s talk about Greenlight for a bit. Everyone wants to talk about Greenlight, right? Well. PAXAus was, easily, the biggest Greenlight spike I’ve had in a while. It’s not as big as a fantastic RPS article, or getting a storm of KotakuUSA+PCGamer in one day, but it was still really REALLY good. Also, just out of interest, notice how a KotakuAU (And I think it went on KotakuUS at the same time) article gets more visitors (yellow) but less “Yes” votes (green). Where as an article on RockPaperShotgun gets less visitors, but the traffic you do get are more likely to vote “Yes”. Target your marketing!

Ahem, anyway. Yeah, so PAX had a great result, partially because a KotakuAU article went up on Day 1, but also because one of my big “Call to action”s for visitors was to go to, which has a big Greenlight button on it. Greenlight doesn’t tell you exactly where people are coming from who see your campaign, so it’s hard to get a result on that kind of thing. I’m interested to see how Greenlight fares as a few more articles go up over time in the post-PAX period, and which spikes I’ll be able to correlate to what events.

So yeah, PAX was a big marketing success. Now I have to actually make a game, I guess…

Let’s talk about PAX, baby.

I spent the entire last two months preparing for E3, which was an awesome lead-up to readying Black Annex for PAXAus.

Knowing that Black Annex would be playable by the general public at PAXAus in a massive booth, I took a very rough build to E3 and let about ten people play it there with no guidance (I just silently stood behind them to find out what guidance I need to build into the game and get it ready for PAX).

E3 was great. It was super fun and absolutely massive, I met some amazing people there. I spent time talking to Joystiq, RockPaperShotgun, GhostRobo, Fullscreen Arcade, BeefJack, and Random Assault Podcast. Among all that, I also got a chance to just explore E3, see lots of awesome games, and also be amazed by my first time in the USA.

BPR5pMvCYAAKHp_But that was all to prepare for PAXAus. So I made a single mission for Black Annex that was *fairly* hard, but also do-able with a few brute-force attempts, and built a short (somewhat confusing) tutorial into the start of the game. I had a team of five people including myself to help run the booth (@manfightdragon, @honeycommbe, @urbanneurosis, @takorii, and @davomagnifico). I had sent out about 200 emails a month before PAX, each individually written and catered to each person inviting them to stop by the booth and meet me to check out Black Annex. I was fully booked all 3 days to be in interviews, so I knew I’d need people at the booth the whole time for me.

IMG_1386In the lead-up to PAXAus, while I was preparing the demo and talking to media, @honeycommbe was preparing the booth. We would have a trestle table with two desktop PCs (actually an iMac and a laptop hooked into a KVM), and one press-only demo unit (a laptop on a bar table). We also had a small cabinet, and five seats. We brought two A1 posters with our own art, three rice-bubbles boxes that we put printed sheets over to create fake “Big box” Black Annex retail boxes, glass jars filled with mints which we had written our twitter handles on (using food dye), about 1500 button/pins, of which there were 6 different styles in two fishbowls at the booth. We also brought business cards in holders.

IMG_1396We packed a car and drove to PAXAus. I arrived Wednesday in the expo hall (PAX begins Friday). I took all the bulky items in and set them up. I wasn’t allowed to hook up the electrics until they’d been “Tagged”. I ran into Jerry (from Penny Arcade Co.) and got a very excited photo with him after giving him a run-through of Black Annex. I left things for the night and got some sleep.

The next morning, I wandered back into the expo hall, still with one day to go before the actual show, hooked all the electronics up and made sure everything was sound. After a lot of work, preparation and meditation, we were ready for the media and the public to come and play Black Annex for the first time. (Sidenote: I’m pretty sure the entire “we have to test and tag your cables!” thing never happened). I didn’t want to leave, but I had a VIP event to go to where press people would be mulling around, so we headed over there.

IMG_1411The next morning we arrived about two hours before the media would be allowed in (which happens one hour before the public are allowed in). We chatted with other exhibitors, and waited. I expected a huge flood of media to enter, but it was only a very small group of people scattered around. All the media people who came by in the first hour knew who I was, and a few sat down to play Black Annex and have a chat. They all seemed fairly happy.

IMG_1439Eventually, time passed and the public came in. The public was a massive crowd, and after about 30 minutes, the Black Annex booth was absolutely packed with lines for both demo units. It stayed that way for the entire expo. People found game-breaking bugs and we realized that we needed to manually re-start the game every time people walked away from it (when the public sit down to play a demo game, they don’t esc->new game, they just start playing.). The response was fantastic, most of all from the press-people who wandered by. There was a huge mix of people who had heard of the game, and people who had no idea what it was. I spent all my time between booked interviews and ad-hoc interviews. There wasn’t really any down-time at all. Having five people at the booth was definitely necessary.

IMG_1452So I took an alpha build of Black Annex to PAXAus as one of six people chosen to be in the indie showcase. I had an enormously positive response from the media and the public. I got to meet a lot of new media I’d never met before, and got to finally get face-to-face with many I already knew well.

It was an immensely important event for Black Annex, and it’s caused a massive boost for the game’s position online now. I’ll be pushing out a lot more information about “What PAX meant for Black Annex” over the course of this month and as time goes on. There’s a lot to be said, and I’m really glad it’s all done now.


A lot of the jobs on my to-do list are variations of “Make [x] not run like shit”, so I’ve been spending a lot of time making things run a lot faster, and the overall system requirements for Black Annex a lot lower.

So one of the first things I managed to do was fix an issue paging the video buffer meaning that even when the game was running at 60fps, the screen would only update at 30fps. I didn’t even realize this was happening until I fixed it so now the game is literally running twice as smoothly as it was in the PAXAus AIS demo.

Performance MenuAfter this, I needed to seriously think about getting the game able to “Stretch to full screen”. I mean, I’ve had it working, but the “stretch” was slowing the game down massively so it would drop about 20fps when doing it. I had been just treating the screen like a rectangle and scaling it in a really basic way before blitting it to the computer screen. It was running horrible, so I started working on a way to actually map the screen to a couple of texture-mapped triangles and scale those up to the screen size instead. I ended up getting this working, so the screen is sliced into two triangles, then the two triangles are drawn back onto the screen at a new size to make the game full-screen. This turned out to be almost no slower than drawing the screen at the original size. Dealing in polygons seems to be pretty snappy, it turns out!

When I figured that out, I went back and changed almost every sprite-blitting routine to use texture-mapped triangles instead, and this sped up the game massively, especially if any form of scaling was being used on any sprite. The problem is, there’s no filtering, so I can’t smooth the screen or anything. Scaling square pixels to funny numbers can get some ugly results. I’m going to let the player run the game in any resolution they want, but they’ve got a few options on scaling. They can just go straight-up “Full screen” and just put up with any ugly pixels, or they can “Scale to nearest square pixels” which leaves some black borders at some resolutions (It will scale to 100%, 150%, 200%, 250%, etc. Keeping things fairly nice), and they can turn on “allow 25% extra scaling”, which allows 100%, 125%, 150%, 275%, etc. It’s a little uglier, but it’s up to the player to decide what they’re happy with.

A Pixel ShaderSo that’s done! Although I had at least tried to put some kind of screen filter in, it was just too slow to actually use. During that process, I did actually make a pixel shader for the game, which a lot of people though was pretty cool. It’s just a tilt-shift thing which gives everything a kind-of “Miniature” look. It will just be optional in the game as it runs like trash, but I like leaving things like that in for people to fiddle with.

But THAT lead to me deciding to work on some absolutely massive performance tweaking for the engine. I decided it was about time to actually go ahead and work on “Frame Skip”. “Frame Skip” is where you measure the time it’s taking to render the game’s graphics and, if it takes too long, turn off rendering until the game catches back up again. This results in “choppy” gameplay, instead of “slow motion” game play when things start getting too heavy for the CPU. The good thing about frame skip is that it lets people with computers just a little below requirements still play the game at the same “speed”, they just notice the game looks a tiny bit worse. It’s much less frustrating than having the game run at a snail’s pace.

I made it so Frame Skip comes on gradually, so if the game only slows down only for 1 second, it will give you a little mix of slow-motion and maybe just skip 2 frames or so. This means that if a GUI element takes a little bit too long to populate (Some of them have elements that stream from the hard drive), the GUI animation will still remain smooth instead of just jumping in. If the entire game runs slow, the frameskip will quickly go to full effect and the whole game will just be a bit jumpy.

So that’s great! The game runs way better on this Core Duo Mobility laptop I have for testing, which it was kinda unplayable on before. It still needs some tweaks but the technology is there and working so I’m super happy with that. The next item on my to-do list said “Make Pathfinding faster, a LOT faster” so I decided I really needed to finally wrestle with a* Pathfinding and make it work. Doing this in BASIC is extremely hard because you can not create arrays of arrays, and there’s no pointers either. I had to create a ton of different arrays with a bunch of arbitrary reference keeping arrays between them so they can point back and forth to each other. I also ran into a massive issue calculating the heuristic for my map because I use a horrible skewed coordinate system. A goon by the name of “testsubject” eventually figured out the math for it and I’ve had awesome success now implementing a*.

I uploaded a video showing the game running with the old pathfinding, and then I pull down a menu and change it to a* in real-time and the game instantly returns to 60fps with no frames dropping at all. Have a little read of the video description on youtube if you want a bit more detail on exactly what I’m doing in the video.

So that’s what’s new. Oh, I’m also going to E3! I won’t be exhibiting there or anything, just hanging out and hopefully meeting some cool people. I’ve never been to America before, tweet at me if you want to meet up or something.

March to PAXAus – Finale: You have been judged…

greenlightI didn’t really make it clear what I was doing in March, I just just smashing out updates every day to try to create a cohesive, playable game out of the pre-alpha version of BA Project. The reason for this was that the deadline for submitting a playable demo to the judges at PAXAus was April 10th and I really wanted to try to get something into their hands that actually “worked”.

So I spent the entire month of March smashing through as many critical features that the game needed to actually work as a whole. With that done, I hit the Alpha milestone and announced Black Annex. Around April 7th I sent the most bleeding edge build into the PAX judges after about 30mins of playtesting and two last-second fixes. (The final playtesting is shown in the video below, recorded around 3am).

For a little fun, I built a gimmicky custom intro into the PAX build which makes it appear that you’ve launched a DOS command prompt when you run the game. It just dumps you into a DOS window reading: “C:\GAMES\BLACKA~1>”, slowly, the commend prompt types out “annex.exe /paxmode”, a fake DOS/4GW runtime starts, and then a warning saying “YOU ARE SEEING THIS SCREEN BECAUSE BLACK ANNEX WAS LAUNCHED IN ‘PAX MODE’”. The moment the player pressed a key on the keyboard, the entire computer screen instantly goes black and the demo starts.

The demo had an utterly broken Main Menu that liked to randomly drop in and out if you clicked “Begin Game” too quickly, the Options menu didn’t work, and sometimes the “BLACK ANNEX” logo itself would just disappear. The only instruction given to the player was a loading-screen hint reading “Left click to make your agents walk to a location, double-click to run.”. There were five “playable” levels, but all of them were either uncompletable due to being massively unbalanced, or completed within 10 seconds of the level starting because the mission objective was way too simple. The minigun was completely broken, if you stacked three weapon abilities none of them worked, nothing made sense. The mouse cursor was an uncontrollable wreck plagued by a bug that I’ve only now fixed two weeks later and the “Mission Deploy” screen would just randomly close sometimes as soon as it opened. Loading took up to twenty seconds per level and the game ran at about 40fps on a computer made one year ago.

I can not stress enough how little sense this game made in the demo. You were dumped into a game with way too many mechanics, none of which were explained to the player and most of which barely functioned correctly anyway and expected to find, as the PAXAus submission form said “fun factor and a great gameplay experience.”.

As the creator of Black Annex, all I see when I play it is a mess of systems interacting with a bunch of unintended things happening all over the place.

The judges at PAXAus didn’t see the same thing I see. They sent me an email to let me know.

ais logo mediumSo now, me and five other Australian developers are going to be part of the Australian Indie Showcase at PAXAustralia 2013. We get to do a panel! So come to PAX and ask me about making a game or something.