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.

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.


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.

Full Disclosure

Well, a lot has happened over the last couple of days so I’ll just post this first-up before I go on a rant.



So the first thing I did the other day was upload a trailer to YouTube but leave it “unlisted”. I posted a link to it on twitter and publicly said the name of the game for the first time. The tweet went absolutely crazy instantly with re-tweets allover the world from so many amazing people.

Then, I posted the trailer on Facebook and started responding to twitter comments that were flooding in. I then posted on reddit with an amazing result over there. I clicked “Publish” on the YouTube video so it aggregated a little automatic post to all my social media connections there and pushed to all the subscribers. Then I posted the blog post here which automatically pushed to Facebook and Twitter.

After that was all publicly revealed, I spent some time talking to people about the game all-over the internet, and I sent a quick link to Simon Roth over Skype, which he seemed to think was pretty cool.

A few particular media people had asked me to keep them in the loop in the past, so I sent them a quick bit of contact to let them know I’d pushed out some new info. They seemed happy with that. The day pottered on with lots of excited people talking about how much they loved the trailer, and I sat at the top of /r/gamedev on reddit until I went to bed.

I woke up in the morning to see a post on Rock Paper Shotgun and I was shaking with amazement. Simon had sent the trailer to them and they seemed to really like it. A few other media-mentions popped up the next day, and things have just been crazy busy since. I’ve received some really interesting emails from lots of different people and everyone overall seems really excited about Black Annex.

So, with that, launched the next evening to give me a central place just to gather the media for the game so I can keep this blog just for my normal ranty updates.

It’s been an amazing few days and now I’ve got a huge amount of expectations to live up to. Still gotta finish the PAX demo.

Year two, day one or: Introducing…

One year ago today I sat down in front of a blank QBASIC document having gotten sick of working on a 2D adventure-game engine for DOS which had constantly run into memory limitations. I made an isometric tile editor, a sprite editor, a spritesheet builder, and a little game engine that put them all together and made them move around. Then I made a post  on this website about it to show it off.

Lots of people found my work really interesting and paid lots of attention to what I wrote every few days about my adventures in a struggle to make a game in QBASIC. Many months later I visited a site called for the first time, made a post there called “I’m making a game in QBASIC”, and showed people some screenshots of it. I thought everyone would think it was a really stupid idea, but lots of people really encouraged me to keep working hard and had lots of positive things to say about the work I had done so far.

Since then, people talk to me about my game and ask me for updates. Sometimes a person knows who I am even though I’ve never interacted with them. I even got mentioned on a real video game website! People who I care about actually follow me on twitter and they listen to what I have to say. Hundreds of people talk to me and online and actually sit down to read the often nonsensical things I write on this website just to keep up with what I’m struggling through at the time to keep working on making a game in such a limited environment.

It’s been a year of nights staying up until 3am with 9am starts the next morning. A year of missing time at the gym because a door keeps randomly opening the third time you visit a certain level. A year of missing time with my wife and daughters because half the chair legs on all the desks are the wrong shade of grey and tomorrow is screenshotsaturday.

But most of all, it’s been a year of amazing encouragement from a huge online community of people who really actually care about the effort I’m putting into making a game that they might get to play some day.

I’d like to show you a game I’ve been making; I’d like to show you Black Annex.