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.
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 of DownBeats 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 feels too fast or too slow for their tastes – they're able to apply the new information immediately, and thus retain it indefinitely.
Typical players proceed from here to play with movement and their primary (left mouse button) weapon, ignoring the secondary weapon entirely. The first stage is actually designed around that: all the primary weapons are gun-type weapons and all the enemies in the first stage approach from the right, so players can hang back to the left and shoot everything and it's very simple and rewarding.
A little ways into the level they'll inevitably fill their ability meter, which shows a new prompt:
Players typically press both mouse buttons immediately here, because that's what they're told to do. They're rewarded with a huge, satisfying rocket explosion and a crap-ton of score items. After that, they tend to remember how this mechanic works. ;)
It's worth noting that we do show this prompt every time your special ability becomes ready. That reminded players about the mechanic, but after they did it the first time they tended to not fire their ability immediately when prompted; they'd instead wait for a more opportune time to use it, which is exactly what we want.
At the beginning of the second stage we present a new kind of challenge in conjunction with a new prompt:
Stage 2 is the first time enemies attack from behind (the red arrows indicate enemies approaching from offscreen). In past builds we didn't have a prompt here, and players would respond with a panicked "how do I turn around?!" In this moment they're thinking about to solve the new problem of enemies approaching from behind; popping up the secondary weapon prompt gives them their answer, and because the mouse icon animates from side-to-side in this prompt it also demonstrates how to use it.
Players tended to respond by clicking RMB and dragging through the approaching enemies, which is the correct use of the star dash and rewarded them with kills and points. Players who never touched RMB up to this point tended to use it frequently and effectively from here on out, which was a huge design win since we've really struggled to teach that mechanic effectively for over a year now.
At this point players had been introduced to – and successfully utilized – all the core mechanics in the game. While they weren't necessarily skilled yet, they were definitely competent and engaged, as we're about to see in our analytics.
We've been using Unity Analytics (beta) for a little while now, but it's not well-suited for on-site exhibits which lack Internet access, and because it's in beta it has a fairly severe "events per client per hour" limit which we're constantly running up against, so for MAGFest I coded up a quick local solution that uses the same event structure:
...but just dumps the events out to local .csv files instead of submitting them to a server. (We'll obviously have a more robust solution in place for our launch in April.)
We gathered gameplay data for 488 sessions over 74 hours. Here's how the sessions broke down by hours of the day:
Hour 0 is midnight, and each slice aggregates the number of sessions during that hour each day from from 12pm Thursday to 2pm Sunday. It's interesting to note that 43% of our sessions took place between the hours of 8pm to 10am the following morning, which are roughly the hours you'd expect other conventions to be shut down for. In other words, running 24 hours nearly doubled our session count!
We had 20 full clears (i.e. players who finished all five stages). The breakdown of how far each player got falls off exponentially, but that's not that unexpected: every game I've worked on has had a falloff curve similar to this at retail, and I expect it's further exacerbated in a convention setting where plenty of players are bailing after the first stage not because they want to stop playing, but because they don't want to be "that guy" who hogs the machine and prevents others from trying the game.
We also gathered comprehensive data on how many times players were hit by each individual enemy pattern in the game. Unsurprisingly, the five stage bosses make up the top five slots. Beyond that, the distribution is actually surprisingly consistent, which indicates we only have a very small number of "outlier" patterns that are uncomfortably difficult.
And finally, a few random fun stats:
- The best full-clear score was 6,668,925 (using continues).
- The best single-credit score (no continues) was 21,903,462. That player reached stage 4 (out of 5) without dying.
- One dedicated individual took 84 hits and died 16 times in the final stage, but still persevered (through 16 continues!) to complete the game. Anonymous dedicated player: we salute you! o7
What went right
We got 488 plays, gave out 200 business cards, and collected 110 new email subscribers. Those numbers are ridiculous compared to our past shows (granted, we've never done PAX). In that regard, showing at MAGFest was a phenomenal success.
I also feel like it was the perfectly-targeted audience for this game. Everyone was there to play games, and I mean "games" in the traditional sense: nobody was expecting art games, experimental games, or anything like that. (By contrast, when I went to Indiecade last year and talked to people about Legacy of the Elder Star all I got were blank stares, presumably because the game is very mainstream/commercial and not artsy/experimental at all.)
The booth design worked out very well. It visually stood out from the crowd (even though it was kinda set back in a corner) and it was pretty easy to transport, set up, and tear down.
The stuff I did with the build – auto-start, attract loop, idle timeout, and analytics – all went off pretty much without a hitch (aside from Thursday night's on-site bug-fix). It made it a ton easier to demo and, together with the also-successful equipment security setup, alleviated 100% of my stress about leaving the booth unattended, whether for bathroom breaks, lunch, or to go to sleep for the night.
Being able to leave the booth safely unattended also meant I was able to hit up a couple of the Saturday night concerts, which were amazing. I saw the Mega Man X sound team perform live (!) and spent 3+ hours in a massive chiptune rave. These were big highlights of MAGFest for me and I'm really glad I didn't have to miss them due to having a "needy" booth.
Another reason that was possible is that MAGFest takes place at a hotel – the Gaylord National Resort and Convention Center – which is incredibly convenient when you can go between the exhibit floor, the music stages, and your hotel room without even leaving the building. It's also just a really, really nice place:
What went wrong
The bug I had to fix on-site on Thursday night, where the game wouldn't idle-out from the post-game score screen, was just an absurd testing flub. I have no idea how I missed it; I'm sure I comprehensively tested idle-out in every conceivable scenario before getting on the plane, but APPARENTLY NOT. >:|
I also experienced a very-occasional soft-lock during the outro cutscene which required a reboot to recover from. We only had 20 full clears and I personally witnessed several occasions where the outro cutscene and credits played through without issue, so we probably only hit this bug less than dozen times. I still don't know why it's happening and I haven't been able to reproduce it on a dev machine, but I do suspect it's related to Unity's scene-mangling bug I mentioned before, so hopefully it'll be addressed with the 5.4 release.
And finally: while it's awesome that MAGFest takes place in a really nice hotel, the downside is that all the food is so expensive. My wallet is just a pile of ashes at this point. If I do MAGFest again it will actually be more economical to pay for an extra night's stay at the hotel in order to arrive a day early and just go grocery shopping, and avoid the ridiculously overpriced restaurants and coffee bars.
Was it worth it?
Here's my final cost breakdown:
- Hotel room and food: $1,010
- Flights and baggage fees: $658
- Luggage and transport supplies: $405
- Booth decoration and supplies: $396
- Artwork and promo materials: $140
- TOTAL: $2,609
There are several ways I could've done this cheaper, or can do it cheaper on future trips:
- I had the hotel room to myself. Nice, but expensive. Sharing would be much more cost-effective.
- I own the luggage now, so that whole category is zeroed out for the future.
- All the booth decoration stuff (frame, backdrop, rugs, etc.) can be used for future games, so that'll be zeroed out for the future as well. Only the artwork needs to be unique.
...so if I do MAGFest again next year I'll bet I could cut this cost in half, or even a little bit better.
Legacy of the Elder Star is on Steam now but we're still pre-release, which means this show was never going to generate direct sales. Can you put a price on 488 play sessions, 200 business cards, and 110 new email subscribers? What about the fact that this show – being far away from home and lacking pipe-and-drape – forced me to solve logistics problems for booth construction that I'll now benefit from for every future show? Or the personal "vacation" factor of hanging out with a bunch of nerds in a party hotel for four days, playing vintage arcade games and enjoying kick-ass live music?
I'd have liked to have spent less of course, but overall I think it was worth the trip, both for me personally and for the game.
...no, wait. That's criminally understating it.