Movie Game Jam: The Making Of

Published on March 12, 2018

How We Made The Game

One month ago, we released our entry for Movie Game Jam, a quirky simulation game named OH! Is This Baseball?? Since release our little game has seen quite a bit of success. The game ranked extremely well for the jam, earning the following honors from over 100 games:

  • Audio: Rank 8
  • Fun: Rank 9
  • Gameplay Innovation: Rank 13
  • Movie Interpretation: Rank 5
  • Visuals: Rank 20
  • Overall: Rank 10

Achieving a spot in the top 10 is a huge honor for us, and we’d like to thank all of you who voted for our game! As a sign of our appreciation, we’d like to discuss how this strange game came to be. Sit tight, it’s going to be a long one!

Also, for the folks who may not have seen this game before and are curious what it actually looks like: no, we didn’t have semi-realistic naked men at a round table. The game looks as below:

Baseball Strip

 

The Original Idea

Old Baseball Game

A while back, we looked into making a strange baseball game with very simple pixel graphics, comparable in part to the NES Baseball title from 1983. We wanted to make a game that started off fairly normal and ended up absurd. Imagine a game where you begin by selecting players based off their stats, then ended it by fighting off demons in the ballpark. Though less extreme, strange occurrences and freak accidents happen all the time in baseball, so our game wished to simplify amplify that experience. As an example, in 2001 Hall of Famer Randy Johnson threw a pitch and somehow managed to hit—and kill—a dove.

Poor Bird...
Poor thing stood no chance…

As time went on, however, we weren’t very committed to the idea. Eventually, we stopped working on it entirely.

 

Movie Game Jam

Then we saw that a game jam called Movie Game Jam was about to begin. Movie Game Jam tasked developers to create a game inspired by a scene in a movie. We wanted to revisit our strange baseball idea, so we decided to use Moneyball as our base inspiration. The gameplay concept was simple: draft players, stay within budget. As the game progressed, our plan was to go from easy situations (find a first baseman) to something more absurd. Initially the game was only going to focus on the niche sabremetrics of baseball, but we opted to go with choices like baristas and tech bros because we felt it would be easier for someone to understand when contrasted with, say, looking for TOOTBLAN or FARTSLAM. Those are “real” stats, by the way.

Terminal Stats

We started with a means of generating random baseball player names. We aggregated publicly available database listings for male given names as well as family names, and decided to just randomly mash them together. We knew we would use Unity for the final game, so when we wrote the terminal-based application to generate these names and stats, we did so in C#. This allowed us to later on copy and paste the code without worrying about compatibility. Later on, for weirder scenarios, we also added a database listing for female given names, alien names, and even video game protagonist names. As for randomizing the stats themselves, every player has every stat—even the weird ones. You just don’t see all options at first.

 

Voice Acting

The game features voice acting. Stephen George, content creator and morning person, played the role of the General Manager, Chilly Cheane. Kira Buckland, famous for her voice work in NieR: Automata as well as Fire Emblem, voiced the narrator. We actually have been in contact with both for a long time, so it was only a matter of time until they showed up in one of our games! Conversations with Kira started about a year ago, and conversations with Stephen began probably over a decade ago. That last one might surprise some, but Stephen’s a good friend of ours—as the lead of 3 Halves Games I have appeared on his vlog before. I’ll leave fans to figure out which one!

Unfortunately, thanks to the restrictions of the jam, only four people maximum were allowed in a team, not including pre-built assets. Let’s break that down:

  • Contributors to Unique Assets
    • Muhammad Abdul-Rahim, lead developer
    • Renée “laughingbear” P., UI art
    • Stephen Georg, voice actor
    • Kira Buckland, voice actress
  • Contributors to Previously Built, Available Assets
    • John Leonard French, music and sound
    • Kai Clavier, text engine
    • Morph3D, models

As you can see, we had no room to fit another person to do voice work. That left off with two options for who would play the protagonist: either Stephen or Kira would record more lines, or I would. Turns out I gave it a shot. This was a mistake. I did not have a good microphone, and I had an even worse recording setup. It was evident in the final product of the game. I apologize for this. If it were not a game jam, I would not have allowed this to happen in a 3 Halves Games title. Thank you for putting up with it.

 

Visuals

No Shader

Let’s talk about graphics. The assets we used for the 3D models were provided by Morph3D. They look like they do up above. Pretty great, right? We totally should release an adult version of this game, right? Hahahaha… Morph3D is great because with one single human model you can modify their morphs, thus allowing you to get all sorts of body types, face types, and the like. This was ideal for us since it allowed us to very quickly create a great number of people. In fact, we built all the people in only an hour. Our main problem, of course, was making them look like they visually belonged. In keeping with the simple graphics idea we liked from our scrapped game, we decided to write our own shader to color them flat. The body would be one color, no shading, and the hair would be another, also without shading. This shader is easy. Here it is in its entirety. You’re free to use it yourself!

Shader "Custom/SolidColor" {
        Properties {
                _Color ("Color", Color) = (1,1,1,1)
        }
        SubShader {
                Tags { "RenderType"="Opaque" }

                Pass
                {
                        CGPROGRAM
                        #pragma vertex vert
                        #pragma fragment frag
                        #include "UnityCG.cginc"

                        fixed4 _Color;

                        struct appdata
                        {
                                float4 vertex : POSITION;
                                float4 color : COLOR;
                                float2 uv : TEXCOORD0;
                        };

                        struct v2f
                        {
                                float4 color : COLOR;
                                float4 position : POSITION;
                                float2 uv : TEXCOORD0;
                        };

                        v2f vert(appdata v)
                        {
                                v2f o;
                                o.color = v.color;
                                o.position = UnityObjectToClipPos(v.vertex);
                                o.uv = v.uv;
                                return o;
                        }

                        fixed4 frag(v2f i) : COLOR
                        {
                                return _Color;
                        }

                        ENDCG
                }
        }
}

The idea is simple: Make a material and select a color you want. That color will be applied to every vertex of the object’s mesh. That’s all there is to it, folks! Here’s the end result:

Movie Jam Scouts

Yeah, that’s a lot better. Not only did we leverage this custom shader, we ensured that the 3D models of the people would be loaded at the lowest provided level of detail. This has performance ramifications in that a low level of detail means less vertices, less triangles, and faster computation, but we more cared for the visual effect. We wanted blocky graphics!

 

Putting It All Together

145 Wins

So with that, we have a game. All that’s left was to put it all together. One of the fun things people enjoyed was seeing their score at the end of the game: how many wins they had and how many losses they had. Believe it or not, that score was added within the final hours, right before the jam ended. Originally, the credits screen would simply say which of the four endings you got. Internally, we kept a score of how well you were doing in order to determine the ending to deliver. We came up with a quick algorithm to convert this metric into your final score, because what is baseball if not algorithmic magic? As an aside, the score you see above (145 wins) is the best we’ve seen anybody get so far. It’s even better than what we managed to get when we played the game ourselves!

That’s about everything we wanted to say! Thank you for playing our silly game, and Let’s Go Smokeland!