{"author_name":"sgstair","cat":"LD #15 - Caverns - 2009","comments":[],"epoch":1251768420,"likes":0,"metadata":{"p_key":"72508","p_author":"sgstair","p_authorkey":"230","p_urlkey":"108330","p_title":"Cavern Ghost: Postmortem","p_cat":"LD #15 - Caverns - 2009","p_event":"LD15","p_time":"1251768420","p_likes":"0","p_comments":"0","p_status":"UPD5","us_key":"230","us_name":"sgstair","us_username":"\/author\/sgstair\/","event_start":"1251417600","event_key":"1","event_name":"LD15"},"text":"<p>First off: Many thanks to PoV and phillhassey, and others who donate their time to this event &#8211; Seriously, they don&#8217;t get enough credit.<br \/>\n LD is great partly because it&#8217;s so well organized &#8211; thanks to having the infrastructure and so many people involved it&#8217;s easy to get and stay excited about the idea &#8211; I think this is a major component of the fun in LD, and it wouldn&#8217;t be possible without a lot of effort on their part. (besides of course, what fun would going insane be if you weren&#8217;t alongside 150 of your closest friends? <img src=\"http:\/\/ludumdare.com\/compo\/wp-includes\/images\/smilies\/simple-smile.png\" alt=\":)\" class=\"wp-smiley\" style=\"height: 1em; max-height: 1em;\" \/> )<\/p>\n <p>So, on to a postmortem of my game&#8230;<br \/>\n <span id=\"more-10172\"><\/span><br \/>\n My project went immeasurably better than my last entry, in LD11; To recap, in LD11 I spent about the first 30 hours building (And debugging) a rendering engine, which didn&#8217;t bode well for coming up with anything spectacular in the remaining time. I was also preoccupied with a few other things (including an addictive online game &#8211; hah). Ultimately though, I wound up with a minorly neat techdemo type game that was mostly thrown together near the deadline; I didn&#8217;t really want to finish it at all really, besides just to have something playable.<br \/>\n This time around, I had most of the rendering code done beforehand (and released in a library) &#8211; I didn&#8217;t get very tired of working on this project until very nearly the end &#8211; it was a very enjoyable experience.<\/p>\n <p>A list of things that went a lot better than I planned:<\/p>\n <ul>\n <li>The pre-LD library release<br \/>\n Having a library of basic rendering \/ audio code made a lot of the menial tasks of game development a thing of the past; I still wound up having to write some additional rendering code, but it wasn&#8217;t a long and drawn out process of debugging to make it work.<br \/>\n All of the graphics in my entry are in fact procedurally generated or rendered by simple code, there are no art assets (except perhaps the font; that&#8217;s a windows system thing) &#8211; Having a coherent graphics library helped with this substantially. (I&#8217;m not an artist, you might be able to tell)\n <\/li>\n <li>The cavern generator<br \/>\n In case you hadn&#8217;t noticed, the cavern is randomly generated every time you play the game &#8211; Most of my effort in this LD went into building this cavern generator; Ultimately I wound up with some simple rules for generation that worked rather well. I had to special case some logic about which caverns are allowed to connect to others, due to some really odd glitches when it was completely random (sometimes a connecting passage would run on top of another cavern somewhere.) &#8211; But the end result is really rather nifty; It sometimes builds some insane and highly unusually shaped caves, and it always connects all of the caves together. If I actually had an interesting gameplay mechanic, this would have been an excellent platform to execute it in \ud83d\ude1b\n <\/li>\n <li>Other technical things<br \/>\n I love LD because it&#8217;s such a good platform for just trying random stuff out. One thing I did in my entry was to split the rendering across multiple threads &#8211; So there&#8217;s a one frame lag in the world position, but it&#8217;s not noticeable at all in the game. The helper thread renders the cave world to a backbuffer one frame ahead, and then the next frame that backbuffer is copied, and used with the lighting code to composite the final output bitmap. I thought it would be harder but the simple signalling system I used was rather painless to implement, and I guess I&#8217;m fortunate that my rendering was simple enough to split off without having to deal with more complex synchronization. So if you&#8217;re on a multi-cpu system, you get a slight speed boost from this <img src=\"http:\/\/ludumdare.com\/compo\/wp-includes\/images\/smilies\/simple-smile.png\" alt=\":)\" class=\"wp-smiley\" style=\"height: 1em; max-height: 1em;\" \/> (And I did test that it works fine on single-core systems as well.) Additionally, this second thread performs all of the cavern generation, which leaves my main window thread free to render a progress bar  &#8211; Having the player wait while the game appears to be frozen didn&#8217;t seem like a good idea.\n <\/li>\n <\/ul>\n <p>And, things that didn&#8217;t quite go as planned:<\/p>\n <ul>\n <li>The Theme<br \/>\n This theme was really the sticking point for me &#8211; I couldn&#8217;t come up with any gameplay ideas that I thought would be doable in the time limit; And I wound up not picking one to attempt until it was too late to do anything serious. As such, my game has a very simple goal. One of the early themes I came up with was one of &#8220;Exploration&#8221;, but I couldn&#8217;t work out how to fit that into a game without being boring and repetitive. So, I guess you&#8217;re free to explore the game world in this game, and if you don&#8217;t want to explore, there&#8217;s not much to it <img src=\"http:\/\/ludumdare.com\/compo\/wp-includes\/images\/smilies\/simple-smile.png\" alt=\":)\" class=\"wp-smiley\" style=\"height: 1em; max-height: 1em;\" \/>\n <\/li>\n <li>Music<br \/>\n Hey! I had music! I&#8217;m reasonably happy with that. It&#8217;s very basic, and procedurally generated (just a set of predefined sequences playing with a random base note)&#8230; I just feel that so much more could have been done with this.\n <\/li>\n <li>Rendering speed<br \/>\n Well, everything is software rendered. I was so happy to use my brand new shiny rendering lib &#8211; but it is a little on the slow side (it&#8217;s highly generic) &#8211; some of you have noticed this, on slower computers. The lighting effect in my game is built using essentially a pixel shader that copies pixels from a backbuffer to the front buffer with some lighting value &#8211; It&#8217;s rather far from the most optimized way to do this&#8230; However, I expect the game will be playable on most semi-modern computers. If I had to do it again, knowing what I know now, I would probably opt to set up direct3d or something, and use hardware rendering for this effect.\n <\/li>\n <\/ul>\n <p>Overall, as I&#8217;ve said, I had quite a lot of fun this LD, and I think I&#8217;ve come up with a number of good points I can improve on: I should probably work to secure gameplay sooner, even if it means trying something that doesn&#8217;t seem possible. I should probably expand my rendering library to make it easier to import external graphics, so I won&#8217;t be so tempted to procedurally generate everything (Or just build much better framework code for procedural generation)&#8230; And all games could use to have more cats in them.<\/p>\n <p>That is all, thank you for your time <img src=\"http:\/\/ludumdare.com\/compo\/wp-includes\/images\/smilies\/simple-smile.png\" alt=\":)\" class=\"wp-smiley\" style=\"height: 1em; max-height: 1em;\" \/><br \/>\n -Stephen<\/p>\n \n <p>Tags: <a href=\"http:\/\/ludumdare.com\/compo\/tag\/postmortem\/\" rel=\"tag\">postmortem<\/a><\/p>","time":"August 31st, 2009 8:27 pm","title":"Cavern Ghost: Postmortem"}