January Planuary: 2017 Reflections, 2018 Plans

Hello, world.

I recently spent time looking back on 2017 and discovered my greatest failures in that year were:

1. Spending too much time reflecting and not enough planning (oh the irony) and

2. Lacking regularity in my work and schedules

This post is meant to rectify both of these issues.

First, I’ll be posting a blog every month. That isn’t a lot, but having that minimum requirement allows me the extra satisfaction when I do more. This once-a-month post will be a plan for the future month and a brief reflection on whether the past month went as I had planned, in the reverse order.

Since January is the first month of the year, I’m going to spend a little time looking forward to the next twelve months, and not just this one. I want to spend as little time as possible reflecting on 2017, but with the scope of these posts being one month and this particular one looking through the entire year, it makes sense to look back on the year past, if only for a moment.

Twenty Seventeen

The year started with my announcement that I’d be participating in 1GAM (one game a month). That didn’t happen.

However, I did make four game jam prototypes this year (LD39, LD40, XKCD Jam, Minimalistic Jam 2), and made music for several soundtracks in Ludum Dare 38. I also had my first professional interview, which was a great experience.

My focus this year was on music. I earned three separate paid jobs, making me a audio professional for the first time. One of these fell apart, another wasn’t a game, but the third is ongoing and is looking very promising. Independently, I created a 21-track Super NES style soundtrack (Shuriken OST) and launched my dance project Seciden with five singles and a ten-track double EP. Overall, it was a very productive year for my music.

However, that isn’t to say it was a successful year for my music. I did basically zero promotion other than shouting into the void on Twitter for these things, and that was a major mistake.

To survive, I’ve been writing stuff about programming for Shmoop. It’s been a bit entertaining, although I really don’t like Scratch. I wrote computer science for sixth, seventh, and eighth grade, and started working on a new course covering PyGame, which should be fun.

After almost two and a half years on this writing job, I’ve seen a rapid improvement in my writing, from regular practice and helpful feedback from my editor. This, of course, is another distraction I dealt with during the year: The desire to move toward creative writing. With several music projects and game development taking precedence, I didn’t have the time to write. This didn’t stop me from doing a lot of NaNoWriMo preparation in October, but choosing not to do it when November rolled around, for the first year since 2006, was a good idea.

I made several new friends in the latter half of the year as I realized the importance of reaching out and connecting with people. Dragon Slumber, ComputerFiguur, and GoPublix PR have been a huge inspiration to me, with each one providing their own unique perspective on the games industry and invaluable advice for someone just starting out.

I haven’t thought of myself as “just starting out” for years, since I’ve been to two GDC events, helped found a games company, and have been programming games and game-related tools since I was a teenager, but none of this has had focus, purpose, marketability, or a real commercial drive. This arrogance has held me back more than anything.

Along with this arrogance, I’ve spent far too much time in my own head and not interacting with others. The experience of getting involved with other developers during Ludum Dare 38 and streaming game feedback for Ludum Dares 39 and 40 helped me understand how much awesomeness there is out there in the world of game development. Exploring Twitch and interacting with other streamers was a similar experience, and I made new friends along the way.

Conversations with these friends and others on various game-dev Discord servers opened my eyes to how little I’ve done, and how far there is for me to go. On a more positive note, they’ve given me the drive and determination necessary to begin that climb.

Twenty Eighteen

Here are the things I want to accomplish this year, at a minimum:

1. One commercial song release per week (52 by the end of the year)

On the first point, I have an 12-song album about 50% done for Seciden. The trance song Nights on C# is finished–all I need for that is cover art and to post it for release. So, there’s only 40 more tracks to worry about. The main difficulty is staggering the release schedule, since DistroKid suggests posting music four weeks before the scheduled release to guarantee it’s in the stores on time. Due to this, these regular releases will probably start in mid-February.

However, I can put things up on Bandcamp whenever they’re ready. My Patreon supporters will have early access to this music for free. I’ll talk more about that below.

2. One commercial game release (whether Steam or mobile)

No idea what this is going to be. Could be Frozen Lava (with a much better name), could be one of my old projects resurrected, could be based on one of my super old text adventures, or could be something totally new. I’d like to get started on this in February and aim for a June/July release window. That means I don’t have an awful lot of time left to think about it.

