Friday, January 27, 2017

Fermata (or Don't Breathe) and Global Game Jam 2017

I attended my first Global Game Jam in 2012, when I was a fellow at the Virginia B. Ball Center for Creative Inquiry. I took six seminar students with me to the site in Columbus, OH, and three of us worked together to make Auralboros. I went again in 2013, although it feels like it wasn't that long ago! I took some students with me to the Art Institute of Indianapolis site, and a friend and I created Wikibeat. (Turns out the links to play the game don't work anymore since DropBox stopped providing Web hosting.) Ever since these experiences, I have encouraged students to participate in Global Game Jam, with a few from my game design and development courses occasionally taking me up on it—and never regretting it. Last year, I wondered if hosting a local site would help more of my students be able to participate, but I had misunderstood some of the logistics and missed the site registration deadline. This year, however, all the pieces came together, and we hosted Ball State University's first Global Game Jam site.



The site registration was straightforward, and part of the site approval process required a telephone conference with a regional coordinator. This was extremely helpful, and our conversation helped me avoid many potential problems with logistics. I was invited to a Slack instance for GGJ site organizers, although I found it to have a very poor signal-to-noise ratio. Fortunately, the organizing committee had set up an #announcements channel that only they could write to, and it was really sufficient for me to just follow that one.

My department was very supportive in this endeavor, allowing me to use up to three rooms in our third floor hallway area, although we only ended up needing two. They also provided printer access and a generous snacks budget. We celebrated the opening and the closing with pizza, and we had a variety of healthy and sustaining snacks available during the day. Thanks to my wife for doing the grocery store runs and bringing the edibles. It was interesting to me that the participants, who were mostly all undergraduate students, devoured the individually packaged foods such as granola bars but were much more hesitant to eat from containers, such as raisins, trail mix, and baby-cut carrots.

But I get ahead of myself! I advertised the event through my department's Facebook group, some posters hung around my building, a campus-wide announcement, and targeted emails to some colleagues across campus. We ended up with 27 people registered, of whom 18 showed up. In my conversation with the regional coordinator, she had mentioned putting in a small entrance fee in order to dissuade no-shows—and offset the cost of swag such as site-themed shirts—but I decided to keep it as open as possible. I am really happy with the turnout, given that it was not heavily marketed and not a well-known event outside of jamming circles.

Inspiration
We watched the keynote right at 5PM as planned; if you're interested, you can watch it at https://www.youtube.com/watch?v=ynljZUmJv2U. The theme was waves, which was cleverly shown to have many interpretations. I had previously seen the list of diversifiers, and once I heard the theme, I started imagining some ways to combine them together. I told the jammers that my plan was to hands-off, to let them go to the whiteboards and organically form teams around game ideas. However, this was also the point where I realized I didn't really have a dinner plan, and so I ordered some pizza. That took an embarrassingly long amount of time, in part because I was trying to use some coupon codes that had only just arrived in the mail that day. At least, I think that was the problem, I'm still not entirely sure. In any case, when I finally return to the main jamming space, it was clear that people had already gelled together and made teams around inspirational ideas. A lot of folks grouped up based on who they came with, which is expected of course. This left me in kind of an awkward position though: I don't think they recognized that I too was planning on being a participant, not just an organizer. I was also 20 years older than them and, in some cases, currently their professor, which I think was a bit awkward. This was when I went back to the list of diversifiers, and my eyes landed on this one: Virtuoso: A physical musical instrument is used as an input device. That sounds like an interesting challenge, and certainly fits with the "wave" theme. I sent out a message to my friend Alex, a local alumnus who has a passion for audio production who had expressed passing interest in GGJ in previous conversations. It piqued his interest, so even though he was only available Friday and Sunday, he decided to join in. His friend Darby joined as well, and with that, I had a team and a game idea!

Hard at work
I had hoped to build something in Unreal Engine, given the time I spent working with it last semester. However, I still haven't cracked the nut of UE's C++ bindings, and it was clear that this would be the only way to get at the audio data I wanted, so I had to mark this off the list. Poking around the Web for pitch detection algorithms and libraries, I came across TarsosDSP, an open-source Java library that seemed to do exactly what I wanted. The API demos confirmed that it could read from my laptop's microphone and compute the pitch being heard. TarsosDSP is written in pure Java without native libraries, and so it seemed like this could integrate quite well with PlayN, a library I have used and written about frequently. We decided to use the native desktop target via an executable jar build. We pretty quickly got TarsosDSP integrated with a PlayN project and had a playable demo that allowed you to move a black box up and down by singing or whistling at your computer. Neat!

First playable demo
We called it a night shortly after this, and I returned home to find one of my sons a bit under the weather, so I joined for the ending of a TV show before turning in. The next morning, I did a little tweaking of the project, adding in niceties such as the TriplePlay library and its screen management system. I returned to the lab a little before the 9AM planned meeting time to find three jammers sound asleep, which made it hard to politely test a game all about making noise.

