{"id":141,"date":"2019-10-08T08:00:36","date_gmt":"2019-10-08T12:00:36","guid":{"rendered":"http:\/\/mattrobertson.ca\/blog\/?p=141"},"modified":"2020-10-19T22:14:25","modified_gmt":"2020-10-20T02:14:25","slug":"a-post-jam-writeup-about-frogbert","status":"publish","type":"post","link":"https:\/\/mattrobertson.ca\/blog\/2019\/10\/08\/a-post-jam-writeup-about-frogbert\/","title":{"rendered":"A Post-Jam Writeup About Frogbert"},"content":{"rendered":"\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/img.itch.zone\/aW1nLzI1NTk3MTAucG5n\/original\/RF%2BTZb.png\" alt=\"\"\/><figcaption>Our adorable little guy, Frogbert<br><\/figcaption><\/figure>\n\n\n\n<p>This past weekend I participated in what was not only my first <a href=\"https:\/\/ldjam.com\/events\/ludum-dare\/rules\">Ludum Dare<\/a>, but my first game jam ever. By the end of those whirlwind <dfn class=\"dictionary-of-numbers dictionary-of-numbers-quantity-259200s dictionary-of-numbers-processed\">72 hours<\/dfn> working with my artist teammates, I publicly released my first game (outside some toy projects almost 7 years ago), had my first experience building a project with Unity, and learned a heck of a lot in the process.<\/p>\n\n\n\n<p>Before we dig too deep into my experience in the jam, you can find our itch.io page <a href=\"https:\/\/trmrddr.itch.io\/frogbert\">here<\/a> and our LDjam page is <a href=\"https:\/\/ldjam.com\/events\/ludum-dare\/45\/frogbert-road-to-culinary-stardom\">here<\/a>.<\/p>\n\n\n\n<p class=\"has-medium-font-size\"><strong>The&nbsp;Team<\/strong><\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/mattrobertson.ca\/blog\/wp-content\/uploads\/2019\/10\/TheTeam-898x1024.png\" alt=\"\" class=\"wp-image-143\" width=\"397\" height=\"452\" srcset=\"https:\/\/mattrobertson.ca\/blog\/wp-content\/uploads\/2019\/10\/TheTeam-898x1024.png 898w, https:\/\/mattrobertson.ca\/blog\/wp-content\/uploads\/2019\/10\/TheTeam-263x300.png 263w, https:\/\/mattrobertson.ca\/blog\/wp-content\/uploads\/2019\/10\/TheTeam-768x876.png 768w\" sizes=\"auto, (max-width: 397px) 100vw, 397px\" \/><figcaption>Pictured: our amazing team, drawn by <a href=\"https:\/\/twitter.com\/giraffaloops\">Giraffalope<\/a><\/figcaption><\/figure><\/div>\n\n\n\n<p>The core team I worked with was myself doing development, my friend <a href=\"https:\/\/twitter.com\/trmrddr\">Trmrddr<\/a> creating 3D assets (and helping me out with Unity stuff throughout), and <a href=\"https:\/\/twitter.com\/giraffaloops\">Giraffalope<\/a> doing 2d asset creation and art direction.<\/p>\n\n\n\n<p>In addition to those core team members, we pulled in two ringers to make music for the game. My friend Progs threw together some synth chirps to use for sound effects, and <a href=\"https:\/\/twitter.com\/trmrddr\">Trmrddr<\/a>&#8216;s friend <a href=\"https:\/\/twitter.com\/oscastyle\">Oscar<\/a> put together two incredible little music loops for us.<\/p>\n\n\n\n<p class=\"has-medium-font-size\"><strong>Three\u00a0Heads\u00a0are\u00a0Better\u00a0Than\u00a0One<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-gallery columns-2 is-cropped wp-block-gallery-1 is-layout-flex wp-block-gallery-is-layout-flex\"><ul class=\"blocks-gallery-grid\"><li class=\"blocks-gallery-item\"><figure><img loading=\"lazy\" decoding=\"async\" width=\"761\" height=\"1024\" src=\"https:\/\/mattrobertson.ca\/blog\/wp-content\/uploads\/2019\/10\/Chef-761x1024.png\" alt=\"\" data-id=\"147\" class=\"wp-image-147\" srcset=\"https:\/\/mattrobertson.ca\/blog\/wp-content\/uploads\/2019\/10\/Chef-761x1024.png 761w, https:\/\/mattrobertson.ca\/blog\/wp-content\/uploads\/2019\/10\/Chef-223x300.png 223w, https:\/\/mattrobertson.ca\/blog\/wp-content\/uploads\/2019\/10\/Chef-768x1034.png 768w, https:\/\/mattrobertson.ca\/blog\/wp-content\/uploads\/2019\/10\/Chef.png 1444w\" sizes=\"auto, (max-width: 761px) 100vw, 761px\" \/><figcaption class=\"blocks-gallery-item__caption\"><a href=\"https:\/\/twitter.com\/giraffaloops\">Giraffalope&#8217;s<\/a> initial sketch that kicked off our culinary super-star&#8217;s journey<\/figcaption><\/figure><\/li><li class=\"blocks-gallery-item\"><figure><img loading=\"lazy\" decoding=\"async\" width=\"768\" height=\"1024\" src=\"https:\/\/mattrobertson.ca\/blog\/wp-content\/uploads\/2019\/10\/Shoot_up-768x1024.jpg\" alt=\"\" data-id=\"148\" data-link=\"https:\/\/mattrobertson.ca\/blog\/?attachment_id=148\" class=\"wp-image-148\" srcset=\"https:\/\/mattrobertson.ca\/blog\/wp-content\/uploads\/2019\/10\/Shoot_up-768x1024.jpg 768w, https:\/\/mattrobertson.ca\/blog\/wp-content\/uploads\/2019\/10\/Shoot_up-225x300.jpg 225w\" sizes=\"auto, (max-width: 768px) 100vw, 768px\" \/><figcaption class=\"blocks-gallery-item__caption\">A second sketch that we found so funny it became central to sending orders<\/figcaption><\/figure><\/li><\/ul><\/figure>\n\n\n\n<p>The problem I always have when trying to make games is that initial idea generation is nightmarish when you&#8217;re alone with no restrictions. Luckily, Ludum Dare provides a restriction in terms of a theme. Unluckily, the theme for this jam was the unhelpfully vague &#8220;Start With Nothing.&#8221;<\/p>\n\n\n\n<p>Getting an idea we were all interested in and felt comfortable with still took us a decent amount of time, but having other people to bounce ideas off of and other ideas to expand on made that a way quicker experience than if I had tried to do it on my own.<\/p>\n\n\n\n<p class=\"has-medium-font-size\"><strong>Learning&nbsp;Your&nbsp;Tools&nbsp;Beforehand&nbsp;is&nbsp;Probably&nbsp;Smart<\/strong><\/p>\n\n\n\n<p>Like I mentioned: I hadn&#8217;t used Unity for anything more than half-following a tutorial or two almost a year before starting this, and I hadn&#8217;t written in C# for even longer. Did I do any brushing up\/learning beforehand? Not really. Would it have saved me researching silly things all the time, and given me noticeably more time to implement features? Almost definitely.<\/p>\n\n\n\n<p>You want your 72 hours to be as effective as they can be: you&#8217;ll have your hands full with actually building things, you don&#8217;t want to be learning everything else at the same time.<\/p>\n\n\n\n<p class=\"has-medium-font-size\"><strong>Try&nbsp;and&nbsp;Keep&nbsp;Your&nbsp;Scope&nbsp;Tight.&nbsp;Then&nbsp;Cut&nbsp;it&nbsp;in&nbsp;Half<\/strong><\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/mattrobertson.ca\/blog\/wp-content\/uploads\/2019\/10\/concept-1024x972.png\" alt=\"\" class=\"wp-image-146\" width=\"462\" height=\"438\" srcset=\"https:\/\/mattrobertson.ca\/blog\/wp-content\/uploads\/2019\/10\/concept-1024x972.png 1024w, https:\/\/mattrobertson.ca\/blog\/wp-content\/uploads\/2019\/10\/concept-300x285.png 300w, https:\/\/mattrobertson.ca\/blog\/wp-content\/uploads\/2019\/10\/concept-768x729.png 768w\" sizes=\"auto, (max-width: 462px) 100vw, 462px\" \/><figcaption>One of <a href=\"https:\/\/twitter.com\/giraffaloops?lang=en\">Giraffalope&#8217;s <\/a>concept sketches. At least five systems shown here didn&#8217;t make the cut in time for submission<\/figcaption><\/figure><\/div>\n\n\n\n<p>If you&#8217;re anything like me, 72 hours simultaneously sounds like all the time in the world and no time at all. We thought we were keeping our scope pretty tight since we knew we only had one developer, and we still ended up leaving a decent amount of content on the cutting room floor.<\/p>\n\n\n\n<p>The amount of unused assets we had sitting around, and unimplemented ideas that &#8220;shouldn&#8217;t take long for me to implement&#8221; number in the dozens. Even if you know the tasks are small, the time adds up. Which brings me to my next point:<\/p>\n\n\n\n<p class=\"has-medium-font-size\"><strong>Writing&nbsp;Good&nbsp;Code&nbsp;Will&nbsp;Save&nbsp;You&nbsp;Time<\/strong><\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img loading=\"lazy\" decoding=\"async\" width=\"460\" height=\"345\" src=\"https:\/\/mattrobertson.ca\/blog\/wp-content\/uploads\/2019\/10\/CustomerSpawner.png\" alt=\"\" class=\"wp-image-145\" srcset=\"https:\/\/mattrobertson.ca\/blog\/wp-content\/uploads\/2019\/10\/CustomerSpawner.png 460w, https:\/\/mattrobertson.ca\/blog\/wp-content\/uploads\/2019\/10\/CustomerSpawner-300x225.png 300w\" sizes=\"auto, (max-width: 460px) 100vw, 460px\" \/><figcaption>Building such flexible spawners for customers and ingredients was <dfn class=\"dictionary-of-numbers\">one of my better <\/dfn>choices during the jam<br><\/figcaption><\/figure><\/div>\n\n\n\n<p>When I sat down to start building our first level, I knew we&#8217;d want to build a bunch of them, and since I was the only dev (and had to work at my day job the last day of the jam), I knew we needed the systems to be in-place for levels to be added and tweaked without writing any code.<\/p>\n\n\n\n<p>Setting up the systems I needed to make took a little more time than if I had just hard-coded everything in the first time around; but it meant that with pressure mounting and the clock nearly up, we were able to go from a single difficult level to four levels that actually teach the game.<\/p>\n\n\n\n<p>More so than anything in the jam though, I think it&#8217;s set us up nicely for expanding on the game afterwards.<\/p>\n\n\n\n<p class=\"has-medium-font-size\"><strong>But Be&nbsp;Prepared&nbsp;to&nbsp;Duct&nbsp;Tape&nbsp;Over&nbsp;it<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"655\" height=\"224\" src=\"https:\/\/mattrobertson.ca\/blog\/wp-content\/uploads\/2019\/10\/AAAAAA-1.png\" alt=\"\" class=\"wp-image-150\" srcset=\"https:\/\/mattrobertson.ca\/blog\/wp-content\/uploads\/2019\/10\/AAAAAA-1.png 655w, https:\/\/mattrobertson.ca\/blog\/wp-content\/uploads\/2019\/10\/AAAAAA-1-300x103.png 300w\" sizes=\"auto, (max-width: 655px) 100vw, 655px\" \/><figcaption>As innocuous as it looks, this chunk of code caused a bug I spent nearly three hours trying to fix, before giving up and abandoning the feature.<\/figcaption><\/figure>\n\n\n\n<p>Look, you only have 72 hours. You have even less if you take breaks and sleep (and you should, no one does good work while exhausted). You don&#8217;t want to spend three hours trying to track down a fix for a random issue, or implementing a tricky system for a one-off effect.<\/p>\n\n\n\n<p>Be ruthless. If something&#8217;s not working, find the shortest path to get it done, even if it&#8217;s bad code. If that means dropping the feature, so be it (in the above case, I gave up on having the tongue stick out to show what item Frogbert is holding).<\/p>\n\n\n\n<p class=\"has-medium-font-size\"><strong>Build&nbsp;Your&nbsp;Game&nbsp;Early,&nbsp;and&nbsp;Often<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"239\" src=\"https:\/\/mattrobertson.ca\/blog\/wp-content\/uploads\/2019\/10\/Uhoh-1024x239.png\" alt=\"\" class=\"wp-image-151\" srcset=\"https:\/\/mattrobertson.ca\/blog\/wp-content\/uploads\/2019\/10\/Uhoh-1024x239.png 1024w, https:\/\/mattrobertson.ca\/blog\/wp-content\/uploads\/2019\/10\/Uhoh-300x70.png 300w, https:\/\/mattrobertson.ca\/blog\/wp-content\/uploads\/2019\/10\/Uhoh-768x179.png 768w, https:\/\/mattrobertson.ca\/blog\/wp-content\/uploads\/2019\/10\/Uhoh.png 1514w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption>Not a good message to see right before bed on the last day of the jam<\/figcaption><\/figure>\n\n\n\n<p>I&#8217;m sure this advice is obvious to every developer who&#8217;s actually released a game before, but we made the mistake of not trying to build our game until we were preparing to release, at ~10pm on Sunday night. As it turns out, that&#8217;s a great way to end up tearing your hair out until 1am trying to get things working.<\/p>\n\n\n\n<p>Don&#8217;t be like us, don&#8217;t get surprised by last minute build errors.<\/p>\n\n\n\n<p class=\"has-medium-font-size\"><strong>Get&nbsp;People&nbsp;to&nbsp;Playtest&nbsp;Early&nbsp;on<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"545\" src=\"https:\/\/mattrobertson.ca\/blog\/wp-content\/uploads\/2019\/10\/ATheme-1024x545.png\" alt=\"\" class=\"wp-image-153\" srcset=\"https:\/\/mattrobertson.ca\/blog\/wp-content\/uploads\/2019\/10\/ATheme-1024x545.png 1024w, https:\/\/mattrobertson.ca\/blog\/wp-content\/uploads\/2019\/10\/ATheme-300x160.png 300w, https:\/\/mattrobertson.ca\/blog\/wp-content\/uploads\/2019\/10\/ATheme-768x409.png 768w, https:\/\/mattrobertson.ca\/blog\/wp-content\/uploads\/2019\/10\/ATheme.png 1156w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption>I can&#8217;t help but notice a theme here<\/figcaption><\/figure>\n\n\n\n<p>This is obviously tough to do mid-jam, since you&#8217;re so busy with everything, but managing to get some outside hands on your game before you&#8217;re finished can help out quite a lot with finding pain-points before the judges do.<\/p>\n\n\n\n<p>You know your game better than anyone else, so things feeling good to you might not translate to intuitive handling by random players. However, getting feedback won&#8217;t do you any good if you don&#8217;t &#8211; <\/p>\n\n\n\n<p class=\"has-medium-font-size\"><strong>Leave Time To Tweak<\/strong><\/p>\n\n\n\n<p><strong> <\/strong>We aimed pretty high with Frogbert, both for features and for polish. As a consequence, a lot of random numbers I put in during development (waiting <dfn class=\"dictionary-of-numbers\">0.5s between movements<\/dfn>, or spawn speeds\/times for ingredients for instance) didn&#8217;t see the fine-tuning they needed. <\/p>\n\n\n\n<p>You don&#8217;t have tons of time to do this, but if you&#8217;re taking time to juice up your art and sound, make sure you&#8217;re at least spending a bit of time sanity checking your game-play balancing levers.<\/p>\n\n\n\n<p class=\"has-medium-font-size\"><strong>Overall&nbsp;Impressions<\/strong><\/p>\n\n\n\n<p>The jam was an unbelievable amount of fun, and I&#8217;m incredibly proud of the game we managed to turn in. The rating process is looking like it&#8217;ll be a fantastically supportive time to get feedback from other game makers and see other rad interpretations of the theme. I&#8217;d absolutely do this again, and hopefully can only get even better from here.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img decoding=\"async\" src=\"https:\/\/img.itch.zone\/aW1hZ2UvNDk0NjM2LzI1NTY5NjIuZ2lm\/347x500\/bT97N5.gif\" alt=\"\"\/><\/figure><\/div>\n","protected":false},"excerpt":{"rendered":"<p>This past weekend I participated in what was not only my first Ludum Dare, but my first game jam ever. By the end of those whirlwind 72 hours working with my artist teammates, I publicly released my first game (outside<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-141","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/mattrobertson.ca\/blog\/wp-json\/wp\/v2\/posts\/141","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/mattrobertson.ca\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/mattrobertson.ca\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/mattrobertson.ca\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/mattrobertson.ca\/blog\/wp-json\/wp\/v2\/comments?post=141"}],"version-history":[{"count":8,"href":"https:\/\/mattrobertson.ca\/blog\/wp-json\/wp\/v2\/posts\/141\/revisions"}],"predecessor-version":[{"id":177,"href":"https:\/\/mattrobertson.ca\/blog\/wp-json\/wp\/v2\/posts\/141\/revisions\/177"}],"wp:attachment":[{"href":"https:\/\/mattrobertson.ca\/blog\/wp-json\/wp\/v2\/media?parent=141"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/mattrobertson.ca\/blog\/wp-json\/wp\/v2\/categories?post=141"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/mattrobertson.ca\/blog\/wp-json\/wp\/v2\/tags?post=141"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}