3. SSL certificates on my website(s) because it’s the modern thing to do

This is a pain in the neck that “just works” once it’s all set up on the server. The financial cost is trivial, but the time cost could be significant. Also, I really hate webdev stuff.

4. One blog post per month with reflection and plan, as explored above

This is the first one. Looking good so far.

5. Better Patreon campaign

I’ve already recorded a draft of the video for my Patreon page. Now I need to spruce up the text, rework the rewards, then finalize and post the video.

The basic gist will be access to game builds as the game is being developed (whatever I end up making) and early access to music. There will be two branching tiers for those who just want one or the other, and an altogether tier for those who want both. And, of course, some extra incentives for higher values.

I’m a bit torn about the pricing for these tiers. On the one hand, I’m just starting out, so much lower values are reasonable. On the other hand, if I start them super low and raise them later, I could upset a lot of people. There won’t be much more for me to give than these already-planned tiers, so I can’t exactly keep giving more for higher tiers.

It’s another thing I need to figure out.

6. Consolidate

Right now, I have myself spread all over the place:

  • Joshua McLean website, Twitch, Twitter, Bandcamp, itch.io, Soundcloud, YouTube
  • Seciden website, Twitter, Bandcamp, Soundcloud, YouTube

This is a difficult problem. On the one hand, I want to help people access all of my content without visiting a ton of different websites. On the other hand, there’s a distinct difference between the Joshua McLean bandcamp/soundcloud (game music) and the Seciden bandcamp/soundcloud (dance music). At the very least, I should think long and hard about this problem.

7. More streams, more gaming, and a more consistent schedule

I’m already making progress on this point. My daily schedule has been rather consistent:

  • Alarm at 6:48am, up by 7am for morning activities and breakfast
  • Work by 9am (would like to push back to 8am before the end of the year)
  • Stream starts at 11am (except on Wednesday, where I keep working)
  • Lunch at 2pm (two-hour lunch because 3pm is a major slump time)
    • Except Wednesdays, where I game at 3pm.
  • Back to work at 4pm (except Wednesday)

Night time is a bit of an inconsistent mess, with events changing daily. One of my plans is to fix this with a night stream. I’d like to work up to three nights a week, but I’ll start with one or two.

This allots me regular gaming time, which is important for several reasons. First, it refreshes my mind to relax and play some games at night. Second, I can start going through my game library. And third, there’s always something to learn about game dev from playing a game, even if I’ve previously completed it.

In Summary

Overall, 2017 was a very productive, educational year. It’s hard to cover all of the personal, professional, emotional, and psychological growth I experienced in 2017 without writing a book on it, and that, of course, would be excessive, given my new intention of looking forward more than backward.

Despite my own growth, 2017 was not particularly fruitful in any concrete way. I hope to take what I’ve learned and experienced from this year and turn it into something tangible in 2018. Ever forward we go.

Ludum Dare 34 Postmortem: Tech Rider

I made a game in three days for the 34th iteration of a popular game jam called Ludum Dare. My entry is a two-button futuristic racing game called Tech Rider. Well, I say racing–really it’s a time attack game.

You can play the game here.

My involvement in this game jam kind of came out of nowhere. Less than a week to the event, I realized two things:

  1. It was happening next weekend.
  2. Nothing was stopping me from entering.

With these things in mind, I decided to enter. It was a bit late to find anyone to work with, so I decided to enter solo. Because of this, I was on the fence about whether to enter the Compo (48 hours) or Jam (72 hours). In the end I went with the latter, but I was sure to follow the rules so I could make that decision near the end of the Compo.

Fly Killer

(the game, not the racer – a brief prejam postmortem)

On the Thursday before the event began–23 hours to its start–I decided it would be a good idea to do a warmup game. So I set myself a time limit of three hours, spent about 15 hours doing preliminary setup stuff, and made Fly Killer.

flykiller.png

This turned out to be a very good idea, because it helped me work on the kinks in my workflow. I rediscovered quirks in Unity (except the new scene management, but that’ll come up later), relearned a bit of what works with git, and revisited the flow from Aseprite to Tiled to Tiled2Unity to Unity.

