So, MAGFest was insane.
There was an entire hall full of arcade machines, both vintage and modern:
Another entire hall was dedicated to a huge array of console games dating back to the NES, plus a bunch of competitive modern games being played on huge projector screens:
And of course there was the MAGFest Indie Videogame Showcase (MIVS):
55 indies were invited this year, and we were one of them. Because MAGFest runs 24 hours a day, Legacy of the Elder Star was up and playable on two machines for 74 hours straight, from noon Thursday to 2pm Sunday. Erik (the game's artist) wasn't able to come due to financial constraints, so I built and ran the booth alone.
Here's how I did it.
Legacy of the Elder Star
For those of you unfamiliar with Legacy of the Elder Star, here's a quick introduction to the game:
Constructing the booth
There was no pipe-and-drape anywhere at MAGFest. Because big, bold artwork is a proven draw at shows, and because getting it up high (so it can be seen at a distance) is so crucial, I decided to build our own.
For the structure, I ordered this 8x10' photography backdrop frame for $35. It collapses down into 2.5' segments which pack together into a convenient carrying case, which would later prove important for transport since I had to fly from SLC to DC.
For the backdrop itself, I ordered two black 8' drape panels at $20 apiece from pipeanddrapeonline.com. They have a curtain rod pocket sewn into the top and bottom, making them easy to fit onto the frame. Crucially, these panels are inherently flame-retardant, which is a safety requirement per the fire code of National Harbor, MD, where MAGFest takes place.
The MIVS space provided tables, chairs, and power, but that's it. Expo center tables are always ugly and beat to hell, so I ordered this simple black tablecloth for $12 to make the table look nicer. From past experience I've noticed expo center tables tend to measure anywhere from 6-8' long and 2-3' deep, so I picked a really long tablecloth that could easily accommodate the larger tables and still be able to reach to the floor (which looks nicer).
Standing on bare concrete all day is incredibly fatiguing, so I also picked up two of these rugs (in black) from Overstock.com for $28 apiece. They're 8' long and 2.5' wide, giving us a total coverage of 8x5' when laid side-by-side. That pretty well approximates the front half of a 10x10' booth, and the back half is covered by the table (with a tablecloth that reaches the floor) so we didn't need any more floor covering back there.
I printed up two 2x6' vertical vinyl banners at GotPrint.com for $21 apiece. Erik painted the Cosmonaut banner on the right in Photoshop at a resolution of 7,200 x 21,600 (300 dpi) in CMYK color. For the screenshot banner on the left, I dumped screenshots out of the game at 4x resolution, then manually patched in our super-high-res source assets for the few elements where the compressed in-game assets didn't scale up cleanly. These banners come already grommeted; I used these 28-cent S-hooks to hang them from the backdrop frame.
I printed our 36x24" key art poster through Vistaprint.com for $20. I used this $11 grommet kit to install grommets in the top corners so I could hang it from the frame in the same fashion as the banners. To prevent curling, I took a half-dozen binding bars from this $11 pack of report covers and slid them onto the top and bottom of the poster, giving it rigid support across its width.
Here's the final product in action:
Equipment and security
At past shows I've demoed on one or two MacBook Pros hooked up to 27" monitors, but for a 24-hour show there's no way in hell I was going to leave those systems at the booth overnight; they're pricey enough (and portable enough) to motivate people to figure out how to cut a cable lock.
So instead I ordered two of these refurbished HP all-in-ones from NewEgg for $240 apiece. They're 19" displays and just about minimum spec to run Legacy of the Elder Star decently well and, crucially, they have a Kensington lock slot on the back.
To lock them down I picked up two of these Kensington cable locks for $20 apiece. I just wrapped the cable around one of the back table legs. It was a bit awkward with the tablecloth in the way but because I did it on the back side of the table nobody could see that. ;)
Each system also had a power cable, a mouse, and a pair of headphones attached. To lock down those peripherals I grabbed two of these $3 cable traps (one for each system). If you've never used a cable trap before, they can be a little confusing at first:
- Open the cable trap.
- Run the cables you want to lock down through any of the three small openings. I used one for the power cable, one for the mouse cable, and one for the headphone cable.
- Close the cable trap.
- Run the looped end of your Kensington cable lock through the large opening.
- Wrap the lock end of the cable lock around a table leg or similar, then pass it through the looped end, then attach it to the Kensington lock slot on the computer.
This prevents the cable trap from being opened until the Kensington lock is disengaged, and that in turn prevents the power/mouse/headphone cables from being removed from the trap.
The power cable and mouse came bundled with the all-in-ones. They had a keyboard too, but Legacy of the Elder Star doesn't require a keyboard so I simply omitted it from the setup to prevent malicious players from e.g. alt-tabbing out and screwing with the OS.
For the headphones, I ordered two pairs of $15 Amazon Basics headphones. They're on-ear and not all that comfortable, but they're fine for short sessions. Their sound quality and isolation are actually really impressive, more on par with a $60 kit. These really helped players appreciated the soundtrack in Legacy of the Elder Star, since the all-in-ones' built-in speakers are crappy and the MAGFest show floor is really loud.
I also brought a cheap power strip I had lying around, just in case. This turned out to be a good choice because we only had one plug available to service three booths. :(
That was it for booth equipment, but for myself I also ordered a pair ofDownBeats earplugs for $14. These were the best investment ever. They hugely reduced the din on the convention floor while making people who were speaking at or near me much more understandable. The reduction in background noise also left me feeling much less fatigued after exhibiting each day.
Transportation and setup
I live in the Salt Lake City area and MAGFest is just outside Washington D.C., so I had two options: either ship everything to the convention center, or check it all onto the plane.
I checked shipping costs and they were eye-watering, so I decided to invest the money in this heavy-duty Pelican gear case instead. I loaded it up with both all-in-ones and custom-shaped foam (Pelican's packing foam solution is easy and brilliant) and both systems survived the rough airport baggage handling process just fine.
Pelican cases are expensive (this one – the 1610 – is $200), but they're absolute tanks. I didn't end up saving any money compared shipping costs this time, but now that I have the case I can avoid shipping costs every time from here on out, so it'll pay for itself really quickly.
I didn't want to over-pack the case and diminish the protection for the all-in-ones, so the power cables, mice, headphones, and various miscellany (masking tape, S-hooks, etc.) went in my carry-on bag with my clothes and stuff.
All the booth decorations – the backdrop frame and drapes, vinyl banners, poster, tablecloth, and rugs – all got rolled up, one inside the other, and the whole roll went inside this $25 duffle bag, which I then checked alongside the Pelican case. This stuff didn't need protection because the roll was essentially its own protection: the backdrop frame was in the center and all the soft stuff was rolled around it in layers. This was super-easy and super-effective, and made on-site setup and teardown a breeze.
I carefully selected both the Pelican case and duffel bag to just barely fit within the airline's maximum checked baggage size restrictions. I used a cheap luggage scale to verify the weight: the duffle came in at ~35 lbs. and the Pelican case at ~45 lbs. (The downside to Pelican cases is that they're heavy: this one is 19.5 lbs. empty.)
Carting all this crap to and from the airport was slightly annoying, but the Pelican case has wheels and an extendable handle, and due to its size and construction I was able to drop the duffel on top and strap it to the handle and wheel all 80 lbs. of gear with one hand, while managing my personal carry-on with the other.
A 24-hour build absolutely must be able to run reliably while unattended. I also wanted to make sure players stayed focused on the game and didn't need/want to screw around in the OS.
The demo machines ran Windows 10 Home. To make them demo-friendly I disabled all screen saver and power-saving options, system notifications, etc. and set a Legacy of the Elder Star-themed desktop wallpaper.
To ensure the game re-launched itself if it ever crashed or was somehow exited by the user, I wrote a simple batch file to launch it:
It's hilariously unsophisticated, but it's simple and it works. (This launcher.bat just sits inside the game install folder, right next to the main executable.)
To auto-launch the game at startup (in case the system ever rebooted itself, or needed to be rebooted from a hard-lock) I dropped a shortcut to launcher.bat in the Windows startup folder, which in Windows 10 can be accessed by running the shell:startup command.
Windows 10 requires a user login at startup by default. To bypass that, I ran the netplwiz command:
...which opens a window in which you can un-check "Users must enter a name and password to use this computer":
With that set up, I could now power on the system and simply walk away: it would log in and start the game automatically, and keep restarting it if it ever exited (which it never did). And in the few instances where we did run into a soft-lock (an issue I'm still trying to track down) I was able to just quickly power-cycle the machine and avoiding having to plug in a keyboard. (As you'll recall, I omitted the keyboard from the setup to prevent users from screwing around where they shouldn't, and because it's not required for or used by the game.)
The attract loop
For the build itself, I set up an attract loop which was just a bit of script in the main shell scene that ran a timer and, if it didn't get any user input for a certain time, automatically loaded back into our intro scene (and when the intro finished playing, it loaded back into the shell scene, and so on):
The attract scene played our game's story intro; it would've been better to play recorded gameplay, but I haven't implemented gameplay recording and running a fullscreen movie at a consistent frame rate seems to be beyond Unity's capabilities. :|
The attract scene is skippable by clicking the left mouse button, but during the first day I noticed several people not trying that, and instead just assuming they were looking at a non-interactive demo; they'd watch for ten seconds or so and then walk away. That night I pulled out my MacBook Pro and added a "Click LMB to play!" tag at the top of the screen during that intro, and deployed a new build to the demo machines. Friday and Saturday saw much-improved engagement.
The idle timeout
Players will not gracefully exit back to the shell when they're done; they'll just get up and walk away. I didn't want new players coming in in the middle of a run, having missed all the early patterns that are designed to teach you how to use your weapons, so I implemented a simple idle timeout where the game would automatically return to the main shell if it didn't receive any user input for 30 seconds.
The IdleTimeout component lives on a GameObject in every scene and continuously monitors input for this timeout condition. It was easy to write and very effective.
I did experience a strange issue during Thursday's demos, though: if players left the game at the end-of-stage score screen (specifically that screen), the idle timeout wouldn't kick in. When I checked it on my MacBook that night, the IdleTimeout object was definitely present in that scene, but I could still repro the issue. Two hours of very stressful on-site debugging later, I discovered the object was actually disappearing from the scene after the scene loaded... but I have no code that's responsible for doing that.
I did manage to deploy an ugly short-term workaround that "fixed" the issue for the rest of MAGFest, by manually instantiating a new IdleTimeout in the score screen object's Start() method:
I don't yet have a real explanation for this, but my current suspicion is it's related to this Unity bug in which the new SceneManagement stuff introduced in 5.3 can yank stuff from a loaded scene that shouldn't be getting yanked. (FWIW, that bug is claimed fixed in upcoming version 5.4.)
Since I was running a 24-hour booth alone, there were many, many hours where I wasn't physically at the booth to coach players who might've had trouble, which meant the game had to be very good at teaching players to play it. Fortunately this is something we've been refining for about a dozen public exhibitions now.
Because of the idle timeout, 99% of players started playing from the main shell. That meant they were taken through this screen on their way to gameplay:
Most players paid attention to this screen, but even though the game is very simple, they still didn't retain all this information. We reminded them to adjust their sensitivity first thing once they got into the first stage:
This on-the-fly sensitivity adjustment has been a really popular feature, and because the prompt appears at just the moment when players will be thinking about it – the first time they move the mouse and discover it fe