{"author_name":"Red Mike","cat":"LD #24","comments":[],"epoch":1346076240,"likes":1,"metadata":{"p_key":"51891","p_author":"Red Mike","p_authorkey":"14718","p_urlkey":"87589","p_title":"Postmortem \u2014 A Cycle of Ages","p_cat":"LD #24","p_event":"LD24","p_time":"1346076240","p_likes":"1","p_comments":"0","p_status":"UPD5","us_key":"14718","us_name":"Red Mike","us_username":"red-mike","event_start":"1345766400","event_key":"12","event_name":"LD24"},"text":"<p><a href=\"http:\/\/www.ludumdare.com\/compo\/ludum-dare-24\/?action=preview&amp;uid=14718\">RIP.<\/a> Well, that was fun. And horrible. But still fun.<\/p>\n <p><a href=\"http:\/\/www.ludumdare.com\/compo\/2012\/08\/27\/postmortem-a-cycle-of-ages\/bush-2\/\" rel=\"attachment wp-att-175942\"><img src=\"http:\/\/www.ludumdare.com\/compo\/wp-content\/uploads\/2012\/08\/bush1-300x225.png\" alt=\"\" width=\"300\" height=\"225\" class=\"alignnone size-medium wp-image-175942\" srcset=\"http:\/\/ludumdare.com\/compo\/wp-content\/uploads\/2012\/08\/bush1-300x225.png 300w, http:\/\/ludumdare.com\/compo\/wp-content\/uploads\/2012\/08\/bush1-550x412.png 550w, http:\/\/ludumdare.com\/compo\/wp-content\/uploads\/2012\/08\/bush1.png 641w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n <p><strong>Good decisions<\/strong>:<\/p>\n <ul>\n <li>Deciding to not use the same silly mechanics everyone was using, on account of being certain I couldn&#8217;t pull it off better than most of the others.<\/li>\n <li>Choosing to go with a completely monochrome art style, on account of not being very good at art, myself.<\/li>\n <li>Sleeping for at least 6 hours in the middle of the competition.<\/li>\n <li>Dropping the target length of the game when it became apparent the performance would go down massively.<\/li>\n <li>Recording my own guitar melody on my awful microphone, and using Audacity to somehow clean it up enough.<\/li>\n <\/ul>\n <p><strong>Bad decisions:<\/strong><\/p>\n <ul>\n <li>Using a single image file for each level, with the three channels describing each pixel in the game. See addendum 1.<\/li>\n <li>Using Pygame. Over half the time was spent searching through the documentation or source code to the library due to odd errors I got.<\/li>\n <li>Deciding to not create a robust framework, and build it on workarounds and hard code, on account of trying to stay in the timeframe.<\/li>\n <li>Not taking a pre-emptive analysis break. See addendum 2.<\/li>\n <li>Not posting quite as many developer logs I was hoping for. 5 is good, 10 would have been better.<\/li>\n <li>Not setting up either a recording method to record videos to show people, or a way to stream my screen.<\/li>\n <\/ul>\n <p><strong>Addendum 1<\/strong>: The way I organised each level wasn&#8217;t really up to par to the huge size each of them had to have. I tried to go with the method I&#8217;ve seen used for tile-based platformers. Each level is a single image, with the RGB channels encoding information about each tile. For example, red being 0 means solid, otherwise means pass-through. This works well with tiles because you&#8217;re unlikely to have a level be more than, say, 1000 tiles by 1000 tiles. On the other hand, my game had levels that were <em>20000<\/em> pixels by <em>5000<\/em> pixels. Encoding each pixel as a pixel in the image means, yes, a 20k x 5k image. Pygame, for one, can&#8217;t load images past a certain limit (20k x 10k I believe?), and it has, second, a large overhead when reaching that limit. And I mean exponentially increasing. That&#8217;s the reason my game freezes as you move to a second level. The culprit is a single line of code, so I could have done two things: split the level into multiple images and load and stick together, or rewrite a bit of the pygame library. I wasn&#8217;t going to get either of those in the 5 hours I had left, so I left it at this, with a warning.<\/p>\n <p><strong>Addendum 2<\/strong>: This is related to addendum 1. What I should have done, rather than plow ahead only playing the occasional attempt through the game to check for massive errors and obvious bugs, is take a break six hours in, or even every six hours, and just play through what I have <em>intently<\/em>. Figure out if I like the direction it&#8217;s going, check for performance issues, fix everything <em>then and there<\/em>. I basically piled myself a ton of performance bugs as I kept coding, then had to fix them all at the end. Considering that, for example, if I were to fix the first bug I&#8217;d have to rewrite a good deal of the game that would have meant bugs 2, and 3 wouldn&#8217;t have popped up. However, now that bugs 2 and 3 have workarounds, fixing the first bug <em>while keeping the same outcome<\/em> would mean even more work. Basically, early playthrough-and-fix breaks, or often if possible.<\/p>\n <p>Overall, I&#8217;m happy with what came out of this. To use the Ludum Dare scoring system, this is what I&#8217;d give myself objectively:<\/p>\n <ul>\n <li>Innovation: 2\/5 &#8212; It&#8217;s just your basic sidescroller, after all.<\/li>\n <li>Fun: 1\/5 &#8212; Not much else to do, other than follow the story.<\/li>\n <li>Theme: 5\/5 &#8212; The theme really was the focus, even if through the story and the mood.<\/li>\n <li>Graphics: 3\/5 &#8212; I like to think the graphics weren&#8217;t that awful.<\/li>\n <li>Audio: 2\/5 &#8212; No sound effects, just a single backing track.<\/li>\n <li>Humor: 1\/5 &#8212; Not much humor in it, after all.<\/li>\n <li>Mood: 4\/5 &#8212; I like to consider that with the writing and the art style, I managed to set a mood, even if a bit offset by technical issues.<\/li>\n <\/ul>","time":"August 27th, 2012 9:04 am","title":"Postmortem \u2014 A Cycle of Ages"}