I managed to hit my playable target within the three allotted hours, which was a huge boost to morale right before the jam. During development, I switched from a more traditional design of “move swatter over fly and click to swat” to the simpler “move swatter into fly to swat.” Personally, I found the latter more engaging–and it was easier to implement without bugs.

That out of the way, it was on to the main event!

Three Days to Tech Rider

screenshot_title.png

What Went Wrong

Circuitous Route to Design

I spent a large part of the jam’s first 24 hours implementing a mechanic where pressing left and right together would cause your ship to charge, then pressing left or right after charged would cause your ship to “smash” in that direction. This was meant to be an attack mechanic.

Initially, the game was supposed to be a purely vertical racer with some turns thrown in. The focus was combat: destroy other racers as you catch up to them. This seemed a bit silly on further inspection, that each racer would either die by your hand or never be seen.

The charge and attack stayed throughout further development, even as I changed the strafe movement to turn movement and made the tracks less vertical. Late in the jam, some time on Monday, I realized that the strafe attack was still going left or right, even if your ship was facing a different direction. This meant keeping it in would allow you to continuously charge for a speed boost on horizontal tracks.

This might have been fine, but when I came to the extremely late decision to remove AI racers altogether, it seemed totally out of place. I liked the idea of a charge boost but I ran out of time to make it work in the new context of the game. So, like AI racers, I ended up disabling it altogether for the jam release.

This meant the controls were woefully simply–left or right, nothing special–but after removing AI racers, it didn’t make sense to keep the attack in. This is definitely an area I can flesh out on further releases, where AI racers are a top priority for additional features, since they already kind of work.

Late Game Flow

One thing I did right in my first Global Game Jam and the GBJam earlier this year was to start with the beginning and the ending of the game, then flesh out the middle. I’d heard this was a good idea from a lot of people I trust, both at GDC and in books.  Unfortunately, I forgot this piece of wisdom for LD34.

I stared with the middle: the racer moving up the track. I later added the countdown, then the finish. Finally, I made the racer select, title, and flow between races, in that order. This led to many problems, including the Crusher Bug which I wasn’t able to fix by deadline.

screenshot_crusher-bug

This basically halted the title screen camera from getting destroyed, resulting in all sorts of awkwardness including an immobile camera.

On top of doing this in the wrong order, I didn’t realize that Unity had deprecated the Application.LoadLevel() method. I could have used this method, but early on I’d made a pact with myself to do things right with the code, since doing otherwise had almost crippled my GBJam game.

Unfortunately, a Google search for “unity scenemanager” gives hits for an extension package, and not the official SceneManager documentation. Eventually, I was able to find the documentation, but it was kind of a headache learning the one little bit I needed to know to get it to work–that scene management is in its own namespace, Unity.SceneManagement.

Targeting Windows

Although it’s convenient to target Windows, this means the porting to other systems has to come later, and is often rife with issues of its own. I should have started with a web target in mind to reach the broadest possible audience, rather than saving this for after the jam. Next time around this should be an early priority.

Track Art

The art for tracks reflected the original vertical design, in which there are only left and right walls. That was until I discovered that Tiled (in its super awesome awesomeness) allows you to rotate tiles. So, for one, I didn’t need to manually add the flipped right side tile, and for another, I could easily make walls on the top or bottom.

track-tiles.png

That said, I didn’t have time to make curved, slanting, or corner wall tiles. I was also kind of lazy and baked the walls into the road tiles. Really, the walls should be separate so I can layer them on top of the roads as I see fit. I’ll probably do that in a future version.

Minimal Testing Time / No Controls for Testing

I had very little time at the end to test the completed product, which was a huge mistake. I still don’t know if unlocking the Tech Rider really works, and i wasn’t sure the kinks were worked out of the second or third tracks. I made the third track really late in development–started the assets Sunday night, finished the track Monday morning–so I only played through the whole thing once or twice.

I added the path nodes for tracks 2 and 3 in the last hour of the jam time, so these were rushed and really spaced apart. As a result, respawning in these tracks sometimes results in jumping half the course.

Screenshot 2015-12-15 20.19.10.png

As you can see from the image, there are a lot, but really not enough–especially on the upper part of the split in the middle.

I had no way to skip to a specific race quickly, which is another lesson: include controls to test the game. These are great, because they can later be refactored into cheat codes or unlockables.