Saturday Morning
Alex couldn't stay long, but Darby and I worked until suppertime on the game. Early on, we had the idea that you could play as long as you could make a sound—run out of breath and the game is over. We added obstacles with the idea that some would help and some would hurt, and we started with the beneficial ones: hitting these would give you a chance to take a breath. We observed that this was like a rest in music notation, and this inspired the notion that the playable character would be a fermata. With our theme coming together, we realized the "bad" obstacles could be repeat bars, a sign that you can go on no further and must start again. We had these in place, with appropriate art and background image, with plenty of time for me to come home to a nice meal with my family and a good night's sleep. We had come up with two potential names for the game: "Fermata" or "Don't Breathe". I ended up just mashing them together, and our game was christened, "Fermata, or, Don't Breathe".

Checking out the Vive
There were a few other noteworthy occurrences on Saturday. One of the jammers brought in his Vive VR setup and spent most of the day letting people check it out. I suspect many new customers were made that day! I got to try it myself, and it was eerie, how quickly you become somewhere else. Walking out onto the edge of a cliff and looking down reminded me of looking out the floor windows in the CN Tower: you know you can just step out and not fall, but by gum, it's hard to take that step. Also, a team from Byte—Ball State's student-run media outlet about games and "nerd" culture—came to see what we were up to. They did some interviews and shot some B-roll, and I think they enjoyed seeing what we were all up to.

The team from Byte
Sunday afternoon we met up at 1PM to put on the finishing touches, which included adding starting bars at the beginning of the game, to parallel the end bars. The rest of my team had to leave before the 5PM pizza party and showcase, but the game was really as good as it was going to get; I went through the upload process and we were all set, which let me get back to site management. I had a chance to play most of the other teams' games. Each had faced its own problems, from version control to scope creep to engine confusion, but they all produced playable games. I'm pretty sure this was the first jam of any kind for all of them, and everybody had a great time.

My team and our whiteboard
You can find all the games from our site at http://globalgamejam.org/2017/jam-sites/global-game-jam-ball-state-university/games. My team's entry has an offical GGJ page, but since we used GitHub to host our code, it was straightforward to set up a simple site with the latest executable jar.
This video gives a gameplay overview:


I enjoyed my GGJ17 experience, and I'm quite grateful that Alex and Darby came on short notice to share the weekend with me. A lot of jammers were already talking about coming back next year. It was not an unreasonable amount of work to host the site. Although the biggest commitment is the weekend itself, there was still a lot of communication and planning that went into it. I had hoped to find some like-minded folks on campus who would help shoulder the load, but it ended up being all my responsibility. I am leaning toward hosting again in 2018, which will be the tenth anniversary, but I'm not committed to it yet. I'll make that call next Fall when I can assess other responsibilities. In the meantime, thanks for reading, and thanks to all the GGJ organizers, sponsors and participants!


Thursday, January 19, 2017

Painting Runebound: Caught in a Web

Here's a nice short painting post for a change. Right around Christmas, I picked up the Caught in a Web expansion for Runebound 3e, which as my previous post shows, is a game I play rather frequently. I'm still in the middle of a big Descent painting project, but I put some of those guys on hold so I could work on Jonas the Kind.


The armor was painted with Vallejo Air Steel and hit with two coats of P3 Armor Wash. I've been catching up on Sorastro's painting videos, and he tends to further highlight metallics by mixing them with whites and ivories. The Vallejo Air is fantastically smooth to brush on, but it doesn't mix with other paints for beans. I ended up leaving it as-is, since the steel is already very bright and the wash had done a fine job of adding shadows.

For the gold, I thought I'd give my Vallejo Air Gold another shot, after having mixed results when I painted the base set heroes. I don't know exactly what happened to it, but the whole bottle was basically just thin blue ... medium? There was some gold material stuck to the inside top of the bottle, but all that came out was this useless fluid. I tossed it, and I'm thinking about trying to find some Game Color Glorious Gold, which is clearly Dr. Faust's preferred one, since he uses it all the time.

In the game art, Jonas has flowing golden locks, truly almost comical. I mean, look at this Fabio hair:

My approach gave him a more muted, brown hue with highlights. It's still pretty glamorous, without becoming orange.

Final note: I tried something different with the photograph here. My Nexus5X camera has a hard time finding the temperature I want on the photo since I'm shooting on a white background, so I tried setting it to fluorescent rather than auto. Also, I used Snapseed's auto-white-balance feature instead of picking a white point manually. The background ends up looking grey up against the pure white of this blog background, but the colors of the miniature look true, though muted. Maybe I'll try another setting later, but for now, it's kind of a one-off, the only miniature in this expansion.

By this point, the text-per-miniature is probably too high for one post, so that's all for now. I have some shadow dragons to varnish.