<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-30715094</id><updated>2011-06-08T02:26:10.929-04:00</updated><title type='text'>Geek-o-Philiac</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://geekophiliac.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30715094/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://geekophiliac.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Ricky</name><uri>http://www.blogger.com/profile/05379063540281664952</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://wvvel.csee.wvu.edu/rhussmann/moneyShot.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>39</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-30715094.post-116569758105875285</id><published>2006-12-09T15:52:00.000-05:00</published><updated>2006-12-09T22:33:18.416-05:00</updated><title type='text'>US Cellular POSTer</title><content type='html'>Sometime over the past two weeks one of my coworkers sent me a text message via US Cellular's text message &lt;a href="http://usc.ztango.com/uscwmss"&gt;sender&lt;/a&gt;. After thinking about it, I wanted to write a program that could do the same thing. Now, I know I could simply write an email client to send to a US Cellular email address, but where's the fun in that?&lt;br /&gt;So, I began my journey. My first suspicion (and hope) was that the US Cellular page used HTTP POST to transmit its information. I fired up Ethereal (now called &lt;a href="http://www.wireshark.org/"&gt;WireShark&lt;/a&gt;) and began sniffing packets. Sure enough, there was a POST to usc.ztango.com:&lt;br /&gt;&lt;em&gt;POST /uscwmss HTTP/1.1&lt;br /&gt;&lt;br /&gt;Host: usc.ztango.com&lt;br /&gt;&lt;br /&gt;User-Agent: Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.8.1) Gecko/20061010 Firefox/2.0&lt;br /&gt;&lt;br /&gt;Accept: text/xml,application/xml,application/xhtml+xml,&lt;br /&gt;text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5&lt;br /&gt;&lt;br /&gt;Accept-Language: en-us,en;q=0.5&lt;br /&gt;&lt;br /&gt;Accept-Encoding: gzip,deflate&lt;br /&gt;&lt;br /&gt;Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7&lt;br /&gt;&lt;br /&gt;Keep-Alive: 300&lt;br /&gt;&lt;br /&gt;Connection: keep-alive&lt;br /&gt;&lt;br /&gt;Referer: http://usc.ztango.com/uscwmss&lt;br /&gt;&lt;br /&gt;Content-Type: application/x-www-form-urlencoded&lt;br /&gt;&lt;br /&gt;Content-Length: 148&lt;br /&gt;&lt;br /&gt;sesId=10F6896FF1DE72C40A&lt;br /&gt;&amp;#38;MSG=From%3A+**********%0D%0AHey+buddy.&lt;br /&gt;&amp;#38;ADDRESSES=**********&lt;br /&gt;&amp;#38;FROMADDRESS=**********&lt;br /&gt;&amp;#38;MSG_TMP=Hey+buddy.&amp;#38;count=122&lt;br /&gt;&amp;#38;tc_agree=on&lt;br /&gt;HTTP/1.1 302 Moved Temporarily&lt;br /&gt;&lt;br /&gt;(&lt;/em&gt;&lt;strong&gt;&lt;em&gt;NOTE&lt;/em&gt;&lt;/strong&gt;&lt;em&gt;: I added linebreaks to the above body for clarity. In actuality the parameters are al in one line.)&lt;br /&gt;&lt;br /&gt;Really what we're interested in is the body of the POST message, which I'll copy and paste to make things clearer:&lt;br /&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;sesId=10F6896FF1DE72C40A&lt;br /&gt;&amp;#38;MSG=From%3A+**********%0D%0AHey+buddy.&lt;br /&gt;&amp;#38;ADDRESSES=**********&lt;br /&gt;&amp;#38;FROMADDRESS=**********&lt;br /&gt;&amp;#38;MSG_TMP=Hey+buddy.&lt;br /&gt;&amp;#38;count=122&lt;br /&gt;&amp;#38;tc_agree=on&lt;br /&gt;&lt;br /&gt;(&lt;/em&gt;&lt;br /&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;strong&gt;&lt;em&gt;NOTE&lt;/em&gt;&lt;/strong&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;&lt;em&gt;: I have erased the phone number in the request for confidentiality reasons. This number can be any 10-digit US Cellular number)&lt;br /&gt;&lt;br /&gt;Looking at the text, we can break out the parameters of the request:&lt;/em&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;/li&gt;&lt;li&gt;sesId&lt;/li&gt;&lt;li&gt;MSG&lt;/li&gt;&lt;li&gt;ADDRESSES&lt;/li&gt;&lt;li&gt;FROMADDRESS&lt;/li&gt;&lt;li&gt;MSG_TMP&lt;/li&gt;&lt;li&gt;count&lt;/li&gt;&lt;li&gt;tc_agree&lt;/li&gt;&lt;/ul&gt;I can't claim to know what all this means, but here's what I've been able to decipher:&lt;br /&gt;&lt;strong&gt;&lt;br /&gt;sesId&lt;/strong&gt; - A session id generated  by US Cellular to determine delivery status of the message. If you send a message from the US Cellular page, a resultant page will display showing the delivery status of the message. This is more of a guess than anything. For the purposes of this program I'm just going to keep using the sesId I grabbed from the sniffed packet.&lt;br /&gt;&lt;strong&gt;&lt;br /&gt;MSG&lt;/strong&gt; - Ahh, the interesting part. This is the actual message to be transmitted. Tthere's some code on the page to automatically prepend the message with the string "From:**********" This is one of the things I didn't like about the page, and we'll just leave it out of our messages entirely.&lt;br /&gt;&lt;strong&gt;&lt;br /&gt;ADDRESSES&lt;/strong&gt;: The US Cellular number to send this message to. Note the parameter name is ADDRESS&lt;strong&gt;ES&lt;/strong&gt;, plural. I'm assuming there's a way to send the message to multiple phone numbers, but I've never tried it.&lt;br /&gt;&lt;strong&gt;&lt;br /&gt;FROMADDRESS&lt;/strong&gt;: For all intents and purposes this field is worthless. It is used in the page code to generate the "From: **********" header on the message. When you receive a message from the US Cellular gateway, however, it always has the same default from number (0001114444). Again, this is a bit of guesswork on my part. We'll continue to include this parameter simply because I've never checked to see if its absolutely necessary (I guess US Cellular may check to ensure this is a valid phone number).&lt;br /&gt;&lt;strong&gt;&lt;br /&gt;MSG_TEMP&lt;/strong&gt;: Again, I believe this is another worthless parameter. My theory is that this parameter is passed along to the results page after the message is sent to display the message to the user. We'll continue to send this field along as well, for posterity's sake.&lt;br /&gt;&lt;strong&gt;&lt;br /&gt;count&lt;/strong&gt;: This is the number of free characters left in the message, with a maximum of 132. Basically, this parameter should be 132 - (number of characters in your message). Again, I think this is for the results webpage that gets displayed after the message is sent (and therefore probably not necessary).&lt;br /&gt;&lt;strong&gt;&lt;br /&gt;tc_agree&lt;/strong&gt;: This is the Terms and Conditions checkbox flag. If you don't check it, then you can't send a message. Again, we'll keep this always set as true.&lt;br /&gt;&lt;br /&gt;Really, that's it. Its relatively simple. So now all that needs done is to write a client that can send HTTP POST messages to a given address with specified content. I wrote my first client in .NET with C#. .NET provides a class to do HTTP POST messages, so I literally wrote like 15 lines of code to get it to work. This was with everything hard-coded, but the proof-of-concept was there.&lt;br /&gt;So, about a week later I decided to re-write the client in Cocoa for OSX, and add a GUI. If you've never written for OSX before, GUIs are drop-dead-easy (just like .NET with Visual Studio). So creating a window with a button, two fields and a text-box took maybe two minutes. The gotcha, however, is that OSX provides no HTTP POST message classes. There's a generic HTTP class, but no specific way to do POST. Therefore, you need to fill out the headers and create the message yourself.&lt;br /&gt;I'm really lazy, so the idea didn't appeal to me. I Googled around for something that would do POST for me, and it didn't take long before I had a winner. Fritz Anderson (author of &lt;em&gt;Step into XCode&lt;/em&gt;, and contributor to MacTech) had a sample article covering this &lt;a href="http://www.mactech.com/articles/mactech/Vol.19/19.04/CocoaApplications/index.html"&gt;exact issue&lt;/a&gt;. So, after reading that article and the &lt;a href="http://www.mactech.com/articles/mactech/Vol.19/19.04/CocoaApplications/index.html"&gt;prior&lt;/a&gt; as well, I heinously stole Fritz's FAWebPostQuery class to use in the client.&lt;br /&gt;The rest is history. I have a desktop client I can use to send messages to any US Cellular customer. I don't have to pay 10 cents per message, nor use the keypad to punch in numbers. I've toyed with the idea of integrating with Address Book, but I don't know if this project has sparked my interest enough to warrant the added energy. At any rate, it was a fun little app to write (especially since I didn't have to do any of the POST wrangling).&lt;br /&gt;&lt;br /&gt;&lt;a href="http://csee.wvu.edu/~hussmann/POSTer_Full.jpg" onclick="window.open('http://csee.wvu.edu/~hussmann/POSTer_Full.jpg','popup','width=661,height=520,scrollbars=no,resizable=yes,toolbar=no,directories=no,location=no,menubar=no,status=yes,left=0,top=0');return false"&gt;&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://csee.wvu.edu/~hussmann/POSTer_Full.jpg" onclick="window.open('http://csee.wvu.edu/~hussmann/POSTer_Full.jpg','popup','width=661,height=520,scrollbars=no,resizable=yes,toolbar=no,directories=no,location=no,menubar=no,status=yes,left=0,top=0');return false"&gt;&lt;br /&gt;&lt;/a&gt;&lt;a href="http://csee.wvu.edu/~hussmann/POSTer_Full.jpg" onclick="window.open('http://csee.wvu.edu/~hussmann/POSTer_Full.jpg','popup','width=661,height=520,scrollbars=no,resizable=yes,toolbar=no,directories=no,location=no,menubar=no,status=yes,left=0,top=0');return false"&gt;&lt;img alt="Screenshot" border="1" height="100" hspace="4" longdesc="Screenshot of the OSX POSTer client" src="http://csee.wvu.edu/~hussmann/POSTer_Full.jpg" title="Screenshot" vspace="4" width="127"/&gt;&lt;/a&gt;&lt;a href="http://csee.wvu.edu/~hussmann/POSTer_Full.jpg" onclick="window.open('http://csee.wvu.edu/~hussmann/POSTer_Full.jpg','popup','width=661,height=520,scrollbars=no,resizable=yes,toolbar=no,directories=no,location=no,menubar=no,status=yes,left=0,top=0');return false"&gt;&lt;br /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30715094-116569758105875285?l=geekophiliac.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekophiliac.blogspot.com/feeds/116569758105875285/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30715094&amp;postID=116569758105875285' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30715094/posts/default/116569758105875285'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30715094/posts/default/116569758105875285'/><link rel='alternate' type='text/html' href='http://geekophiliac.blogspot.com/2006/12/us-cellular-poster.html' title='US Cellular POSTer'/><author><name>Ricky</name><uri>http://www.blogger.com/profile/05379063540281664952</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://wvvel.csee.wvu.edu/rhussmann/moneyShot.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30715094.post-116398439896675097</id><published>2006-11-19T19:53:00.000-05:00</published><updated>2006-11-19T19:59:59.206-05:00</updated><title type='text'>72HGDC: Day 2</title><content type='html'>Things are going pretty well, which I think is illustrated by the next two screenshots.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/860/3300/1600/ss1.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/blogger/860/3300/320/ss1.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/860/3300/1600/ss2.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/blogger/860/3300/320/ss2.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;You see that nifty radial shine effect going on?  I don't want to brag, but I think more technology expertise went into that then anything anyone has &lt;i&gt;ever&lt;/i&gt; entered into the competition.&lt;br /&gt;&lt;br /&gt;Also, I've managed to finish two stellar songs:&lt;br /&gt;&lt;a href="http://kinkyorigami.com/media/Crazy.mp3"&gt;Song 1: Lilac Devotion&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.csee.wvu.edu/%7Ehussmann/JustToRockYouLikeAHurricane.mp3"&gt;Song 2: Rogue Veterinarian&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I think you'll like what you hear.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30715094-116398439896675097?l=geekophiliac.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekophiliac.blogspot.com/feeds/116398439896675097/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30715094&amp;postID=116398439896675097' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30715094/posts/default/116398439896675097'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30715094/posts/default/116398439896675097'/><link rel='alternate' type='text/html' href='http://geekophiliac.blogspot.com/2006/11/72hgdc-day-2.html' title='72HGDC: Day 2'/><author><name>Brian Sowers</name><uri>http://www.blogger.com/profile/04735666528079624327</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30715094.post-116388023555203946</id><published>2006-11-18T14:57:00.000-05:00</published><updated>2006-11-18T15:03:55.560-05:00</updated><title type='text'>72HGDC: Day 1</title><content type='html'>Things got off to a rough start this time around.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/860/3300/1600/arg1.3.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/blogger/860/3300/320/arg1.3.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;I think I solved the problems, though.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/860/3300/1600/arg2.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/blogger/860/3300/320/arg2.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;One of them, anyway.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/860/3300/1600/arg3.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/blogger/860/3300/320/arg3.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Ah, that's better.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/860/3300/1600/arg4.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/blogger/860/3300/320/arg4.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Looks like it'll just be me now.  Before that little... incident, though, I managed to salvage &lt;a href="http://www.kinkyorigami.com/media/Obsession.mp3"&gt;this&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Lookin' good.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30715094-116388023555203946?l=geekophiliac.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekophiliac.blogspot.com/feeds/116388023555203946/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30715094&amp;postID=116388023555203946' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30715094/posts/default/116388023555203946'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30715094/posts/default/116388023555203946'/><link rel='alternate' type='text/html' href='http://geekophiliac.blogspot.com/2006/11/72hgdc-day-1.html' title='72HGDC: Day 1'/><author><name>Brian Sowers</name><uri>http://www.blogger.com/profile/04735666528079624327</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30715094.post-116253514176044917</id><published>2006-11-03T01:01:00.000-05:00</published><updated>2006-11-03T01:25:41.770-05:00</updated><title type='text'>Months Later</title><content type='html'>I am a &lt;span style="font-style: italic;"&gt;filthy liar&lt;/span&gt;.  No more than a handful of days after I announced - with great resolve - a rigid update schedule, I stopped updating completely for well over a month.&lt;br /&gt;&lt;br /&gt;You see, I've been really depressed ever since the Titanic sank.   It left a mark on me that has changed all my relationships and how I live my life.  To think that an unsinkable ship would fold to a slow-moving, single block of ice completely devestated my world view.  I haven't been able to eat or sleep since then.  It's like I'm a completely different person.&lt;br /&gt;&lt;br /&gt;I'm trying to push through it, though.  I'm running another &lt;a href="http://www.72hourgdc.com"&gt;72 Hour Game Dev Competition&lt;/a&gt; on November 17th.  I'm coming up with film ideas.  I'm getting the Guitar Hero guitar to work properly on the PC, paving the way for an editable clone.  I'm being displeased with the recent "additions" to the &lt;a href="http://msdn.microsoft.com/directx/XNA/default.aspx"&gt;XNA &lt;/a&gt;framework.  I'm doing a lot of the same old stuff.&lt;br /&gt;&lt;br /&gt;In the interests of not providing a contentless update, I will talk about why I'm disliking XNA as its development unfolds.  It's not that the system is bad (I'm still pretty happy with it overall), but I expected more significant improvements with the introduction of Beta 2.  It just looks like they reorganized some stuff and renamed a few methods; there were no real additions.  I've had a wishlist of things I would like to see implemented - cleaner input handling mechanisms and a &lt;span style="font-style: italic;"&gt;vastly different&lt;/span&gt; sound system, to name two - and I'm not too confident I'll ever see those ideas materialize.  I feel like I'm going to have to spend a lot of time arguing with some of the systems, much in the same way that I had to battle early versions of Allegro to get an image on the screen.&lt;br /&gt;&lt;br /&gt;I'm curious to see how the content pipeline plays out.  I've only seen preliminary information, but cleaning up resources seems to be a &lt;span style="font-style: italic;"&gt;pain&lt;/span&gt; with it.  I really hope I'm not yet seeing the bigger picture here and that things will be more seemless than they seem, because I really want to believe this will be a good addition.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30715094-116253514176044917?l=geekophiliac.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekophiliac.blogspot.com/feeds/116253514176044917/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30715094&amp;postID=116253514176044917' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30715094/posts/default/116253514176044917'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30715094/posts/default/116253514176044917'/><link rel='alternate' type='text/html' href='http://geekophiliac.blogspot.com/2006/11/months-later.html' title='Months Later'/><author><name>Brian Sowers</name><uri>http://www.blogger.com/profile/04735666528079624327</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30715094.post-115938119713409125</id><published>2006-09-27T13:47:00.000-04:00</published><updated>2006-09-27T14:19:57.400-04:00</updated><title type='text'>Process Management: Basic Implementation</title><content type='html'>Here's some psuedo-code for an abstract class Process which all other processes inherit from.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;abstract class Process inherits GameEventSubscriber&lt;br /&gt;{&lt;br /&gt;    //Keep a list of all this Process's children&lt;br /&gt;    private List&lt;process&gt; mChildren;&lt;br /&gt;&lt;br /&gt;    //Determines whether the Process is alive or not&lt;br /&gt;    private bool mIsAlive;&lt;br /&gt;&lt;br /&gt;    //Called automatically when the Process starts.  This&lt;br /&gt;    //is where initialization for the Process should begin.&lt;br /&gt;    //This is in contrast to putting the initialization in&lt;br /&gt;    //the constructor, since we want to wait until the Process&lt;br /&gt;    //is actually running before starting up some of its&lt;br /&gt;    //functionality.&lt;br /&gt;    //All Processes should call the base Process's Start&lt;br /&gt;    //to provide some necessary functionality.&lt;br /&gt;    public virtual void Start()&lt;br /&gt;    {&lt;br /&gt;        mIsAlive = true;&lt;br /&gt;        post event (process started)&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    //Called automatically when the Process stops.&lt;br /&gt;    //This allows you to free up resources or perform&lt;br /&gt;    //certain functionality immediately when the Process&lt;br /&gt;    //stops running as opposed to waiting until the&lt;br /&gt;    //Process is destroyed.&lt;br /&gt;    //This method does not stop all of the children&lt;br /&gt;    //of this Process, which may be a possible&lt;br /&gt;    //improvement.&lt;br /&gt;    //All Process's should call the base's Stop to&lt;br /&gt;    //provide some necessary functionality.&lt;br /&gt;    public virtual void Stop()&lt;br /&gt;    {&lt;br /&gt;        mIsAlive = false;&lt;br /&gt;        post event (process stopped)&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    //Handles events sent to the Process.&lt;br /&gt;    public abstract void OnEvent(GameEvent e);&lt;br /&gt;&lt;br /&gt;    //Marks the Process as dead.  This is how a Process&lt;br /&gt;    //signifies that it's finished with its functionality and can&lt;br /&gt;    //be stopped.  However, it won't be stopped immediately.&lt;br /&gt;    //Would stopping it immediately be better?&lt;br /&gt;    //I'm not sure. ^_^&lt;br /&gt;    public void Kill()&lt;br /&gt;    {&lt;br /&gt;       mIsAlive = false;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    //Returns whether the Process has been marked&lt;br /&gt;    //as dead or not.&lt;br /&gt;    public bool IsAlive()&lt;br /&gt;    {&lt;br /&gt;        return mIsAlive;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    //Adds a child of this Process, automatically calling&lt;br /&gt;    //the child's Start method.&lt;br /&gt;    public void AddChild(Process child)&lt;br /&gt;    {&lt;br /&gt;        mChildren.Add(child);&lt;br /&gt;        child.Start();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    //Removes all the children of this Process,&lt;br /&gt;    //stopping them appropriately.  Any children&lt;br /&gt;    //of the removed children will also be stopped at this&lt;br /&gt;    //point.&lt;br /&gt;    public void RemoveAllChildren()&lt;br /&gt;    {&lt;br /&gt;        for each child in mChildren&lt;br /&gt;            child.RemoveAllChildren();&lt;br /&gt;            child.Stop();&lt;br /&gt;            mChildren.Remove(child);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    //Removes all the dead children of this Process.&lt;br /&gt;    //This function will search through all children,&lt;br /&gt;    //grandchildren, etc, looking for dead Processes&lt;br /&gt;    //to remove.  Thus, it is only necessary to call&lt;br /&gt;    //this method for the top-level Process for&lt;br /&gt;    //all the dead Processes to be removed properly.&lt;br /&gt;    //When a Process is removed in this manner,&lt;br /&gt;    //all of its children will be stopped appropriately.&lt;br /&gt;    //Ideally, this should be called at least once per&lt;br /&gt;    //frame to ensure that Processes do not linger&lt;br /&gt;    //around.&lt;br /&gt;    public void RemoveDeadChildren()&lt;br /&gt;    {&lt;br /&gt;        for each child in mChildren&lt;br /&gt;            if (not child.IsAlive())&lt;br /&gt;                child.RemoveAllChildren();&lt;br /&gt;                child.Stop();&lt;br /&gt;                mChildren.Remove(child);&lt;br /&gt;            else&lt;br /&gt;                child.RemoveDeadChildren();&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;There - that's everything.  It resembles C# to some extent, but I assure you that the code won't compile as it stands.  I won't claim that it's bullet-proof or even the most ideal implementation, but it's been treating me pretty well.  I included possible improvements within the comments.&lt;br /&gt;&lt;br /&gt;Now to create a Process which actually does something, we inherit from this base Process and override the necessary methods. So here's an example of a Process I've written which simply waits until a certain amount of time has passed.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;class ProcessWait inherits from Process&lt;br /&gt;{&lt;br /&gt;    private long mTime;&lt;br /&gt;    private long mTimeStart;&lt;br /&gt; &lt;br /&gt;    ProcessWait(long time)&lt;br /&gt;    {&lt;br /&gt;        mTime = time;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public override void Start()&lt;br /&gt;    {&lt;br /&gt;        base.Start();&lt;br /&gt;&lt;br /&gt;        //Get the time this Process started.&lt;br /&gt;        mTimeStart = GetTickCount();&lt;br /&gt;&lt;br /&gt;        //Tell the global GameEventService that this process&lt;br /&gt;        //will listen for game events of type GameEventFrame,&lt;br /&gt;        //which is an event that is fired each frame.  Obviously,&lt;br /&gt;        //how you do this depends on your event-passing scheme.&lt;br /&gt;       GameEventService.Subscribe(this, GameEventFrame);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public override void Stop()&lt;br /&gt;    {&lt;br /&gt;        //Unregister this Process so that it no longer receives&lt;br /&gt;        //events while it is stopped.&lt;br /&gt;        GameEventService.Unsubscribe(this, GameEventFrame);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public override void OnEvent(GameEvent e)&lt;br /&gt;    {&lt;br /&gt;        //Each frame, do something&lt;br /&gt;        if (e is GameEventFrame)&lt;br /&gt;        {&lt;br /&gt;            //Check if mTime amount of time has passed since the&lt;br /&gt;            //Process started, and if so, the Process is finished. Thus,&lt;br /&gt;            //we go ahead and Kill it.&lt;br /&gt;            if (GetTickCount() - mTimeStart &gt;= mTime)&lt;br /&gt;            {&lt;br /&gt;                Kill();&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Simple, yea?  You can make a bunch of little Processes just like that one which perform small pieces of functionality, and then those pieces can be combined to form bigger Processes that perform much larger tasks until, eventually, you can run the entire game through a series of well put-together Processes.&lt;br /&gt;&lt;br /&gt;I've bombarded you with enough code for now.  Next time I get on this topic, I'll talk about the top-level Process and how we actually put these Processes together.  You'll be surprised at its elegance.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30715094-115938119713409125?l=geekophiliac.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekophiliac.blogspot.com/feeds/115938119713409125/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30715094&amp;postID=115938119713409125' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30715094/posts/default/115938119713409125'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30715094/posts/default/115938119713409125'/><link rel='alternate' type='text/html' href='http://geekophiliac.blogspot.com/2006/09/process-management-basic.html' title='Process Management: Basic Implementation'/><author><name>Brian Sowers</name><uri>http://www.blogger.com/profile/04735666528079624327</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30715094.post-115919885346305143</id><published>2006-09-25T11:23:00.000-04:00</published><updated>2006-09-25T11:40:53.756-04:00</updated><title type='text'>Engine Architecture</title><content type='html'>The big picture of major game engine design has always been somewhat elusive to me.  I previously explained how I view it as an operating system, but that analogy of course is not always appropriate.  Entity management, complex environments, and collision/physics all serve to make the problem unique.&lt;br /&gt;&lt;br /&gt;Yesterday, I realized I was trying to abstract far too many things away, which ultimately gave me inadequate control over my system or spawned technical 'solutions' that were less than stellar.  One of my biggest problems was that of managing my scene with all its various entities moving around and GUI elements.&lt;br /&gt;&lt;br /&gt;Initially, I tried to have one generic SceneManager which kept a list of Drawable objects and would handle drawing them accordingly in a very naive fashion.  I would keep a separate World or Level object to control the various entity interactions.  This tightly coupled two subsystems to the Drawables and did not provide me with much flexibility over how they should be drawn.  Lately, I've been seeing that I need to merge the two - I need one master Scene object which would handle both entity interactions and drawing the entities.  Having a much fuller knowledge of the entities, it can provide certain optimizations and give greater flexibility.  Of course, it doesn't come without cost - it's a lot less generic and becomes a lot less reusable, which is why I'm still very hesitant about switching.&lt;br /&gt;&lt;br /&gt;Another implication of this is that I have to split my GUI and Scene information.  Again, before, I could just shove everything into the SceneManager including GUI widgets, since it was responsible for drawing and nothing else.  But this requires special, non-general information in the Drawable class to differentiate between those objects which must move with the scene and those that must not.  An ugly hack, basically - one which I didn't need when I was using OpenGL because I could rely on the matrix stack to handle these problems, but now that I'm using XNA's 2D functionality, it becomes essential.&lt;br /&gt;&lt;br /&gt;I still haven't settled on the merge of SceneManager and World.  It seems cleaner in some respects but less robust in others.  I think I'm just going to have to play with both methods more until I settle on one.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30715094-115919885346305143?l=geekophiliac.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekophiliac.blogspot.com/feeds/115919885346305143/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30715094&amp;postID=115919885346305143' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30715094/posts/default/115919885346305143'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30715094/posts/default/115919885346305143'/><link rel='alternate' type='text/html' href='http://geekophiliac.blogspot.com/2006/09/engine-architecture.html' title='Engine Architecture'/><author><name>Brian Sowers</name><uri>http://www.blogger.com/profile/04735666528079624327</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30715094.post-115898239181399869</id><published>2006-09-22T22:57:00.000-04:00</published><updated>2006-09-22T23:33:11.923-04:00</updated><title type='text'>Process Management</title><content type='html'>When developing my games, I find it convenient to perceive a game much like an operating system.  Both have many things in common - they both have a centralized kernel (or core), they have strict performance requirements which must be met in real-time, they must manage myriad resources, and they both have a series of loosely coupled processes to perform various tasks.&lt;br /&gt;&lt;br /&gt;In operating systems, process management has been very thoroughly researched.  Resource allocation, scheduling, concurrency, intercommunication - all of these things have been studied to for years.&lt;br /&gt;&lt;br /&gt;In video game development, process management is not so well understood.  If you talk to ten different people about how to manage the state of a game, you will get ten different management strategies.  And I've never been presented with one I liked.  Until I looked at operating systems.&lt;br /&gt;&lt;br /&gt;I prefer to handle my game states with a process tree.  That is, I have a series of processes that each have some small, indivisible task to perform.  Each process can have any number of children and each one has its own resources.  A process has full control over its children - it can add, kill, or manipulate them at leisure, but a process can not manipulate its ancestors or siblings.  Most importantly, each process can receive and handle system events however necessary.&lt;br /&gt;&lt;br /&gt;Part of what differentiates this system from an operating system process is that these processes can only respond to events - they are not always running concurrently in the background.  In this respect, they moreso resemble interrupt handlers.  I prefer to think of them as processes though, since they can have children and they have a large influence over the state of the system.  Also, my processes are unprioritized; in operating systems you can assign a process a priority to determine how often it executes and you can also give processes fixed time limits before they must give up control, but in my system each process is guaranteed to receive every event it is interested in and can perform its operation in full before giving up control.&lt;br /&gt;&lt;br /&gt;Intercommunication between game processes is done through typical event passing.  Thus it is, by its nature,  asynchronous and non-blocking.  Further, since processes are guaranteed to finish executing without interruption, we do not have to worry about race conditions.  However, I could easily envision an advancement for multicore architectures where processes could run with true concurrency - increasing performance, but potentially complicating the system.&lt;br /&gt;&lt;br /&gt;That's most of the introductory material for this system.  I've implemented it for past C++ games, and I've finished migrating it to my XNA projects.  Over the course of the next few posts, I will probably go more in depth discussing implementation details and example usage.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30715094-115898239181399869?l=geekophiliac.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekophiliac.blogspot.com/feeds/115898239181399869/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30715094&amp;postID=115898239181399869' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30715094/posts/default/115898239181399869'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30715094/posts/default/115898239181399869'/><link rel='alternate' type='text/html' href='http://geekophiliac.blogspot.com/2006/09/process-management.html' title='Process Management'/><author><name>Brian Sowers</name><uri>http://www.blogger.com/profile/04735666528079624327</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30715094.post-115879192914557159</id><published>2006-09-20T18:23:00.000-04:00</published><updated>2006-09-20T18:38:49.166-04:00</updated><title type='text'>Porting to XNA</title><content type='html'>I made the decision to port a lot of my framework over to XNA, and it's progressing remarkably smoothly.  I don't have any fancy graphics on the screen, but I do have my process tree and event management systems in.  I was also easily able to switch from input polling to input event passing, with the next step being abstracting things out a little bit further so that I can switch between the XBox controller and the keyboard seemlessly.  Not a hard modification, but not a fun one either.&lt;br /&gt;&lt;br /&gt;I've been trying really hard to avoid some of my C++ methods while writing in C#.  Reflection is helping a lot, and I've practically eliminated a lot of unsafe type casting.  My event management system has become a &lt;span style="font-style: italic;"&gt;whole lot&lt;/span&gt; cleaner, but I will admit that it does not adhere to the common C# practice involving the use of delegates.  Though I had legitimate reasons for doing this, it still feels a bit dirty.&lt;br /&gt;&lt;br /&gt;I did buckle and introduce the Singleton in my code.  I had great reservations about doing this - it's regarded by many as an anti-pattern for good reason - but a whole lot of my modules need access to core modules, and it would be cumbersome (and in many cases illogical) to pass those modules around to make sure they get where they're needed.  I'm still looking for a better way, but until I do I'm hoping that I will not have reason to regret my decision.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30715094-115879192914557159?l=geekophiliac.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekophiliac.blogspot.com/feeds/115879192914557159/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30715094&amp;postID=115879192914557159' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30715094/posts/default/115879192914557159'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30715094/posts/default/115879192914557159'/><link rel='alternate' type='text/html' href='http://geekophiliac.blogspot.com/2006/09/porting-to-xna.html' title='Porting to XNA'/><author><name>Brian Sowers</name><uri>http://www.blogger.com/profile/04735666528079624327</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30715094.post-115863523260352838</id><published>2006-09-18T23:04:00.000-04:00</published><updated>2006-09-18T23:08:52.366-04:00</updated><title type='text'>StreamParser</title><content type='html'>Here is a simple utility class designed to mimic Java's Scanner class for the purpose of reading in files.  It can be easily expanded to be more generic,  but for my purposes confining it to reading files is sufficient.&lt;br /&gt;&lt;br /&gt;&lt;style type="text/css"&gt;.cf { font-family: Courier New; font-size: 8pt; color: black; background: white; font-weight: bold; }.cl { margin: 0px; }.cb1 { color: blue; font-weight: normal; }.cb2 { font-weight: normal; }&lt;/style&gt;&lt;div class="cf"&gt;&lt;p class="cl"&gt;&lt;span class="cb1"&gt;public&lt;/span&gt; &lt;span class="cb1"&gt;class&lt;/span&gt; StreamParser&lt;/p&gt;&lt;p class="cl"&gt;{&lt;/p&gt;&lt;p class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;public&lt;/span&gt; StreamParser(&lt;span class="cb1"&gt;string&lt;/span&gt; fileName)&lt;/p&gt;&lt;p class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;using&lt;/span&gt; (StreamReader streamReader = &lt;span class="cb1"&gt;new&lt;/span&gt; StreamReader(fileName))&lt;/p&gt;&lt;p class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; mData = streamReader.ReadToEnd();&lt;/p&gt;&lt;p class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; mTokens = mData.Split(mDelimiters);&lt;/p&gt;&lt;p class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p class="cl"&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;public&lt;/span&gt; &lt;span class="cb1"&gt;string&lt;/span&gt; NextString()&lt;/p&gt;&lt;p class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; mCurrToken++;&lt;/p&gt;&lt;p class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;return&lt;/span&gt; mTokens[mCurrToken];&lt;/p&gt;&lt;p class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p class="cl"&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;public&lt;/span&gt; &lt;span class="cb1"&gt;int&lt;/span&gt; NextInt()&lt;/p&gt;&lt;p class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; mCurrToken++;&lt;/p&gt;&lt;p class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;return&lt;/span&gt; &lt;span class="cb1"&gt;int&lt;/span&gt;&lt;span class="cb2"&gt;.Parse(mTokens[mCurrToken]);&lt;/span&gt;&lt;/p&gt;&lt;p class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p class="cl"&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;public&lt;/span&gt; &lt;span class="cb1"&gt;float&lt;/span&gt; NextFloat()&lt;/p&gt;&lt;p class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; mCurrToken++;&lt;/p&gt;&lt;p class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;return&lt;/span&gt; &lt;span class="cb1"&gt;float&lt;/span&gt;&lt;span class="cb2"&gt;.Parse(mTokens[mCurrToken]);&lt;/span&gt;&lt;/p&gt;&lt;p class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p class="cl"&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;public&lt;/span&gt; &lt;span class="cb1"&gt;double&lt;/span&gt; NextDouble()&lt;/p&gt;&lt;p class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; mCurrToken++;&lt;/p&gt;&lt;p class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;return&lt;/span&gt; &lt;span class="cb1"&gt;double&lt;/span&gt;&lt;span class="cb2"&gt;.Parse(mTokens[mCurrToken]);&lt;/span&gt;&lt;/p&gt;&lt;p class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p class="cl"&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;private&lt;/span&gt; &lt;span class="cb1"&gt;bool&lt;/span&gt; HasNext()&lt;/p&gt;&lt;p class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;if&lt;/span&gt; (mCurrToken &amp;gt;= mTokens.Length)&lt;/p&gt;&lt;p class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;return&lt;/span&gt; &lt;span class="cb1"&gt;false&lt;/span&gt;;&lt;/p&gt;&lt;p class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;else&lt;/span&gt;&lt;/p&gt;&lt;p class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;return&lt;/span&gt; &lt;span class="cb1"&gt;true&lt;/span&gt;;&lt;/p&gt;&lt;p class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p class="cl"&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;private&lt;/span&gt; &lt;span class="cb1"&gt;string&lt;/span&gt; mData;&lt;/p&gt;&lt;p class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;private&lt;/span&gt; &lt;span class="cb1"&gt;string&lt;/span&gt;[] mTokens;&lt;/p&gt;&lt;p class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;private&lt;/span&gt; &lt;span class="cb1"&gt;char&lt;/span&gt;[] mDelimiters = &lt;span class="cb1"&gt;new&lt;/span&gt; &lt;span class="cb1"&gt;char&lt;/span&gt;[] { ' ', '\n', '\t' };&lt;/p&gt;&lt;p class="cl"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="cb1"&gt;private&lt;/span&gt; &lt;span class="cb1"&gt;int&lt;/span&gt; mCurrToken = -1;&lt;/p&gt;&lt;p class="cl"&gt;}&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30715094-115863523260352838?l=geekophiliac.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekophiliac.blogspot.com/feeds/115863523260352838/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30715094&amp;postID=115863523260352838' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30715094/posts/default/115863523260352838'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30715094/posts/default/115863523260352838'/><link rel='alternate' type='text/html' href='http://geekophiliac.blogspot.com/2006/09/streamparser.html' title='StreamParser'/><author><name>Brian Sowers</name><uri>http://www.blogger.com/profile/04735666528079624327</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30715094.post-115853131022669466</id><published>2006-09-17T18:04:00.000-04:00</published><updated>2006-09-17T18:15:10.263-04:00</updated><title type='text'>C# File Reading</title><content type='html'>In writing my tile map class for a map editor/Parodica, I ran into a nifty little quirk of .NET: there's no clean way to read numbers from files.&lt;br /&gt;&lt;br /&gt;In C++, the process is pretty painless.  ifstream is designed in such a way that it will seemlessly parse strings, ints, floats, or even your own user defined types.  In C#, the process is not so straight forward.  First you have to read the file in as a string and then you have to tokenize it and then you have to convert those string tokens into the appropriate data types.  Not only is this less efficient, but it's also just plain ugly.&lt;br /&gt;&lt;br /&gt;I can't imagine why there was such an oversight.  My only guess is that the .NET language designers envisioned a world where everyone was using XML to store data.  But I'll contend - to my grave - that XML is &lt;span style="font-style: italic;"&gt;not&lt;/span&gt; the best option here since it is not really suitable for storing large arrays of data and it's overkill since my data is in no way heirarchical.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30715094-115853131022669466?l=geekophiliac.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekophiliac.blogspot.com/feeds/115853131022669466/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30715094&amp;postID=115853131022669466' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30715094/posts/default/115853131022669466'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30715094/posts/default/115853131022669466'/><link rel='alternate' type='text/html' href='http://geekophiliac.blogspot.com/2006/09/c-file-reading.html' title='C# File Reading'/><author><name>Brian Sowers</name><uri>http://www.blogger.com/profile/04735666528079624327</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30715094.post-115830499170420392</id><published>2006-09-15T01:49:00.000-04:00</published><updated>2006-09-15T03:23:11.896-04:00</updated><title type='text'>The Duelist Goes Gold!</title><content type='html'>&lt;a href="http://www.experimentalgameplay.com/game.php?g=259"&gt;It is done&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I had a lot of fun and a fair number of sleep-deprived nights developing this game.  I've already provided a full post-mortem, but here are a few addendums:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Polish is What Separates Indy from Pro&lt;br /&gt;&lt;/span&gt;I could think of 100 things to add to this game.  A few more minigames, a few tweaks, an extra game mode or two, some more intermediary screens, extra graphical effects and flare, and a bit more polish.  And while I was thinking of all the stuff I would have to leave out because of time, I realized that this is what differentiates the professional games from the small hobby games - those little graphical effects &lt;span style="font-style: italic;"&gt;count&lt;/span&gt;, and those extra game modes had better be there, and that content better show up.&lt;br /&gt;If your game has a lot of depth, people will appreciate that and keep finding ways to have fun.  I tossed in about as much as I could get around to, and I think my entry shines a little because of that.&lt;span style="font-style: italic;"&gt;&lt;span style="font-style: italic;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Fonts Suck&lt;/span&gt;&lt;br /&gt;Seriously.  I tolerated sub-standard graphics in a few instances because (a) I'm not an artist and (b) I'm not a good photo editor and (c) I didn't have time to fool around with that nonsense.  But the original font looked prohibitively bad.  The second font was unreadable.  The third font was not displaying well as a series of textured quads in OpenGL.  The fourth font was, again, not readable.  I finally got it decent on the fifth font - not pretty, but decent.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;I'm Terrible at Guitar&lt;/span&gt;&lt;br /&gt;Even if I win and even if I get an internship at RedOctane, they'll never let me get &lt;span style="font-style: italic;"&gt;near&lt;/span&gt; Guitar Hero because of the insult I bring to the instrument.  I spent so much time trying to get decent music, and eventually I buckled and used a synth program for 50% (read: 1 out of 2) of my tracks.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Data Driven Systems Rock Hard&lt;span style="font-style: italic;"&gt;&lt;span style="font-style: italic;"&gt;&lt;span style="font-style: italic;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;I didn't stress this enough in my post-mortem.  It got to the point where to add things in later in the game, I didn't have to look at the code anymore - I just banged together a few text files and I was ready to rock.&lt;span style="font-style: italic;"&gt;&lt;span style="font-style: italic;"&gt;&lt;span style="font-style: italic;"&gt;&lt;span style="font-style: italic;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;I still looked at the code, of course - there was constant tweaking and editing and cleaning up - but none of that was related to adding content.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Event Driven Systems Rock Hard Too&lt;br /&gt;&lt;/span&gt;I've reemphasized this &lt;span style="font-style: italic;"&gt;over and over&lt;/span&gt; on this blog, and I'm going to do that again.  Nothing satisfies me more than the level of sophistication that introducing event management has added to my code.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&lt;/span&gt;&lt;span style="font-style: italic;"&gt;&lt;span style="font-style: italic;"&gt;Memory Management Systems Rock Hard... Three&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;I remember a day when I used to argue with pointers - when memory leaks and seg faults were common and hard to track down.  When a man could run his program and be almost certain that it would crash at some point, even if that point took some time to get to.&lt;span style="font-style: italic;"&gt;&lt;span style="font-style: italic;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;And then I look back and wonder why the hell I hadn't implemented a Smart Pointer.  It has to be one of the most beneficial additions that I curse myself for not adding to my C++ games sooner.  By no means is it the end-all solution to memory management, but it certainly alleviates 90% of all memory-related headaches.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Writing Things Quickly is Nice, but Writing Them Good is Better&lt;br /&gt;&lt;/span&gt;There were a few times when I was tempted to put a quick, dirty hack into my code to get something to work.  I always argued with myself, and I won't lie - in one or two instances, that hack made it into the code.  But for the large majority of cases, I resisted the urge, and I'm glad I did.&lt;br /&gt;Hacking typically makes things complicated.  Debugging gets complicated and understanding code gets complicated and sometimes even writing the hack itself is complicated.  And in the end, you've caused more problems then the hack was intended to solve.&lt;br /&gt;Because I avoided adding craziness to my code, it was a lot easier to maintain.  Bugs were less frequent and easier to find, and everything just seemed prettier.  Had I tried to rush through the development, I could have very easily backed myself into a wall that just required more hacks to get around until eventually adding a simple feature took forever.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;When You're Not Coding, You're Thinking About It&lt;br /&gt;&lt;/span&gt;Programming is interesting in that it often does not require you to be programming.  There were times when I was fed up with looking at my laptop and needed to get away, and so I took a walk or went to the local coffee shop to heckle baristas.  And what was I really doing?&lt;br /&gt;Working out code in my head.  Working out logic and conditions and requirements.  And when I finally got back to my computer, I had the problem so thought-out that I could bang out a solution - a process which, comparatively, takes a much shorter amount of time than thinking through the problem.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Thinking Is No Substitution for Development&lt;br /&gt;&lt;/span&gt;This runs somewhat in contrast to my point above.  Sometimes I could spend a little too much time at that coffee shop.  There comes a point when just thinking is too appealing, and you have to force yourself in front of that computer to start typing.  And you have to cut off distractions and resist the urge to 'get up and think some more.'  In the end, that code has to get written somehow.  While you can work out a lot of problems away from the computer, and it can definitely be a welcome change, you'll invariably work out a &lt;span style="font-style: italic;"&gt;lot more&lt;/span&gt; when you're actually in the thick of it - creating, debugging, testing, and creating some more.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Finish the Game&lt;br /&gt;&lt;/span&gt;It's easy to leave a game in a half-finished state.  Neglecting content or leaving obvious deficiencies is tempting sometimes.  Hell, I nearly called that font 'finished' at iteration 3 - something which would have clearly hurt me.  My game nearly lacked a lot of player feedback which, during testing, I found to be essential to actually playing the game.  But they were glaring flaws, and if I wanted any chance of a halfway decent game, they had to be fixed.  It's easy to call something 'good enough,' but you &lt;span style="font-style: italic;"&gt;must &lt;/span&gt;determine if it's &lt;span style="font-style: italic;"&gt;actually&lt;/span&gt; good enough before you call your game finished.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Finish the Game, I Said&lt;br /&gt;&lt;/span&gt;There's a point in development when you realize that your game isn't going to get much better than it is with the time you have left.  At this point, it's time to say enough is enough and focus more on tweaking, testing/debugging, and general polish than on cramming in a few half-finished twiddly bits.&lt;span style="font-style: italic;"&gt;  &lt;/span&gt;Near the end of development, I was tinkering with the idea of adding a new duel type or two, but I knew I couldn't get them up to par and still have time to &lt;span style="font-style: italic;"&gt;fix that damn font&lt;/span&gt;.  So I focused on what was important - making my game more presentable and polished.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Make Hundreds of Friends&lt;br /&gt;&lt;/span&gt;I can't possibly bring this across more clearly - the people I know are the reason this game got finished.  When I was looking for confirmation that my idea had merit, I needed only to look at a comment left on this very blog.  When I realized that I couldn't possibly make 20 different high-quality images for the various duelists, my friends were there to back me up and in the process embarrass themselves a bit by being featured in the game.&lt;span style="font-style: italic;"&gt;  &lt;/span&gt;When I was scrambling for a method to create music, my roommate helped me out by letting me use his amp and electric guitar (which didn't actually make it into the game).  When I needed expert opinions, I had a friend I could count on to playtest and tell me where I needed improvement, not hesitating to put me in my place when something sucked.  When I needed uplifting or motivating, I could send a screenshot over to someone and get a "that's awesome." &lt;br /&gt;&lt;span style="font-style: italic;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Don't Reinvent the Wheel, and Don't Use Square Wheels&lt;br /&gt;&lt;/span&gt;Writing your own linked list is great for learning purposes, but the STL's list is &lt;span style="font-style: italic;"&gt;usually&lt;/span&gt; just as good or even better.  Creating your own window is fine, but SDL can do the same thing in about 1/50th the lines of code.  DirectSound/DirectMusic may be a great technology, but FMOD is quick and easy.&lt;br /&gt;There a bunch of tools to help you with any job, and you should use the right tool for the right job.  In my case, the job was 'finish a small game quick and make it as good as possible.'  Obviously, if there was something that could do the same job in less time and fit all my needs, I wanted to use it.&lt;span style="font-style: italic;"&gt;&lt;/span&gt;&lt;span style="font-style: italic;"&gt;&lt;/span&gt;  I didn't need that extra 1% speed boost or the low level control that some libraries provide.  So why spend more time to get it when I could spend that time making the game?&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Keep That Toolbox Big&lt;br /&gt;&lt;/span&gt;Using glut was not the right decision from the start.  It just didn't work properly with the pad.  I had to change solutions, and I couldn't waste time moping.  Luckily, I knew enough about SDL to switch over relatively painlessly, and if SDL didn't work out, I knew how to create my own windows and use DirectInput.&lt;br /&gt;The point here is this: if I only knew glut, I would've been finished before I even started.  I knew enough that if one solution failed me, I had backups.  With everything from graphics to sound, I had alternatives available.  This is good and should be practiced whenever possible.  And if you find out that what you know isn't working but you don't know an alternative, hopefully you're good enough to pick up new technologies fast.&lt;br /&gt;&lt;br /&gt;Wow, I think this might have turned out longer than the original post-mortem.  I hope I provided some useful information.  I could keep going on, but this has already taken me quite a long time to write.&lt;br /&gt;&lt;br /&gt;So I'll wrap this up with these short words:&lt;br /&gt;&lt;a href="http://www.experimentalgameplay.com/game.php?g=259"&gt;Play the game&lt;/a&gt;.  Have fun.  I was pleased with how it turned out, and I had a great time making it.  I hope you enjoy it. &lt;br /&gt;&lt;span style="font-style: italic;"&gt;&lt;/span&gt;&lt;span style="font-style: italic;"&gt;&lt;/span&gt;&lt;span style="font-style: italic;"&gt;&lt;span style="font-style: italic;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30715094-115830499170420392?l=geekophiliac.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekophiliac.blogspot.com/feeds/115830499170420392/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30715094&amp;postID=115830499170420392' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30715094/posts/default/115830499170420392'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30715094/posts/default/115830499170420392'/><link rel='alternate' type='text/html' href='http://geekophiliac.blogspot.com/2006/09/duelist-goes-gold.html' title='The Duelist Goes Gold!'/><author><name>Brian Sowers</name><uri>http://www.blogger.com/profile/04735666528079624327</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30715094.post-115813474279114538</id><published>2006-09-13T03:32:00.000-04:00</published><updated>2006-09-13T04:05:42.800-04:00</updated><title type='text'>Web Comics Day 7: A Miracle of Science</title><content type='html'>It seems as though many of the comics I've talked about have some defining criteria that deviates themselves from the rest, and &lt;a href="http://www.project-apollo.net/mos/"&gt;A Miracle of Science&lt;/a&gt; continues this trend by being one of the few comics I read that actual focuses on the telling of a single, mostly serious story from start to finish.  It's also the only sci-fi offering among the pack.&lt;br /&gt;&lt;br /&gt;AMOS follows the story of Benjamin Prester and Caprice Quevillion, two police officers trekking through the galaxy on the trail of a genuine mad scientist named Haas.  Along the way, we are witness to relevations on Benjamin's past, the growing bond between Benjamin and Caprice, and Haas's maniacism as he succumbs to the disease which makes him a mad scientist.&lt;br /&gt;&lt;br /&gt;The creators really go a long way in the telling of a story, creating an emotional pull toward the characters and their actions.  Everything flows smoothly and progresses the story along.  The various story arcs are all well put together and all contribute to a solid whole.&lt;br /&gt;&lt;br /&gt;The characters making up this story are all great.  Despite having a cliche romance between the two partners, the two play off each other really well and things never get corny.  Haas is also a spectacle as we watch his plans unfold.  Even the supporting cast, from Prester's captain to Haas robot assistants, all have unique qualities that make them endearing in some fashion.&lt;br /&gt;&lt;br /&gt;There are flaws, of course.  The art is nothing to write home about, even when such writing can travel instantaneously via our World Wide Web.  It's not horrible and never detracts from the action, but it typically doesn't add much (there are some notable exceptions in a few panels). &lt;br /&gt;&lt;br /&gt;When I said there were flaws, I lied - there's just the one.&lt;br /&gt;&lt;br /&gt;Overall, the comic is excellent.  The story is rapidly approaching the finale, so I advise you &lt;a href="http://www.project-apollo.net/mos/"&gt;catch up quick&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30715094-115813474279114538?l=geekophiliac.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekophiliac.blogspot.com/feeds/115813474279114538/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30715094&amp;postID=115813474279114538' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30715094/posts/default/115813474279114538'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30715094/posts/default/115813474279114538'/><link rel='alternate' type='text/html' href='http://geekophiliac.blogspot.com/2006/09/web-comics-day-7-miracle-of-science.html' title='Web Comics Day 7: A Miracle of Science'/><author><name>Brian Sowers</name><uri>http://www.blogger.com/profile/04735666528079624327</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30715094.post-115800468579751421</id><published>2006-09-11T15:36:00.000-04:00</published><updated>2006-09-11T15:58:06.140-04:00</updated><title type='text'>The Duelist: Continued</title><content type='html'>I posted a post-mortem for The Duelist not 24 hours before they &lt;span style="font-style: italic;"&gt;extended the deadline&lt;/span&gt;.  I'm not too happy about this, not because I prematurely posted a post-mortem, but because I'm ready to be done with this game.  I have other things I want to focus on (XNA, Parodica, &lt;a href="http://www.cs.cmu.edu/%7Ebaraff/"&gt;David Baraff's&lt;/a&gt; papers on physically based modeling, Half-Life 2 modding, C#), but I can't just sit idly and not do anything with an entire week.  So, yet again, XNA &amp; Parodica updates are put on temporary hold until (hopefully) the end of the week.&lt;br /&gt;&lt;br /&gt;But this did cause me to think of an area where event passing clearly wins over input polling.  The dance pads didn't arrive until late - over a full week into the competition for me and longer for others.  Thus, I found it necessary to begin development without the pads.  As I mentioned in my post-mortem, this was good because it allowed me to get a head start and also made debugging a great deal faster.&lt;br /&gt;&lt;br /&gt;When the pad arrived, I needed to integrate it quickly.  Had I used polling I would've needed to find every instance where I polled for input and retro-fitted it to poll for and handle joystick input as well.  Not only tedious, but error prone and code-uglifying.  But since I was using event management, I needed to make a change in one place - I simply incorporated a 'joystick translator' that took joystick inputs, converted them to the appropriate keyboard characters I was already using for input, and then sent that through the event system as though they were keyboard events.  It was clean, it was elegant, and it was easy.&lt;br /&gt;&lt;br /&gt;Ideally, it's not the &lt;span style="font-style: italic;"&gt;most&lt;/span&gt; elegant solution.  Since my code is bound to the keyboard keys, it makes remapping keys (to user preferences) difficult.  A better route would have been to translate both keyboard keys and joystick input into a common 'game action' type of event, which could easily be remapped as the user wanted.  But my solution works well enough for these purposes.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30715094-115800468579751421?l=geekophiliac.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekophiliac.blogspot.com/feeds/115800468579751421/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30715094&amp;postID=115800468579751421' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30715094/posts/default/115800468579751421'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30715094/posts/default/115800468579751421'/><link rel='alternate' type='text/html' href='http://geekophiliac.blogspot.com/2006/09/duelist-continued.html' title='The Duelist: Continued'/><author><name>Brian Sowers</name><uri>http://www.blogger.com/profile/04735666528079624327</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30715094.post-115770359074796529</id><published>2006-09-08T02:59:00.000-04:00</published><updated>2006-09-08T04:19:50.953-04:00</updated><title type='text'>The Duelist: Post-Mortem</title><content type='html'>The Duelist is nearly complete.  All that's left is some AI programming, sound implementation, and the addition of a little bit of content.  I &lt;span style="font-style: italic;"&gt;should&lt;/span&gt; be doing all of that right now since the deadline is in about 24 hours.  However, I've decided to take a small break to write a summary of my experiences while creating the game.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The Evolution of the Idea&lt;/span&gt;&lt;br /&gt;The original concept for The Duelist was embarrassingly simple.  It consisted of a Simon-like game where two players would go back and forth hitting a constantly growing series of steps until a player messed up.  You might recognize this as the Mind Hack duel technique that went into the final design.&lt;br /&gt;&lt;br /&gt;I quickly realized that the idea was too shallow.  It &lt;span style="font-style: italic;"&gt;might&lt;/span&gt; be fun for five or ten minutes, but more was needed.  Thinking of more was a struggle.  It hit me in the shower sometime.  Why not make a bunch of simple little games where players could face off against each other? &lt;br /&gt;With the right dynamic, this could be a lot of fun.  At the very least, you could trash talk with your friends.&lt;br /&gt;&lt;br /&gt;The minigame ideas came relatively quickly.  I wanted them to be simple, fast, and fun.  I wanted the players to constantly be moving (so long as that was possible), and I wanted things to be varied enough that things didn't stagnate too quickly.  However, I also wanted things to be &lt;span style="font-style: italic;"&gt;simple&lt;/span&gt; - no complicated art, little complicated programming.  With these requirements in mind, it wasn't long before I had my original set of 6 games.&lt;br /&gt;&lt;br /&gt;And then I hit a snag.  Again, the idea seemed a little bit too shallow.  &lt;span style="font-style: italic;"&gt;Just&lt;/span&gt; multiplayer?  &lt;span style="font-style: italic;"&gt;Just &lt;/span&gt;a minigame at a time?  No, I wasn't happy with any of that.  So I started slamming my head against the ceiling (a difficult task considering the height of our ceiling) trying to think of more to add.&lt;br /&gt;&lt;br /&gt;In parallel to doing all of this, I was working my way through Revolutionary Girl Utena - an anime where a high school student has duels with her peers for, well, the reason isn't important (and it's awfully weird and ruins the street cred I have built up).  Further, I was thinking a &lt;span style="font-style: italic;"&gt;lot&lt;/span&gt; about telekinesis.  I had also watched Volcano High a few weeks prior, where school students fight each other with super powers.&lt;br /&gt;&lt;br /&gt;And - again, in the shower (I spend a lot of time in there) - I came up with my idea.  The player would be a student attending a university where the only way to graduate would be to beat everyone in telekinetic duels.  The duels would be setup in multiple turns, where each turn would be a minigame (or, to follow our theme, would be a battle in a certain telekinetic technique).  Players win by winning three more duels than their opponents have won.  That is to say, it's not a 'best out of 5' system where one player can just barely win; you have to clearly come out on top to be proven the victor.  Thus, there can be a bit of a struggle to come out on top.  To top that off, when the player isn't dueling, he can go around the university and talk to the students.&lt;br /&gt;&lt;br /&gt;I had my idea, and I was happy with it.  Now to submit it and hope.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Course of Development&lt;/span&gt;&lt;br /&gt;The first week went &lt;span style="font-style: italic;"&gt;slow&lt;/span&gt;.  I spent most of my time waiting for the DDR pad to arrive.  I could have easily setup a temporary solution wherein I use keyboard keys for input.  But I didn't.  I was stubborn and wanted to wait, and thus I burned a lot of time here.  In lieu of programming actual content, I built up my framework and made sure everything was bug-free.&lt;br /&gt;&lt;br /&gt;The second week went somewhat better.  Realizing that the pad may come the very last day, I decided it would be best if I went ahead and implemented the temporary solution.  In retrospect, this was a great idea - not only did it make testing &lt;span style="font-style: italic;"&gt;much&lt;/span&gt; easier, but it was easily convertible when the pad arrived (in fact, when I did finally get my pad, I just mapped the pad buttons to keyboard keys and kept the same code in place).  I got a quick proof-of-concept minigame working and setup the infrastructure that would allow easy university navigation.  I also came to one very grim realization.&lt;br /&gt;&lt;br /&gt;I'm not an artist.  My friends know this.  Anyone who's ever visited any of my sites know this.  I knew this, but I ignored it. The game required art - a pretty sizeable amount.  I bought a sketch book prior to being accepted and started practicing the craft more heavily.  But when it finally came to content generation, I knew I wasn't going to cut it - my drawings looked bad and took too long to produce.  A compromise needed to be made.&lt;br /&gt;&lt;br /&gt;The compromise was actually pretty straight-forward.  My game takes place in a university.  Why not take pictures of actual people, apply some fancy image filters, and let those be the graphics?  That just leaves me with some simple GUI stuff and the buildings, which I could create easily enough using Google Sketchup.&lt;br /&gt;&lt;br /&gt;The third week is when everything came together and I kicked myself into high gear.  I got the code functionally complete - it was missing some of the bells &amp; whistles I would've liked, but it &lt;span style="font-style: italic;"&gt;was&lt;/span&gt; a recognizable game.  I got pictures of my friends and doctored them for in-game use, and I made the scenery that the game would take place in.  My time was being juggled between content generation and intense coding, and surprisingly everything was going relatively smoothly.&lt;br /&gt;&lt;br /&gt;Strangely enough, most of the game came together in the last few days.  There was a lot there before that, but it wasn't recognizable as a cohesive whole; there were just a series of fragmented pieces waiting to be glued together.  It took a lot of work and a few late nights, but I was able to get most everything together.&lt;br /&gt;&lt;br /&gt;When it was finally over, I had actually done pretty well.  I did have to cut one of my listed features (multiplayer using only 1 pad) because I failed to make my code in such a way that it would be as easy to implement as I had hoped.  But I was also able to add one extra minigame and get things looking pretty good.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;What Went Right&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;The Framework&lt;/span&gt;&lt;br /&gt;I'm happy with my framework.  I've got this great process manager that helps me write some very modular, very robust code that's easy to modify and tweak as I go.  I've also got a nice event passing mechanism.  With these systems in place, I was able to quickly see the results of my development, and I was able to quickly track down and edit bugs.  I won't say it's the greatest system around, but for small games, it's definitely handy.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;The People&lt;/span&gt;&lt;br /&gt;I was a bit hesitant to ask people if they'd want their picture in the game.  In the end, most everyone seemed excited about it.  I'm really glad they helped out - the game wouldn't look anywhere near as decent without them.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Memory Management&lt;/span&gt;&lt;br /&gt;I remember a time before I coded a Smart Pointer class, and I remember how many memory leaks and problems this caused.  Even with it there, things weren't flawless.  I'm to the point where I just don't enjoy wrestling pointers anymore.  Truth be told, the XNA Framework came out mid-development, and I was tempted to port everything over to it just to get that automatic memory management.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;The Concept&lt;/span&gt;&lt;br /&gt;I like my game idea.  I think there was a lot of potential for fun there (even more than I managed to bring out), and the general simplicity really helped to move things along.  I could see results fast, and I never really got bogged down in my code.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Data-Driven Development&lt;/span&gt;&lt;br /&gt;I setup my game in such a way where I could drop in a few text files and immediately see changes to the course of the game.  This is &lt;span style="font-style: italic;"&gt;essential&lt;/span&gt;.  There's nothing worse than having to go in and change your code every time you want to see something change in your game.  Having the ability to edit a few files and immediately see the changes makes things go orders of magnitude faster, and it feels a whole lot easier.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;What Went Wrong&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Time Management&lt;/span&gt;&lt;br /&gt;I could've spent my first week a lot better, and even that second week could've been more productive.  This lead to me feeling pretty rushed near the end, which is both good and bad - good because I got a lot done and my mind was in the constant 'game development mindset', but bad because I had a few really late nights.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Feature Creep&lt;/span&gt;&lt;br /&gt;I'm not talking about 'feature creep' in the sense that I kept thinking of features I wanted to add.  I'm talking about feature creep in the sense that I kept thinking of features I &lt;span style="font-style: italic;"&gt;needed&lt;/span&gt; to add that I hadn't really accounted for.  Player feedback was the biggest one.  A few of the minigames are noticeably missing in messages to the players - you just see who wins/loses, and you might not be entirely apparent why.  If I had a little more time, this would've been fixed, but other features took priority.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Cut/Unimplemented Features&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&lt;span style="font-style: italic;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;I got really disappointed when I realized that I would have to cut out the 1 pad multiplayer, since it was one of the better features my game advertised.  The game also could've used some more user-friendly features, like a configuration screen or even a credits screen.  In the end, though, this again came down to the time factor - I had to decide what I could implement that gave me the most for the least amount of work.&lt;span style="font-style: italic;"&gt;&lt;span style="font-style: italic;"&gt;&lt;span style="font-style: italic;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;What I Learned&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic;"&gt;I'm Not a Professional Game Developer&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&lt;/span&gt;&lt;/span&gt;I'm not bagging myself or being self-deprecating here.  There is one fundamental difference (aside from experience) that separates me from a professional: time.  A professional is paid to work at least (hah) 8 hours a day 5 days a week.  I'm a college student working on a Master's in CS.  I &lt;span style="font-style: italic;"&gt;can't&lt;/span&gt; work that much on a game.  It just isn't possible for me to hold down school, do my job,  and keep the kind of game development schedule I'd like.  So in the end, I have to make compromises on how much time I can spend developing and how much sleep I can bare to lose.&lt;br /&gt;As an aside, I lost a good deal of sleep trying to get this game finished on time.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Event Passing Rules&lt;br /&gt;&lt;/span&gt;This post-mortem has been relatively non-technical thus far, but allow me to say this: communicating between modules via event passing is a really, really nice.  It often allows you to drop modules in or take modules out without anything breaking or needing modified.  It should be a serious consideration for anyone developing a game of any size.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Fighting Distractions is Hard&lt;/span&gt;&lt;br /&gt;If your job isn't game development, you're always making compromises.  But sometimes, the game development has to come first.  And that is when everything else seems to call for your attention.  There's no easy way to get around that - sometimes you just have to tell your friend to shove off or push that school paper aside for a few hours.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;What I Knew and was Happy I Used&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Code Reuse is Your Friend&lt;/span&gt;&lt;br /&gt;I can't stress this enough - make your code reusable.  Break things into functions and modules.  If you find yourself repeating something over and over, it's time to refactor.  I had a great infrastructure to support this, and it saved me a whole lot of time.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Data is Your Friend&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&lt;span style="font-style: italic;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;This goes hand-in-hand with my section on data-driven development.  Make your game as modifiable outside of the game code as humanly possible.  Scripting is good.  Specifying object data with data files is excellent.  You'll be able to swap these in and out quickly, and your game development will move so much faster.  Also, if you want to add the ability to modify your game later, it's a whole lot easier.&lt;span style="font-style: italic;"&gt;&lt;span style="font-style: italic;"&gt;&lt;span style="font-style: italic;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;What I Knew and Shoul've Used&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Get the Right Set of Tools, and if They Aren't Around, Make Them&lt;br /&gt;&lt;/span&gt;Often I'd find myself waist deep in text files trying to make sense of some numbers I used that would break when in some place but would work perfectly other places.  This could've been easily alleviated by slapping together a quick tool.  .NET makes creating a lot of tools trivial.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&lt;/span&gt;&lt;span style="font-style: italic;"&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;Conclusions&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/span&gt;There's a whole lot more to say about The Duelist and game development in general, but it is not for this post-mortem.  In general, I'm happy with the course the development took - I wish I could've used some of my time more effectively, but overall I'm happy with the outcomes.&lt;br /&gt;Now, it's time for me to go put the finishing touches on this.&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30715094-115770359074796529?l=geekophiliac.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekophiliac.blogspot.com/feeds/115770359074796529/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30715094&amp;postID=115770359074796529' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30715094/posts/default/115770359074796529'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30715094/posts/default/115770359074796529'/><link rel='alternate' type='text/html' href='http://geekophiliac.blogspot.com/2006/09/duelist-post-mortem.html' title='The Duelist: Post-Mortem'/><author><name>Brian Sowers</name><uri>http://www.blogger.com/profile/04735666528079624327</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30715094.post-115759363054445901</id><published>2006-09-06T21:35:00.000-04:00</published><updated>2006-09-06T21:47:10.553-04:00</updated><title type='text'>The Duelist: Progress Report</title><content type='html'>XNA development has been postponed until Friday since that is the deadline for The Duelist, and I really have to focus on finishing this.&lt;br /&gt;&lt;br /&gt;My progress on The Duelist has been somewhat mixed.  I burned a &lt;span style="font-style: italic;"&gt;lot&lt;/span&gt; of time in the beginning when I could have been doing meaningful development, and thus I know things aren't as complete as they could be.  However, over the last few days, I've implemented all the minigame ideas and even included an extra one.  Functionally, nearly everything is there - there's still a good bit of tweaking to do, but that's just a process of manipulating the components which already exist.  Artistically, I'm in a lot better shape than I thought I was going to be in - I still need to make a few models and get a few pictures, but things are looking pretty good.  I'm feeling confident that I'll have something decent to show off, and it's going to be one of my better games.&lt;br /&gt;&lt;br /&gt;So here's the schedule until completion:&lt;br /&gt;Tonight I'm editing art assets and putting the final touches on a good deal of the coding, sans AI.&lt;br /&gt;Tomorrow I'm finishing the art and content and implementing all of the AI.&lt;br /&gt;Friday is dedicated entirely to sound generation and implementation.&lt;br /&gt;&lt;br /&gt;And finally, I leave you with a pretty awesome screenshot:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/860/3300/1600/duelistss1.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://photos1.blogger.com/blogger/860/3300/320/duelistss1.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30715094-115759363054445901?l=geekophiliac.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekophiliac.blogspot.com/feeds/115759363054445901/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30715094&amp;postID=115759363054445901' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30715094/posts/default/115759363054445901'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30715094/posts/default/115759363054445901'/><link rel='alternate' type='text/html' href='http://geekophiliac.blogspot.com/2006/09/duelist-progress-report.html' title='The Duelist: Progress Report'/><author><name>Brian Sowers</name><uri>http://www.blogger.com/profile/04735666528079624327</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30715094.post-115751933069018089</id><published>2006-09-06T00:39:00.000-04:00</published><updated>2006-09-06T01:08:50.743-04:00</updated><title type='text'>Web Comics Day 6: Rob and Elliot</title><content type='html'>&lt;a href="http://www.robandelliot.cycomics.com/index.php"&gt;Rob and Elliot&lt;/a&gt; does not have a compelling story.  It's not always updated on time.  It doesn't fall into any niche markets, and it doesn't make itself noticeable by shocking/offending/surprising its readers.  But by God, it's charming.&lt;br /&gt;&lt;br /&gt;And therein lies the beauty of Rob and Elliot.  It's just simply charming.  The humor is always silly and asinine, and it never takes itself too seriously.  It's not trying to tell a story or involve you emotionally with characters or make a point.  It's just trying to have fun.  And it has fun in a big way.&lt;br /&gt;&lt;br /&gt;This is all helped by the art, which is golden.  Color is vibrant, characters are defined and expressive, scenery is pretty.  Clay really brings his A-Game in on this every strip, and his work pays off.&lt;br /&gt;&lt;br /&gt;I don't have a lot to say about Rob and Elliot because there's just not a lot to say.  It's just good, pure fun.  They've just recently finished their 200th strip.  Which means you've got some &lt;a href="http://www.robandelliot.cycomics.com/index.php"&gt;catch up to do&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;In non-comic related news, I've changed it so my posts are signed with my name instead of GenesisGenocide.  Not particularly important, but I want to make sure everyone knows who's saying what.  Also, apologies for the post on the texture cache.  I realize how poorly formatted it looks, and Blogger has somehow made me incapable of deleting it.  Which is a little weird, but oh well.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30715094-115751933069018089?l=geekophiliac.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekophiliac.blogspot.com/feeds/115751933069018089/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30715094&amp;postID=115751933069018089' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30715094/posts/default/115751933069018089'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30715094/posts/default/115751933069018089'/><link rel='alternate' type='text/html' href='http://geekophiliac.blogspot.com/2006/09/web-comics-day-6-rob-and-elliot.html' title='Web Comics Day 6: Rob and Elliot'/><author><name>Brian Sowers</name><uri>http://www.blogger.com/profile/04735666528079624327</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30715094.post-115735060286711250</id><published>2006-09-04T01:47:00.000-04:00</published><updated>2006-09-04T02:16:42.870-04:00</updated><title type='text'>Web Comics Day 5: Megatokyo</title><content type='html'>I don't know why &lt;a href="http://www.megatokyo.com/"&gt;Megatokyo&lt;/a&gt; is in my Favorites.  I don't know why I still read it.&lt;br /&gt;&lt;br /&gt;I'll start this discussion by talking about the art, which to my mind is the only thing Megatokyo does &lt;span style="font-style: italic;"&gt;right&lt;/span&gt;.  This is where the artist, Fred Gallagher, shines.  You can tell he puts a lot of work into this - every character is detailed and expressive, and even the backgrounds have a lot going on.  There's always a lot of care given to subtleties here.  Facial expressions and stances and panel layouts are always very articulate.&lt;br /&gt;&lt;br /&gt;And that's about the only good thing I have to say.&lt;br /&gt;&lt;br /&gt;The &lt;span style="font-style: italic;"&gt;content&lt;/span&gt; of the comic is another story entirely.  Initially, it had some humor to it.  It was never excessively funny, but it could be whacky and inventive.  Then things got serious.  Dead serious.  &lt;span style="font-style: italic;"&gt;Boring&lt;/span&gt; serious.  It's not that I'm opposed to the elimination of comedy in favor of more serious material, but I am opposed to the elimination of comedy without replacing it with anything.&lt;br /&gt;&lt;br /&gt;It's a problem of pacing, I think.  There's stuff that happens, but it's so long and drawn out and typically unimportant that you get the impression that nothing is happening.  Everything seems so static.  The characters aren't changing, the character relationships are hardly progressing, story arcs don't seem to have any real substance.  It's just this big mess of... bleh... and I look back, and there's not a single bit of it that stands out as memorable.&lt;br /&gt;&lt;br /&gt;There's also the matter of how often the comic gets updated.  Which might be twice a week if you're lucky.  Gallagher is the&lt;span style="font-style: italic;"&gt; &lt;/span&gt;absolute worst at keeping any kind of regular schedule.  Theoretically the comic updates every Monday, Wednesday, and Friday.  But if you consider Dead Piro Days, Shirt Guy Dom Days, and days where Piro right-out says that nothing is going to come, you end up with quite a lot of nothing.  And it's always a huge disappointment.&lt;br /&gt;&lt;br /&gt;And that leads me to this final bit: for whatever reason, &lt;span style="font-style: italic;"&gt;I still read this.&lt;/span&gt;  There's a quality about Megatokyo that can't really be captured - or at least that I can't capture - that compels people to go forward.  For all the bad I have to say about it, I still check that site hopeful that Gallagher has put up something interesting.  So go ahead and &lt;a href="http://www.megatokyo.com/"&gt;read it&lt;/a&gt;.  Peruse the archives, and maybe you'll be able to figure out what keeps me reading.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30715094-115735060286711250?l=geekophiliac.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekophiliac.blogspot.com/feeds/115735060286711250/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30715094&amp;postID=115735060286711250' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30715094/posts/default/115735060286711250'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30715094/posts/default/115735060286711250'/><link rel='alternate' type='text/html' href='http://geekophiliac.blogspot.com/2006/09/web-comics-day-5-megatokyo_04.html' title='Web Comics Day 5: Megatokyo'/><author><name>Brian Sowers</name><uri>http://www.blogger.com/profile/04735666528079624327</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30715094.post-115733533647384402</id><published>2006-09-03T21:12:00.000-04:00</published><updated>2006-09-03T22:02:16.583-04:00</updated><title type='text'>Services/Subscribers</title><content type='html'>This isn't so much XNA as it is .NET in general, but I feel it's pertinent since it's related to me trying to get XNA to treat input in an event-driven way as opposed to using a polling mechanism.&lt;br /&gt;&lt;br /&gt;I've been struggling a bit with delegates and the whole service/subscriber paradigm as used in .NET.  Not the implementation - that's trivial - but the true benefits of their method versus my old habits.  I'm used to having a service provider which is responsible for registering and unregistering subscribers and then sending events to the subscriber via calling an interfaced method.  I'm &lt;span style="font-style: italic;"&gt;not&lt;/span&gt; used to the subscribers registering/unregistering themselves by adding a delegate to the service provider.  At first, I thought this second method would increase coupling by binding the subscriber to the service and then binding the service to the subscriber, but that's not really what's happening here.  The provider doesn't care about the nature of the subscriber so long as the delegate has been added to it - any changes to the internals of the subscriber will be completely transparent.  It seems that changes to the internals of the provider may require a change in the subscriber, and thus you've simply reversed the nature of your coupling from the first method, where a change in the provider was transparent to the subscriber but the opposite may not be true.&lt;br /&gt;So I've been banging my head against a wall, trying to figure out &lt;span style="font-style: italic;"&gt;why&lt;/span&gt; exactly everyone seems to prefer the .NET method.  It could be simply that that's how the .NET documentation recommends developers so that they conform to the .NET standard of doing things, or there could be some clear benefit I'm missing.  Clarification would be appreciated.&lt;br /&gt;&lt;br /&gt;I've found one scenario where I can't find a simple implementation in .NET, and I have thus gone to my method.  The problem is that I'd like to have one service provider that is speed-efficient and can easily handle multiple types of events.  Having to add a new event type to my provider each time I recognized a new game event sounded extremely cumbersome.  Further, having one event type store all my delegates did not seem efficient - the event would end up being sent to all listeners, even if those listeners were not interested in the specific type of event.  My solution is to have a Dictionary mapping a Type to a List of GameEventSubscribers.  When a subscriber is subscribed, it subscribes to a specific Type.  When an event is posted, only that list of GameEventSubscribers that is actually listening for the specific event type gets notified.&lt;br /&gt;The system has one apparent flaw, and that is it's not 100% type safe when registering/unregistering a listener.  You can register a listener to &lt;span style="font-style: italic;"&gt;any&lt;/span&gt; type, not just types that derive from GameEvent.  PostEvent only takes a GameEvent, so those listeners will never receive something else, but it would be nice to prevent them ever registering themselves to, say, System.Generic (because some stupid programmer &lt;span style="font-style: italic;"&gt;will&lt;/span&gt; try it).  A simple solution I can see is to just throw an exception when someone tries something like that, which is easy enough, I suppose.&lt;br /&gt;&lt;br /&gt;I know my meaning is not entirely apparent, and it'd be a lot easier to explain with source code.  I did look for methods to post source code here, but I still haven't found anything good yet.  Hopefully some golden knight will appear and offer a solution, and these updates can be a little clearer/more informative.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30715094-115733533647384402?l=geekophiliac.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekophiliac.blogspot.com/feeds/115733533647384402/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30715094&amp;postID=115733533647384402' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30715094/posts/default/115733533647384402'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30715094/posts/default/115733533647384402'/><link rel='alternate' type='text/html' href='http://geekophiliac.blogspot.com/2006/09/servicessubscribers.html' title='Services/Subscribers'/><author><name>Brian Sowers</name><uri>http://www.blogger.com/profile/04735666528079624327</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30715094.post-115714998339922510</id><published>2006-09-01T17:55:00.000-04:00</published><updated>2006-09-02T16:28:24.910-04:00</updated><title type='text'>And Then There Was Pong</title><content type='html'>After getting "familiar" with the XNA input methods, I banged up a quick little version of Pong to play around.  The process went something like this:&lt;br /&gt;&lt;br /&gt;First, I imported all the graphics into the project and told XNA to copy them to the appropriate location.  I used some Parodica graphics I had lyring around - Alex and Bekah were the paddles and Schmee was the ball.&lt;br /&gt;&lt;br /&gt;Second, I put together a quick little texture cache class so that I didn't have to manage everything on my own and so I wouldn't have to create a new variable for every texture.  I then discovered that the XNA Starter Kit &lt;span style="font-style: italic;"&gt;Spacewar&lt;/span&gt; came with a slightly better version.  I imagine both won't be all that useful once the Content Pipeline is integrated, but that remains to be seen.&lt;br /&gt;&lt;br /&gt;Third, I made a quick Entity class to handle my (very) basic sprites.  It was a hacked together class that is absolutely not meant for serious use, but programming Pong isn't a serious task.&lt;br /&gt;&lt;br /&gt;Fourth, I wrote the code to handle the input.  This was the ugliest stuff I've ever written.  Not only am I unfond of the polling system found in XNA, but I'm further unfond of how these results are returned.  Instead of being able to easily find out whether a key was down or not, I had to search through an array of pressed keys to find if the button I was interested in was located in the array.  Very shabby stuff.  I expect the next thing I'm going to do is write my own event management for input.&lt;br /&gt;&lt;br /&gt;Fifth, I wrote some quick collision detection.  Very typical stuff using bounding boxes.  Nothing new here.  XNA made the process simple enough via providing a BoundingBox class, but it's really not a lot of work to write one anyway.&lt;br /&gt;&lt;br /&gt;I then called the project finished.  The only remaining step was to add some sort of score display.  Unfortunately, I didn't find any font support in the XNA 2D library, which is a pretty glaring omission that I'm not looking forward to implementing myself.  It's not hard, but it's terribly uninteresting.&lt;br /&gt;&lt;br /&gt;I'm pretty pleased thus far.  Pong took me almost no time to develop, and most of that non-time was spent learning how to handle input.  XNA isn't perfect, but it's also only in Beta.  Based around comments in the XNA Team Blog, I expect that they will be adding a great deal of functionality.  I'm interested to see how this library matures.&lt;br /&gt;&lt;br /&gt;I was hoping to provide some code with this update, but I could not insert it without my formatting being mangled.  If anyone could tell me how to work around that, I'd be appreciative.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30715094-115714998339922510?l=geekophiliac.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekophiliac.blogspot.com/feeds/115714998339922510/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30715094&amp;postID=115714998339922510' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30715094/posts/default/115714998339922510'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30715094/posts/default/115714998339922510'/><link rel='alternate' type='text/html' href='http://geekophiliac.blogspot.com/2006/09/and-then-there-was-pong.html' title='And Then There Was Pong'/><author><name>Brian Sowers</name><uri>http://www.blogger.com/profile/04735666528079624327</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30715094.post-115708639541271893</id><published>2006-09-01T00:28:00.000-04:00</published><updated>2006-09-01T00:53:15.440-04:00</updated><title type='text'>XNA - In the Beginning</title><content type='html'>For anyone with experience in game development, the XNA Game Studio starts off rather refreshingly.  You see, one of the biggest barriers to starting game development in Windows is learning &lt;span style="font-style: italic;"&gt;Windows&lt;/span&gt;.  MFC and Win32 and integrating DirectX/OpenGL and showing a window and processing window events and managing all the little things that can (and will) go wrong is daunting.  There are libraries like glut and SDL to help out, but they don't make the process entirely painless.  Even in .NET, the process isn't streamlined - Tao makes things easy on the OpenGL end with some handy controls, but DirectX isn't something you just 'pick up and roll with' in my experiences.  So when I started up a brand new XNA project and hit F5 and saw a window already there, I was pleasantly surprised.  Sure, there is code that went into that, but it was already written for me; I was ready to go without &lt;span style="font-style: italic;"&gt;any&lt;/span&gt; work.  Nice.  Very nice.&lt;br /&gt;&lt;br /&gt;And things only went uphill from there.  I focused on 2D development, because I'm not quite ready to dive into Direct3D.  I can say this - the 2D development was easier than everything I've ever experienced.  I didn't have to write any texture loaders or fool around with any memory.  I didn't even have to copy the images to an appropriate directory - XNA did that for me.  All &lt;span style="font-style: italic;"&gt;I &lt;/span&gt;did was load the texture using the fancy-schmancy Texture2D class and draw it using the SpriteBatch class.  Five lines of code total.  Again, nice.&lt;br /&gt;&lt;br /&gt;I haven't messed with input yet, but I can already see this is going to be the source of my first complaint.  I've become quite fond of doing input by processing events - it keeps things very clean and expandable in my experiences.  The library, however, only seems to have support for polling the states of the various input devices.    I will probably have to write my own class to handle taking the polled states and converting them into messages to get passed around to my various objects.&lt;br /&gt;&lt;br /&gt;I'll leave you with this screenshot.  It's just a basic window with one of the characters from Parodica in it.  I won't say this hints at a possible port from the C++/OpenGL version, but don't be surprised if I decide to take that route.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/860/3300/1600/xnascreen1.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://photos1.blogger.com/blogger/860/3300/320/xnascreen1.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30715094-115708639541271893?l=geekophiliac.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekophiliac.blogspot.com/feeds/115708639541271893/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30715094&amp;postID=115708639541271893' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30715094/posts/default/115708639541271893'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30715094/posts/default/115708639541271893'/><link rel='alternate' type='text/html' href='http://geekophiliac.blogspot.com/2006/09/xna-in-beginning.html' title='XNA - In the Beginning'/><author><name>Brian Sowers</name><uri>http://www.blogger.com/profile/04735666528079624327</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30715094.post-115706510902676870</id><published>2006-08-31T18:40:00.000-04:00</published><updated>2006-08-31T18:58:29.066-04:00</updated><title type='text'>Web Comics Day 4: Something Positive</title><content type='html'>&lt;a href="http://www.somethingpositive.net"&gt;Something Positive&lt;/a&gt; by R.K. Milholland differentiates itself from most of my routine comics by being the most &lt;span style="font-style: italic;"&gt;vulgar&lt;/span&gt; thing I've ever read.  This is not a child's comic.  It's not even an adult's comic.  It falls neatly in the realm of 'depraved college student' humor.  That's not to say that other audiences won't enjoy it, but you've been warned: if there's something that can offend you, it &lt;span style="font-style: italic;"&gt;will&lt;/span&gt; be dropped around in this comic like dirty laundry.&lt;br /&gt;&lt;br /&gt;If, however, you're harder to disgust, you may enjoy the comic.  It can be somewhat formulaic at times - a lot of the punch-lines are similar and executed in the same way, and a good deal of dialog feels like it's rehashed.  Otherwise, there is some clever stuff in here.  At the least, you'll definitely find new ways to insult someone.&lt;br /&gt;&lt;br /&gt;One of the other things I greatly appreciate about this comic is that, even when it's being crude or outright mean,  it does not shy away from drama and character development.  Important characters will die.  People will lose their babies.  Hearts will be broken.  Hearts will be mended.  Characters will evolve radically.  Everything is &lt;span style="font-style: italic;"&gt;constantly&lt;/span&gt; changing, and it's all very well put together.  The storylines are all excellent, and there are a few shockers that had me reeling.  Even if you can't appreciate the humor, there are still some good stories in here.&lt;br /&gt;&lt;br /&gt;The art is decent.  Characters are well designed and show expression well.  The backgrounds are entirely negligible, but as I've said before, this is too common to care much about.  While nothing strikes me as remarkable about this art, it's definitely solid and well put-together.&lt;br /&gt;&lt;br /&gt;The comic updates a lot, as advertised.  This comes in bursts - sometimes there will be lulls where you might have a day or two off, and sometimes you'll get ten comics in the course of a week.  With that much content, there's a lot here to like, and if you find yourself enjoying the comic, you'll certainly be pleased.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30715094-115706510902676870?l=geekophiliac.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekophiliac.blogspot.com/feeds/115706510902676870/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30715094&amp;postID=115706510902676870' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30715094/posts/default/115706510902676870'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30715094/posts/default/115706510902676870'/><link rel='alternate' type='text/html' href='http://geekophiliac.blogspot.com/2006/08/web-comics-day-4-something-positive.html' title='Web Comics Day 4: Something Positive'/><author><name>Brian Sowers</name><uri>http://www.blogger.com/profile/04735666528079624327</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30715094.post-115699648466199288</id><published>2006-08-30T23:29:00.000-04:00</published><updated>2006-08-30T23:54:44.673-04:00</updated><title type='text'>Geek Kung-Fu, Shaolin Style</title><content type='html'>While Ricky is doing his thing in regards to development and improving his software engineering talents, I too have my own goals which I would like to chronicle as they progress.  I don't know that my methods will, in fact, be regarded as the &lt;span style="font-style: italic;"&gt;Shaolin Style&lt;/span&gt; of Geek Kung-Fu - I've never been to China, nor have I ever met a Shaolin monk - but they will at least further my own personal development.  Any martial arts developed through the process are a pleasant biproduct.&lt;br /&gt;&lt;br /&gt;So here's what I'm going to do.  I'm going to lay this on the line right here, and if I fail to meet the standards I have set, you as the community are free to berate me until I am emotionally &lt;span style="font-style: italic;"&gt;exhausted&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;(a) C#.  It's time I learned it properly.  And I'm not going to learn it by writing a "Hello World" application.  I'm going to learn it by making a 2d tile map editor and a basic 3d scene editor.  I'm  also going to learn my way around Tao during this process.  This is a secondary project which will not have my full attention, but I will reserve &lt;span style="font-style: italic;"&gt;at least&lt;/span&gt; one post a week to it.&lt;br /&gt;&lt;br /&gt;(b) The Duelist.  My DDR pad came in today, and I have exactly 9 days to finish this game.  The large majority of this development will be done in C++/OpenGL/FMOD, and since I'm already intimately familiar with all of these technologies and the course the game development will take, I will not provide many details during development.  I will, however, write a &lt;span style="font-style: italic;"&gt;full&lt;/span&gt; post-mortem.  You can expect to have this in your cache by the end of September 10th.&lt;br /&gt;&lt;br /&gt;(c)  The XNA Game Studio.  I intend to become quite proficient in developing with this before the XBox portability feature is introduced.  Thus, I am going to dedicate 2 hours per night to learning this technology.  And I fully intend to report on what I've learned every other night.&lt;br /&gt;&lt;br /&gt;(d) Parodica.  For those unfamiliar, it's an RPG I've been working on since early last semester.   Once the Duelist is finished, I want to put development on this on the forefront of my priorities - quite simply, I want this game finished.  This is something I intend to update on on the nights when I am not updating on the XNA Game Studio.&lt;br /&gt;&lt;br /&gt;(e) A film project.  Typically there is a film festival close to Halloween where anyone can submit a film.  I &lt;span style="font-style: italic;"&gt;will&lt;/span&gt; have something for this festival.  And I will detail the entire creation process here.  But that too will not start until The Duelist is finished.&lt;br /&gt;&lt;br /&gt;Those are my goals for right now.  As I said, I intend to provide regular reports on all of these for both your benefit and mine; hopefully I will have useful information to pass on, and feeling obligated to update here will put added pressure on me to avoid slacking off.  I'm looking forward to it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30715094-115699648466199288?l=geekophiliac.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekophiliac.blogspot.com/feeds/115699648466199288/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30715094&amp;postID=115699648466199288' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30715094/posts/default/115699648466199288'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30715094/posts/default/115699648466199288'/><link rel='alternate' type='text/html' href='http://geekophiliac.blogspot.com/2006/08/geek-kung-fu-shaolin-style.html' title='Geek Kung-Fu, Shaolin Style'/><author><name>Brian Sowers</name><uri>http://www.blogger.com/profile/04735666528079624327</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30715094.post-115690485082461186</id><published>2006-08-29T22:07:00.000-04:00</published><updated>2006-08-29T22:27:30.833-04:00</updated><title type='text'>Web Comics Day 3: Shortpacked!</title><content type='html'>Finally a comic involving original art: &lt;a href="http://www.shortpacked.com/"&gt;Shortpacked! &lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This comic is awesome.  Let me tell you why, starting with this point of interest: the artwork is good.  Every panel is clean and well-drawn.  The characters all have a unique look without being horribly exaggerated.  There's typically not much happening in the background, but this is an affliction very common among all comics.  Since everything else is solid, I take no points off.  I won't say this is the prettiest comic ever, but it's definitely not a burden on the eyes.&lt;br /&gt;&lt;br /&gt;Shortpacked goes out of its way to be funny.  There may be some dramatic story arc going on, but if David Willis decides it's time to interject with a Batman gag, you can bet that story will wait a day for the Dark Knight.  Speaking of the story arcs, they're all good.  They're all very real-ish - things never get too outlandish as to belong in &lt;a href="http://www.sluggy.com/"&gt;Sluggy Freelance&lt;/a&gt; (not knocking Sluggy there), but they're never so serious that there won't be humor.  And the pacing is absolutely perfect.&lt;span style="font-style: italic;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Shortpacked is fresh.  I dare you to find a better webcomic about &lt;span style="font-style: italic;"&gt;toys&lt;/span&gt;.  It won't happen.  Nobody mixes real life with Megatron the way this comic does.  I don't know when this comic updates exactly (a lot, but I can't pin down a schedule), but I find myself looking forward to every new edition.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30715094-115690485082461186?l=geekophiliac.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekophiliac.blogspot.com/feeds/115690485082461186/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30715094&amp;postID=115690485082461186' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30715094/posts/default/115690485082461186'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30715094/posts/default/115690485082461186'/><link rel='alternate' type='text/html' href='http://geekophiliac.blogspot.com/2006/08/web-comics-day-3-shortpacked.html' title='Web Comics Day 3: Shortpacked!'/><author><name>Brian Sowers</name><uri>http://www.blogger.com/profile/04735666528079624327</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30715094.post-115699613545193359</id><published>2006-08-29T21:32:00.000-04:00</published><updated>2006-08-30T23:48:55.460-04:00</updated><title type='text'>Give it a Name</title><content type='html'>I'm currently amazed at how important it is to give your projects a name (at least for me). I've read several articles, of which I have no concrete references or links, that detail the importance of naming your projects. Personally, I've always thought this border-line silly, and detest the number of "management pun" acronym projects we have at work. However, I may be on the brink of a change of heart, at least on the small.&lt;br /&gt;&lt;br /&gt;As mentioned in my &lt;a href="http://geekophiliac.blogspot.com/2006/08/experimental-exercise-in-good.html" title="I know kung-fu"&gt;previous post&lt;/a&gt;, I'm working on a personal project to test out some &lt;em&gt;theoretical&lt;/em&gt; waters. To say these waters are a pool of &lt;a href="http://www.agilealliance.org/" title="No witty comment"&gt;Agile&lt;/a&gt; practices would not be a lie. I started this project three or four weeks ago, with the idea growing in my brain for some time before that. However, my motivation and desire to produce has been somewhat lacking; some might describe it as non-existant.&lt;br /&gt;&lt;br /&gt;The other evening I had a very small bout of motivation, so I began working on my project. I got tired of calling it Pluggable Ray Tracer, so I did the "dirty" and shortened it to PRT. And then I chuckled. For those of you not from north-central West Virginia, or not a student at West Virginia University, this may be mundane. However, there is a certain &lt;a href="http://www.nis.wvu.edu/Releases_Old/wvu_beats_disney.html" title="Rawr"&gt;mechanical monstrosity&lt;/a&gt; that carries students and townies to their approximate destinations. Sometimes.&lt;br /&gt;&lt;br /&gt;Cutting straight to the chase, I found myself writing simple requirements with the phrase "PRT will...," "PRT shall...," and so-on and so-on. The point is I was no longer avoiding the work. It may seem stupid, and I don't advocate shortening everything in God's existence to an acronym, but something about creating the name for that little project prodded me into working on it, with less motivational investment.&lt;br /&gt;&lt;br /&gt;So I guess the final word here is, if you have a project you're working on and you can't bring yourself to produce, try bestowing a little creative thought upon your creation. You may (or may not) be surprised.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30715094-115699613545193359?l=geekophiliac.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekophiliac.blogspot.com/feeds/115699613545193359/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30715094&amp;postID=115699613545193359' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30715094/posts/default/115699613545193359'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30715094/posts/default/115699613545193359'/><link rel='alternate' type='text/html' href='http://geekophiliac.blogspot.com/2006/08/give-it-name.html' title='Give it a Name'/><author><name>Ricky</name><uri>http://www.blogger.com/profile/05379063540281664952</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://wvvel.csee.wvu.edu/rhussmann/moneyShot.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30715094.post-115681407951008386</id><published>2006-08-28T20:41:00.000-04:00</published><updated>2006-08-28T21:14:39.526-04:00</updated><title type='text'>Web Comics Day 2: 8-bit Theater</title><content type='html'>Ah, &lt;a href="http://www.nuklearpower.com"&gt;8-bit Theater&lt;/a&gt;.  &lt;span style="font-style: italic;"&gt;The&lt;/span&gt; sprite comic.   Oh, there are others, of course.  But none which have held my interest as long as this one.&lt;br /&gt;&lt;br /&gt;Some think that the use of Final Fantasy sprites in lieu of original artwork cheapens a comic - an argument which I understand fully.  But I also understand (even more fully) that non-artists would like a chance to flex their story-telling muscles in the comic format.  These non-artists are left with only a handful of options, and using someone else's already existing artwork is often the most feasible.&lt;br /&gt;&lt;br /&gt;I don't know if Clevinger wanted all along to use sprites or if he was forced to out of a genuine lack of artistic ability, but since he does not have his unique visual style to play off of, he is forced to make his comic appealing almost &lt;span style="font-style: italic;"&gt;solely&lt;/span&gt; through the content.  And to this end, 8-bit Theater succeeds... usually.&lt;br /&gt;&lt;br /&gt;The story follows (in &lt;span style="font-style: italic;"&gt;some&lt;/span&gt; similar fashion) the same storyline that Final Fantasy 1 followed, using the same characters that were available as party members in FF1.  They weren't even given original names - the black mage is named Black Mage, the red mage Red Mage, and, well, I think you see where I'm going here.  There are a few characters which were given names only out of necessity.  Each character was, however, given a very individual personality - usually defined by a single dominant trait (Black Mage is murderous, Fighter is stupid, and Red Mage is... a D&amp;D manual?  I don't know what the word would be).  The story merely serves as a backdrop to highlight the exchanges between these different personalities.&lt;br /&gt;&lt;br /&gt;And the exchanges are funny.  Typically.  The comic is best in the beginning, when characters are being introduced and they're still very fresh and interesting.  As things progress, though, things start becoming predictable and the comedy becomes repetitve.  There are still a good number of funny lines (the reason I haven't stopped reading), but it's certainly not as inventive as it was.  This is probably the reason a lot of people I know stop reading the comic after a while.&lt;br /&gt;&lt;br /&gt;The pacing suffers sometimes, too.  Every so often, Clevinger will stick around in a story arc longer than it is interesting.  For the most part this isn't a problem, but sometimes it will be very noticeable.  The slightly bigger problem is that the story frequently returns to characters/gags that weren't interesting in the first place.  Thus, even the repetition isn't as interesting as it could be.&lt;br /&gt;&lt;br /&gt;It feels like I've said a lot of bad about 8-bit, but the comic has remained in my Favorites for a reason.  It's got a nice charm about it, and I enjoy the dialog and humor even if things &lt;span style="font-style: italic;"&gt;do&lt;/span&gt; sometimes trudge along.  With over 700 strips, it makes for an entertaining read.  It also adds to the Tuesday, Thursday, Saturday lineup quite respectably.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30715094-115681407951008386?l=geekophiliac.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekophiliac.blogspot.com/feeds/115681407951008386/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30715094&amp;postID=115681407951008386' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30715094/posts/default/115681407951008386'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30715094/posts/default/115681407951008386'/><link rel='alternate' type='text/html' href='http://geekophiliac.blogspot.com/2006/08/web-comics-day-2-8-bit-theater.html' title='Web Comics Day 2: 8-bit Theater'/><author><name>Brian Sowers</name><uri>http://www.blogger.com/profile/04735666528079624327</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30715094.post-115678803139227756</id><published>2006-08-28T13:48:00.000-04:00</published><updated>2006-08-28T14:00:31.403-04:00</updated><title type='text'>.NET and Tao</title><content type='html'>In preparation for the release of the &lt;a href="http://msdn.microsoft.com/directx/xna/"&gt;XNA Game Studio&lt;/a&gt;, I have been taking a serious look at .NET.  Thus far, I'm very pleased.  The introduction of memory management is always a welcome change along with the ability to create robust GUI's almost effortlessly.  There are a few things that I find mildly distasteful (the get/set paradigm as presented in .NET), but those are stylistic quibbles that have no place in real language analysis.&lt;br /&gt;&lt;br /&gt;I began with two rudimentary exercises: the first was to port select bits of my C++ game engine over, and the second was to get an application using the &lt;a href="http://www.taoframework.com/Home"&gt;Tao framework&lt;/a&gt; running.  Aside from some minor syntax struggles, the first task went relatively painlessly.  In fact, I found that I was reinventing functionality that .NET already had built in - .NET comes with a fairly robust event management system that I had to implement myself in C++.  The second task was finished before I realized I had started.  Five minutes after downloading the Tao framework, I had an OpenGL window running that behaved quite nicely with my external GUI widgets.  Never again will I have to fight with GTK or FOX to put a GUI over my OpenGL applications.&lt;br /&gt;&lt;br /&gt;I have a few more things I want to do before I dive into serious application development with .NET.  First, I want to make some form of editor - probably a map editor for Parodica.  Second, I need to become familiar with DirectX - something that will be necessary when the XNA Game Studio hits.  I'm really starting to like this language, though.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30715094-115678803139227756?l=geekophiliac.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekophiliac.blogspot.com/feeds/115678803139227756/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30715094&amp;postID=115678803139227756' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30715094/posts/default/115678803139227756'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30715094/posts/default/115678803139227756'/><link rel='alternate' type='text/html' href='http://geekophiliac.blogspot.com/2006/08/net-and-tao.html' title='.NET and Tao'/><author><name>Brian Sowers</name><uri>http://www.blogger.com/profile/04735666528079624327</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30715094.post-115670015435221049</id><published>2006-08-27T13:09:00.000-04:00</published><updated>2006-08-27T13:35:54.353-04:00</updated><title type='text'>Web Comics Day 1: Concerned</title><content type='html'>Over the course of the next few weeks, I'm going to provide an overview of the web comics I read regularly.  Today we'll kick things off with &lt;a href="http://www.hlcomic.com/"&gt;Concerned: The Half-Life and death of Gordon Frohman.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The moment you look at the comic, you'll realize one thing immediately: every panel looks like a Half-Life 2 screenshot.  You'll realize this because that is exactly what's happening.  On the back-end, Concerned uses &lt;a href="http://gmod.garry.tv/"&gt;Garry's MOD&lt;/a&gt; to pose the models of Half-Life 2 any way the artist (Christopher Livingston) wishes.  This offers a relatively unique flavor to the comic and reinforces that the comic takes place in the Half-Life 2 universe.&lt;br /&gt;&lt;br /&gt;The story follows the tale of Gordon Frohman, an honest, hard-working citizen of City 17 who gets thrown around the world and mixed up in the affairs of Gordon Freeman.  As expected, Frohman is an anti-Freeman - a hapless, bumbling, ignorant fool who fully supports the Combine efforts and feels friendly with Dr. Breen.  While this is something of a cliche comic hero role, Frohman still entertains and brings some great comedy.&lt;br /&gt;&lt;br /&gt;Unfortunately, there is no real supporting cast to speak of.  You'll see some of the characters from the game, but they mostly play bit roles and don't last more than a few strips.  Gordon's brother has just been introduced, and he seems like a very interesting character - hopefully one that lasts a while.&lt;br /&gt;&lt;br /&gt;The pacing is excellent.  Everything flows well, and you hardly notice that Gordon's been through most of the world when he winds up back in the city just in time for Freeman's arrival.  Practically every strip has a clearly defined punch-line, and they are generally all chuckle-worthy if not better.  You never get bogged down in a boring story arc, and things are always fun and fresh.  The comic updates every Tuesday and Thursday and rarely misses on updates.&lt;br /&gt;&lt;br /&gt;I strongly recommend this comic.  It has been an excellent piece of work, and I look forward to whenever it gets updated.  Go &lt;a href="http://www.hlcomic.com"&gt;read it&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30715094-115670015435221049?l=geekophiliac.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekophiliac.blogspot.com/feeds/115670015435221049/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30715094&amp;postID=115670015435221049' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30715094/posts/default/115670015435221049'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30715094/posts/default/115670015435221049'/><link rel='alternate' type='text/html' href='http://geekophiliac.blogspot.com/2006/08/web-comics-day-1-concerned_27.html' title='Web Comics Day 1: Concerned'/><author><name>Brian Sowers</name><uri>http://www.blogger.com/profile/04735666528079624327</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30715094.post-115639734032179042</id><published>2006-08-24T01:23:00.000-04:00</published><updated>2006-08-24T01:29:00.386-04:00</updated><title type='text'>An Experimental Exercise in Good Development (or Geek Kung-Fu)</title><content type='html'>This post is about exactly what the title describes. I'm starting an experimental project in development. I'll outline below the sort of techniques I'd like to exercise during the experiment, as well as the conclusions I hope to draw from this "project." I plan to start a new (actually, an old) software project. The medium for this experiment is the creation of a raytracer. This however is just the medium for the requirements I hope to exercise. By the end of this project I hope to have tried the following:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt; Create and use a subversion repository for source control&lt;/li&gt;&lt;li&gt; Configure and use Cruise Control as a continuous integration (CI) server&lt;/li&gt;&lt;li&gt; Utilize a dynamic plugin architecture in the design&lt;/li&gt;&lt;li&gt; Design a display agnostic renderer (e.g., no dependency on OpenGL, Quartz, etc.)&lt;/li&gt;&lt;li&gt; Speaking of Quartz, let's write this baby in Objective-C for OSX&lt;/li&gt;&lt;li&gt; If at all possible, make use of Core Data&lt;/li&gt;&lt;li&gt; Adopt Test-Driven-Development methodologies for all development&lt;/li&gt;&lt;li&gt; Document the architecture during the TDD process&lt;/li&gt;&lt;/ul&gt;As you can see, these are obviously developer requirements aimed at orienting myself with new technology and development methodologies, not real requirements for a product. Essentially, this project is just an excuse for me to practice a more agile type of software development. And, to be a better blogger, I plan to share my progress in as much detail as possible here.&lt;br /&gt;&lt;br /&gt;I also hope to document the organizational process I plan to follow. For example, I capture a lot of quick thoughts on paper, and that paper ends up being scattered about my desk at work. I'd like to keep an "inbox" on my desk that all ideas get tossed into, even if I would normally just throw them away. Then, at the end of the coding session I'll inspect all these documents to create a coherent statement of my progress at that point. I don't know if its going to work out, but that's why this is an &lt;em&gt;experiment&lt;/em&gt;.&lt;br /&gt;&lt;br /&gt;I have cheated slightly. I decided to start out yesterday evening, and get the SVN and CruiseControl configurations set up. Originally I wanted to have Cruise and SVN set up on my Linux box, leaving the entire CI process to it. However, while planning this out I realized that "Nothing Works with a Mac," meaning that I won't be able to compile my Objective-C code on a non-Mac platform. I technically have my G4 box lying around that has the Apple Foundation framework on it, but I don't easily have a network connection for it. So, for now, I think I'm going to rule out the continuous integration.&lt;br /&gt;&lt;br /&gt;Anyway, I hope to have a post up soon describing my first small, informal design session.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30715094-115639734032179042?l=geekophiliac.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekophiliac.blogspot.com/feeds/115639734032179042/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30715094&amp;postID=115639734032179042' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30715094/posts/default/115639734032179042'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30715094/posts/default/115639734032179042'/><link rel='alternate' type='text/html' href='http://geekophiliac.blogspot.com/2006/08/experimental-exercise-in-good.html' title='An Experimental Exercise in Good Development (or Geek Kung-Fu)'/><author><name>Ricky</name><uri>http://www.blogger.com/profile/05379063540281664952</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://wvvel.csee.wvu.edu/rhussmann/moneyShot.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30715094.post-115583870940880697</id><published>2006-08-17T14:15:00.000-04:00</published><updated>2006-08-17T14:18:29.416-04:00</updated><title type='text'>Top Honors</title><content type='html'>The Duelist has made it into round two of the Experimental Gameplay Competition!  This has two important implications: (1) I will be receiving a free RedOctane DDR dance pad, and (2) I will have approximately two weeks to create The Duelist utilizing that pad.  Between programming, art, sound, and content generation, it's not going to be an easy task - especially since classes start up soon - but I have no intention of letting silly things like "obligations" or "sleep" get in my way.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30715094-115583870940880697?l=geekophiliac.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekophiliac.blogspot.com/feeds/115583870940880697/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30715094&amp;postID=115583870940880697' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30715094/posts/default/115583870940880697'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30715094/posts/default/115583870940880697'/><link rel='alternate' type='text/html' href='http://geekophiliac.blogspot.com/2006/08/top-honors.html' title='Top Honors'/><author><name>Brian Sowers</name><uri>http://www.blogger.com/profile/04735666528079624327</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30715094.post-115479524365806665</id><published>2006-08-05T12:24:00.000-04:00</published><updated>2006-08-05T12:27:23.710-04:00</updated><title type='text'>The Duelist</title><content type='html'>Here is the design I submitted for the RedOctane competition over at the &lt;a href="http://www.experimentalgameplay.com/"&gt;Experimental Gameplay Project&lt;/a&gt;.  Keep in mind that it's supposed to be brief (otherwise I would have gone &lt;span style="font-style: italic;"&gt;much &lt;/span&gt; more in depth).  Tell me what you think.&lt;br /&gt;&lt;p&gt;&lt;span style="font-family:Verdana, Arial, Helvetica, sans-serif;font-size:-1;"&gt;&lt;strong&gt;Game Title:&lt;/strong&gt; “The Duelist”&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:Verdana, Arial, Helvetica, sans-serif;font-size:-1;"&gt;&lt;strong&gt;Background:&lt;/strong&gt;&lt;br /&gt;Welcome to Sententia University, a school which focuses on training telekinetic power while offering 'normal' classes to disguise itself from the public. The school has one simple policy: to graduate, you must defeat the Dean in a battle of the mind.&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:Verdana, Arial, Helvetica, sans-serif;font-size:-1;"&gt;A duel takes place over a series of multiple turns. Each turn, a telekinetic technique is revealed. The player must best his opponent with this technique to win that turn. When a player has won two more turns than his opponent, that player wins the duel.&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:Verdana, Arial, Helvetica, sans-serif;font-size:-1;"&gt;However, you do not start out knowing all the telekinetic techniques. To learn techniques, you must beat the professors at the university. You can also go around challenging other students to practice, or you can simply talk to them to learn all the gossip about the school. Only when you have learned all the techniques can you challenge the Dean.&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:Verdana, Arial, Helvetica, sans-serif;font-size:-1;"&gt;&lt;strong&gt;Use of the pad:&lt;/strong&gt;&lt;br /&gt;While not dueling, the player uses the pad to navigate the school in a menu-like fashion, where the player chooses which hall he wants to visit and which student/professor he wishes to speak with or challenge. Up/Down choose between menu items, and Circle selects an item.&lt;br /&gt;While dueling, each turn is essentially a fast-paced mini-game which requires a different use of the pad to triumph. Potential techniques follow:&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:Verdana, Arial, Helvetica, sans-serif;font-size:-1;"&gt;Mind Hack (learned from the Computer Science professor): The first player completes a sequence of steps. The second player then must match this and add a step to the end. Then the first player must match this and add a new step. This back-forth continues until either a player missteps or a player cannot complete the sequence within the specified time limit (approximately 5 seconds, though this number will be tweaked as gameplay is tested).&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:Verdana, Arial, Helvetica, sans-serif;font-size:-1;"&gt;Lightning (learned from English professor): Two buttons are shown. Each player must press these buttons in succession as fast as possible for a given length of time. The player who presses the fastest wins.&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:Verdana, Arial, Helvetica, sans-serif;font-size:-1;"&gt;Total Recall (learned from the History professor): A random sequence of steps is revealed for a short time and then hidden. The players must then hit as many of the steps as they can remember. The player who hits the most steps wins.&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:Verdana, Arial, Helvetica, sans-serif;font-size:-1;"&gt;Speed Demon (learned from the Phys Ed professor): Approximately 30 steps are shown. The player who completes all the steps first wins. In the event of a mis-step, the player must start over.&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:Verdana, Arial, Helvetica, sans-serif;font-size:-1;"&gt;Precision (learned from the Art professor): Each player has a meter that starts to rise and fall at varying speeds. The player can hit on any button to stop the meter. The player who stops the meter closest to the top wins. &lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:Verdana, Arial, Helvetica, sans-serif;font-size:-1;"&gt;Quick Draw (learned from the Math professor): Players must wait until a certain button pops up on the screen.  The player who hits that button first wins.&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:Verdana, Arial, Helvetica, sans-serif;font-size:-1;"&gt;(note: the above use the term 'each player', but in Single Player, the 2nd player will be the computer).&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:Verdana, Arial, Helvetica, sans-serif;font-size:-1;"&gt;&lt;strong&gt;Modes of play:&lt;/strong&gt;&lt;br /&gt;Normal versus Extreme mode (available for all the following modes): In normal mode, only the 4 direction buttons are used.  In extreme mode, all 8 buttons can be used.&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:Verdana, Arial, Helvetica, sans-serif;font-size:-1;"&gt;Story mode: Talk to students, challenge professors, and eventually take on the Dean himself.&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:Verdana, Arial, Helvetica, sans-serif;font-size:-1;"&gt;Multiplayer 1: The Mind Hack, Lightning, Total Recall, Speed Demon, and Precision duel types can easily be adapted to using one pad, in most cases by simply adding a timer to determine who completes what task the fastest. In this case, players take turns using the pad.&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:Verdana, Arial, Helvetica, sans-serif;font-size:-1;"&gt;Multiplayer 2: The game easily facilitates multiplayer challenges where two players (each having his own pad) can duel against each other.&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30715094-115479524365806665?l=geekophiliac.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekophiliac.blogspot.com/feeds/115479524365806665/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30715094&amp;postID=115479524365806665' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30715094/posts/default/115479524365806665'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30715094/posts/default/115479524365806665'/><link rel='alternate' type='text/html' href='http://geekophiliac.blogspot.com/2006/08/duelist.html' title='The Duelist'/><author><name>Brian Sowers</name><uri>http://www.blogger.com/profile/04735666528079624327</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30715094.post-115415466738849400</id><published>2006-07-29T02:25:00.000-04:00</published><updated>2006-07-29T02:31:07.396-04:00</updated><title type='text'>Experimental Gameplay</title><content type='html'>&lt;a href="http://www.experimentalgameplay.com/"&gt;The Experimental Gameplay Project&lt;/a&gt; has announced a &lt;a href="http://www.experimentalgameplay.com/blog.php?b=74"&gt;RedOctane competition&lt;/a&gt; challenging competitors to come up with a &lt;span style="font-style: italic;"&gt;non-dance&lt;/span&gt; game that utilizes the DDR mats.  I'm rather interested in trying this, but I have thus far been incapable of coming up with good ideas.&lt;br /&gt;&lt;br /&gt;While we're on the topic, I'm a big fan of what the Experimental Gameplay Project is about.  It started at Carnegie Mellon as a project where the participants would attempt to create a new, original game each week for a semester.  It has since grown to showcase games by other people and get more community involvement.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30715094-115415466738849400?l=geekophiliac.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekophiliac.blogspot.com/feeds/115415466738849400/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30715094&amp;postID=115415466738849400' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30715094/posts/default/115415466738849400'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30715094/posts/default/115415466738849400'/><link rel='alternate' type='text/html' href='http://geekophiliac.blogspot.com/2006/07/experimental-gameplay.html' title='Experimental Gameplay'/><author><name>Brian Sowers</name><uri>http://www.blogger.com/profile/04735666528079624327</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30715094.post-115319620593421253</id><published>2006-07-17T23:55:00.000-04:00</published><updated>2006-07-18T00:16:45.963-04:00</updated><title type='text'>72HGDC Status: Complete</title><content type='html'>The &lt;a href="http://pixel-arts.org/72/"&gt;72 Hour Game Development Competition&lt;/a&gt; recently concluded.  The theme for this competition was "Retro," meaning that each game had to incorporate something retro into it somehow.  Although the judging has not completed yet, I feel it appropriate to summarize the results.&lt;br /&gt;&lt;br /&gt;First, &lt;a href="http://www.pixel-arts.org/72/board/entries/4-245-Zombie%20Theater.zip"&gt;my entry&lt;/a&gt;: trash.  There's no way to sugarcoat it.  The concept had potential, but schedules got crossed, morale declined, work ethic dropped - that old chestnut.  The finished result was not only less than the original goal - it was less than a game.  I provide that link only for reasons of completeness.  Don't play it.&lt;br /&gt;&lt;br /&gt;Now on to entries that matter.  For my money, TimeTrax submitted the &lt;a href="http://www.pixel-arts.org/72/board/entries/4-73-retroball-bin.zip"&gt;best entry&lt;/a&gt; - a terribly unoriginal Breakout clone that still manages to &lt;span style="font-style: italic;"&gt;break out&lt;/span&gt; the style and flare.  &lt;a href="http://gdguys.thejefffiles.com/"&gt;The GameDev Guys&lt;/a&gt;, a typically stellar group, submitted a &lt;a href="http://www.pixel-arts.org/72/board/entries/4-36-RagTime%20Racing%21.zip"&gt;racing game&lt;/a&gt; which had a lot of style.  It was not up to their usual standards of excellence, but it was still fairly fun to play for a while.  On the other hand, Team Calypson submitted an awfully good &lt;a href="http://www.pixel-arts.org/72/board/entries/4-82-retroracers.zip"&gt;racing game&lt;/a&gt; (we got a few of those for some reason) which turned out to be one of the best entries by far.  It comes highly recommended.  Teams Kompression and M.E. both submitted two &lt;a href="http://www.pixel-arts.org/72/board/entries/4-206-metal.zip"&gt;old-school&lt;/a&gt; &lt;a href="http://www.pixel-arts.org/72/board/entries/4-49-escape_vector.zip"&gt;games &lt;/a&gt;that used vector art to get that retro feel.  They are also both extremely difficult, and M.E.'s in particular is addictive.&lt;br /&gt;&lt;br /&gt;Those are the only ones I'm going to highlight in this space, although there were &lt;a href="http://www.pixel-arts.org/72/board/downloads.php"&gt;over twenty entries&lt;/a&gt; which all deserve some attention.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30715094-115319620593421253?l=geekophiliac.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekophiliac.blogspot.com/feeds/115319620593421253/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30715094&amp;postID=115319620593421253' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30715094/posts/default/115319620593421253'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30715094/posts/default/115319620593421253'/><link rel='alternate' type='text/html' href='http://geekophiliac.blogspot.com/2006/07/72hgdc-status-complete.html' title='72HGDC Status: Complete'/><author><name>Brian Sowers</name><uri>http://www.blogger.com/profile/04735666528079624327</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30715094.post-115284586466953413</id><published>2006-07-13T22:56:00.000-04:00</published><updated>2006-07-13T22:57:44.676-04:00</updated><title type='text'>Paul Robertson</title><content type='html'>If you are unfamiliar with the works of &lt;a href="http://probertson.livejournal.com/"&gt;Paul Robertson&lt;/a&gt;, you ought educate yourself.  The man can arrange pixels in ways that are &lt;span style="font-style: italic;"&gt;majestic&lt;/span&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30715094-115284586466953413?l=geekophiliac.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekophiliac.blogspot.com/feeds/115284586466953413/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30715094&amp;postID=115284586466953413' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30715094/posts/default/115284586466953413'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30715094/posts/default/115284586466953413'/><link rel='alternate' type='text/html' href='http://geekophiliac.blogspot.com/2006/07/paul-robertson.html' title='Paul Robertson'/><author><name>Brian Sowers</name><uri>http://www.blogger.com/profile/04735666528079624327</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30715094.post-115266365036040508</id><published>2006-07-11T20:19:00.000-04:00</published><updated>2006-07-11T20:20:50.366-04:00</updated><title type='text'>Why bother...</title><content type='html'>&lt;a href="http://www.youtube.com/watch?v=aUQzXQhAgvw&amp;search=don%20ross"&gt;trying to play guitar?&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30715094-115266365036040508?l=geekophiliac.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekophiliac.blogspot.com/feeds/115266365036040508/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30715094&amp;postID=115266365036040508' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30715094/posts/default/115266365036040508'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30715094/posts/default/115266365036040508'/><link rel='alternate' type='text/html' href='http://geekophiliac.blogspot.com/2006/07/why-bother.html' title='Why bother...'/><author><name>Ricky</name><uri>http://www.blogger.com/profile/05379063540281664952</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://wvvel.csee.wvu.edu/rhussmann/moneyShot.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30715094.post-115240701188286055</id><published>2006-07-08T20:10:00.000-04:00</published><updated>2006-07-08T21:04:21.020-04:00</updated><title type='text'>72 Hour Game Development Competition</title><content type='html'>We're less than a week away from the next &lt;a href="http://www.pixel-arts.org/72/"&gt;72 Hour Game Development Competition&lt;/a&gt;, a competition that challenges contestants to create the best game they can in a 72 hour timeframe.  Originally a product of my boredom one lonely weekend, the competition has lasted over three years and inpsired well over 100 small games.   I've had to sit out the last two competitions, but I'm looking forward to finally creating something again.&lt;br /&gt;&lt;br /&gt;To give you an idea of how the competition works: for the next week, participants vote on a theme that the game will have to follow.  When that week ends, the theme is announced, which signals the beginning of the actual competition.  Participants then have 72 hours to create a game - starting from scratch - that follows that theme.  At the end of that time, all entries (finished or not) must be submitted for peer judging, and the results are later announced.&lt;br /&gt;&lt;br /&gt;We typically have between ten and thirty teams participating, and this time we're looking to have about fifteen.  Originally, most of the participants came from Pixelation (which no longer exists, but most of its members moved to &lt;a href="http://www.pixel-arts.org/pixelopolis/"&gt;Pixelopolis&lt;/a&gt;).  Now we get contestants from all over - &lt;a href="http://www.gamedev.net"&gt;GameDev&lt;/a&gt;, &lt;a href="http://www.devmaster.org"&gt;DevMasters&lt;/a&gt;, &lt;a href="http://www.ludumdare.com"&gt;LudumDare&lt;/a&gt;, and wherever else we can think to advertise.  All are welcome, and we always have a healthy mix of programmers, artists, and musicians.&lt;br /&gt;&lt;br /&gt;It's a whole lot of fun, and I welcome anyone who has the time to participate.  Barring that, you really oughtta check out the entries we get.  We've had some truly fantastic games submitted.&lt;br /&gt;&lt;a href="http://www.pixel-arts.org/72/"&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30715094-115240701188286055?l=geekophiliac.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekophiliac.blogspot.com/feeds/115240701188286055/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30715094&amp;postID=115240701188286055' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30715094/posts/default/115240701188286055'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30715094/posts/default/115240701188286055'/><link rel='alternate' type='text/html' href='http://geekophiliac.blogspot.com/2006/07/72-hour-game-development-competition.html' title='72 Hour Game Development Competition'/><author><name>Brian Sowers</name><uri>http://www.blogger.com/profile/04735666528079624327</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30715094.post-115232567957805131</id><published>2006-07-07T22:17:00.000-04:00</published><updated>2006-07-07T22:27:59.586-04:00</updated><title type='text'>Safe Cracking</title><content type='html'>It was my rather dubious task to break into a computer at work so that I could make that computer accessible  to a new employee.  There was no password available, so the only options were to either reformat the computer, retrieve a password, or clear the current passwords.&lt;br /&gt;&lt;br /&gt;Reformatting the computer was not an option, which is unfortunate not only because it was the simplest route, but also because the computer is running Windows 2000 when it should be running XP.  Retrieving the password proved difficult.  The original computer's owner had completely forgotten the old password, and the administrator password was not consistent with all the other administrator passwords in the lab.  I was left with the task of either cracking the password or simply clearing the old passwords.&lt;br /&gt;&lt;br /&gt;Clearing the old passwords ended up being my solution, and I largely recommend &lt;a href="http://ebcd.pcministry.com/"&gt;Emergency Boot CD&lt;/a&gt; for the task.  This program has many other purposes - backing up data, changing settings so that a computer can be fixed - but I can't say anything about that.  For clearing old passwords, it worked beautifully.  The only snag occured when I realized that Windows 2000 does not store its registry data in Windows/System32/config; instead, the path is Winnt/System32/config.  After overcoming that problem, I was able to reset the user passwords and grant myself administrator access.&lt;br /&gt;&lt;br /&gt;And then I went on a power trip and proclaimed myself king of the lab, which only got worse when I decided the lab was not grand enough.  King of all creation has an awfully nice melody to it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30715094-115232567957805131?l=geekophiliac.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekophiliac.blogspot.com/feeds/115232567957805131/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30715094&amp;postID=115232567957805131' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30715094/posts/default/115232567957805131'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30715094/posts/default/115232567957805131'/><link rel='alternate' type='text/html' href='http://geekophiliac.blogspot.com/2006/07/safe-cracking.html' title='Safe Cracking'/><author><name>Brian Sowers</name><uri>http://www.blogger.com/profile/04735666528079624327</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30715094.post-115224120189789237</id><published>2006-07-06T22:49:00.000-04:00</published><updated>2006-07-06T23:00:01.906-04:00</updated><title type='text'>ePSXe</title><content type='html'>In the interest of establishing street cred in this illustrious space, I'm-a kick things off old school: &lt;a href="http://www.epsxe.com"&gt;ePSXe.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;ePSXe is a fully functioning Playstation emulator that allows you to play PS1 games (even those copied &lt;span style="font-style: italic;"&gt;illegitimately&lt;/span&gt;) on your PC.  Its best feature is that it allows me to turn my laptop into a portable PS1.  Couple it with some PSX-&gt;USB controller adapters, and the experience is complete.&lt;br /&gt;&lt;br /&gt;Of course, the emulator isn't without its problems.  Initial setup can be a pain, requiring you to download a few plugins and play around with settings before things work.  Even then, the program does not close properly on my system.  I have to close it manually via the task manager.  A small price to play for such a handy toy.&lt;br /&gt;&lt;br /&gt;Speaking of PSX-&gt;USB controller adapters, I don't know that I can recommend the Radio Shack variety.  First, they won't work acceptably with a DDR pad - the way they handle input makes them incapable of registering when you step in two opposite directions at the same time.  Second, we've had some problems getting two to work at once in Linux.  Granted, this is probably our own fault, but I have no significant cause to blame &lt;span style="font-style: italic;"&gt;myself &lt;/span&gt;when Radio Shack is a monstrous corporate entity just &lt;span style="font-style: italic;"&gt;begging &lt;/span&gt;to be hated.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30715094-115224120189789237?l=geekophiliac.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekophiliac.blogspot.com/feeds/115224120189789237/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30715094&amp;postID=115224120189789237' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30715094/posts/default/115224120189789237'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30715094/posts/default/115224120189789237'/><link rel='alternate' type='text/html' href='http://geekophiliac.blogspot.com/2006/07/epsxe.html' title='ePSXe'/><author><name>Brian Sowers</name><uri>http://www.blogger.com/profile/04735666528079624327</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30715094.post-115220411955805006</id><published>2006-07-06T12:22:00.000-04:00</published><updated>2006-07-06T14:48:47.696-04:00</updated><title type='text'>Two Turntables and a Set of Headphones</title><content type='html'>I love music. I love listening to music. Thus, I have an iPod. I really can't recommend the little gadget more. I know a lot of people recommend other Portable Media Devices (PMDs, foo) for less money that have more features, but I'm a bit of an Apple fan-boy.&lt;br /&gt;&lt;br /&gt;Also, I had an issue about a year ago. My iPod went wonky, but the service was excellent. I simply visited a somewhat-nearby &lt;a href="http://www.apple.com/retail/shadyside/week/20060702.html"&gt;Apple Store&lt;/a&gt;, ran the diagnostic test to show the customer service rep there was an issue, and was handed a new iPod on the spot. No additional questions.&lt;br /&gt;&lt;br /&gt;However, I didn't get a new set of headphones. And after countless trips (to work everyday, two trips to Japan, two trips to Las Vegas, etc.) the little white suckers finally died. Actually the cable frayed and I lost signal to the left earbud, but they're dead &lt;span style="font-style:italic;"&gt;to me&lt;/span&gt;. I've read a lot of articles where people are openly hostile to the iPod earbuds, but they were adequate for my listening preferences. However, I didn't feel like shelling out $40 for the Apple replacements, nor did I find it worth the money.&lt;br /&gt;&lt;br /&gt;After suffering several days without my iPod I finally made a trip to Wal-Mart to buy some cheap headphones. I saw several on the shelf, but finally decided on a $5 pair of Koss earbuds. I returned to work after lunch excited to listen to my stash of mobile music once again. This was not the case.&lt;br /&gt;&lt;br /&gt;I &lt;span style="font-style:italic;"&gt;attempted&lt;/span&gt; to place the audio delivery mechanisms into my ears, only to find they were the worst crafted piece of equipment ever designed. I said it. Ever. Imagine trying to ram two 50 gallon drums of oil into  your admittedly smaller ear canal, then you'll begin to feel my pain. So deprived was I of my music that I continued my attempts. Only to achieve very sore ears and a pissed off attitude. The pain in my ear was only rivaled by the aching of my soul for my tuneage.&lt;br /&gt;&lt;br /&gt;At that moment I was ready to drop upwards of $50 on a new pair of earbuds. However, I was damn well going to do my research on earbuds if I was plunking down that much scrill. To my surprise, there was a definite lack of low to mid-range earbud reviews. There were plenty of reviews on the ridiculous &lt;a href="http://www.shure.com/PersonalAudio/Products/Earphones/ESeries/index.htm"&gt;Shure earbuds&lt;/a&gt;, but $100 and more was a little excessive.&lt;br /&gt;&lt;br /&gt;After several diligent Google searches to no avail I came to the conclusion that I still hold to be true; low to mid-range earbuds are all about the same quality. For a cheap set of headphones with such small components, there's only so much you can do. Except for Koss, they can still manager to fuck up hardcore.&lt;br /&gt;&lt;br /&gt;When I purchased the aforementioned demonseed headphones I also saw a pair of $10 Sonys, but decided to pass on them since I was probably going to buy a more expensive pair of Sonys. But, after I had my epihpany I decided to just drop the $10 on the earbuds and see what happens. That was a good idea.&lt;br /&gt;&lt;br /&gt;The earbuds I picked up look similar to &lt;a href="http://www.sonystyle.com/is-bin/INTERSHOP.enfinity/eCS/Store/en/-/USD/SY_DisplayProductInformation-Start?ProductSKU=MDRE829V&amp;Dept=audio&amp;CategoryName=pa_PADepartmentAccessories_Headphones_Fontopia%2e%2fEarbud"&gt;this&lt;/a&gt;, without the volume control:&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://www.sonystyle.com/intershoproot/eCS/Store/en/imagesProducts/650x650/MDRE829V.jpg"/&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;These little $10 earbuds were well-worth the price. I think they even sound better than the iPod headphones I had before (not that I was claiming they were all that great). My friend that recommended the Sonys before was pushing me to get the Shures for his own personal agenda. Since his efforts failed, he decided to pick them up on his own. The judgement? The Shures do sound better, but the improved quality doesn't justify the price. So, this isn't really a case of "you get what you pay for," but more "do your homework."&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30715094-115220411955805006?l=geekophiliac.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekophiliac.blogspot.com/feeds/115220411955805006/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30715094&amp;postID=115220411955805006' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30715094/posts/default/115220411955805006'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30715094/posts/default/115220411955805006'/><link rel='alternate' type='text/html' href='http://geekophiliac.blogspot.com/2006/07/two-turntables-and-set-of-headphones.html' title='Two Turntables and a Set of Headphones'/><author><name>Ricky</name><uri>http://www.blogger.com/profile/05379063540281664952</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://wvvel.csee.wvu.edu/rhussmann/moneyShot.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30715094.post-115219378380548494</id><published>2006-07-06T09:48:00.000-04:00</published><updated>2006-07-06T23:04:33.986-04:00</updated><title type='text'>Your Own Personal G-Dub</title><content type='html'>Trubie &lt;a href="http://www.youtube.com/watch?v=pc9y5ayeeb4"&gt;showed me the way&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30715094-115219378380548494?l=geekophiliac.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekophiliac.blogspot.com/feeds/115219378380548494/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30715094&amp;postID=115219378380548494' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30715094/posts/default/115219378380548494'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30715094/posts/default/115219378380548494'/><link rel='alternate' type='text/html' href='http://geekophiliac.blogspot.com/2006/07/your-own-personal-g-dub.html' title='Your Own Personal G-Dub'/><author><name>Ricky</name><uri>http://www.blogger.com/profile/05379063540281664952</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://wvvel.csee.wvu.edu/rhussmann/moneyShot.jpg'/></author><thr:total>0</thr:total></entry></feed>