What Went Right

Unity

What is there to say about this engine/editor that hasn’t been said before? Sure, it’s rough around the edges for huge, highfalutin AAA games, but for indies it’s a bloody godsend.

I’ve been trying to learn Unreal off and on for a while now, but it’s just so targeted toward huge games that it’s difficult to get into it as a solo developer. Unity is the complete opposite: I’ve always felt it was approachable. It’s easy to pick up new things, and all of it just works. And C# provides a whole slew of friendly stuff I can include.

One thing I hadn’t used before that was critical to getting the game done on time was PlayerPrefs. I came to the conclusion that the game needed some kind of “best times” tracking. Although I was still going to have AI racers at the time, this eventually became critical to making the game competitive at all, since this is the only way to judge your performance.

screenshot_best-times.png

(You can see here that I should have made the track a little bit wider to hide the clear color on the left…)

PlayerPrefs is a wonderful class that automagically stores integer, floating-point, and/or Boolean data to the operating system for you. It’s trivial to retrieve this data. No messing about with files or OS-specific nonsense. Implementing a “best times” table was super quick because of this, as was implementing the unlockable Tech Rider ship.

Music & Sound

As early as possible, once I’d settled on a concept and developed a bit of functionality, I created as many sound effects as I could imagine. This was a great idea because hearing the sound effects over and over made me realize how grating and terrible they were. This left me plenty of time to rework the sound effects.

I made the music for the first track early, as well. Although I didn’t get around to fixing its issues, I was able to take useful notes on the music at different points in development which will help refine it. I didn’t get to the rest of the music until Sunday morning (around the 36 hour mark) so I didn’t have as many notes for those, and like I said earlier, I didn’t get to test the other two tracks nearly as much.

My early decision to have everything in the key of C or Cmin seems to have paid off. I don’t really know about this because I don’t have any feedback on the sound at the time of writing, but all of the sound effects (engine sound, crashing sound, countdown sound, etc.) are on the note of C, and all of the music starts with a C chord. In the case of the last track, it’s C minor. I’m still up in the air whether this was good, or it should have been A minor.

I’m also proud of the decision to create the ship select / high score theme first, then remix it for the title theme. The title animation isn’t nearly long enough for you to appreciate the full track, unfortunately, but you can have a listen here if you wish.

[soundcloud url=”https://api.soundcloud.com/tracks/237618978″ params=”auto_play=false&hide_related=false&show_comments=true&show_user=true&show_reposts=false&visual=true” width=”100%” height=”150″ iframe=”true” /]

Simplified Stats

Past the 36 hour mark, I put together a spreadsheet and saw how ridiculous my formulas for ship movement had become. I stripped this down to three stats: max speed, acceleration, and weight. This was still too complex for my tastes, as I kept balancing things up and down, back and forth, so I dropped the weight factor altogether.

Time Warper has better acceleration, Sky Crusher has better max speed, and Fly Killer is between them. Since Tech Rider is unlockable, it’s a bit higher in both stats. This gave me a direction to go not only with the stats, but with the machine design: Sky Crusher would look rounder and heavier, while Time Warper would be sharper and more streamlined.

screenshot_select.png

This made a whole lot more sense with all the numbers. Even though some miscalculations and/or typos set the hidden values a bit wrong, it helped refine the design to something workable.

Conclusion

All right, so I basically made a bastardized version of F-Zero with Super NES Micro Machines graphics. But it sure was fun–and educational. I’m still working on the Mac OSX port, and considering a future Web port. I could do Android but that might be a while down the road.

I plan to enter the Compo for Ludum Dare 35, and these are the things I need to take away from the LD34 experience to make that one shine:

  1. Create sound, music, and graphics early so you can see the flaws in-game.
  2. Make the beginning and end first, then flesh out the middle.
  3. Ensure game flows from beginning to end periodically during development.
  4. Target web first.
  5. Use tile rotation in Tiled as much as possible.
  6. Separate logical tile layers (like walls) for ease of reuse.
  7. Test the whole thing as early as possible. Leave at least 3-4 hours for full game testing and fixes. Include “cheat” commands to make testing easier.

Check out Tech Rider here, and let me know what you think in the comments. I’d also love to hear your Ludum Dare experience or about any other LD34 games I should play.