<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type='text/xsl' href='http://machaira.spaces.live.com/mmm2008-05-17_13.22/rsspretty.aspx?rssquery=en-US;http%3a%2f%2fmachaira.spaces.live.com%2fblog%2ffeed.rss' version='1.0'?><rss version="2.0" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:msn="http://schemas.microsoft.com/msn/spaces/2005/rss" xmlns:live="http://schemas.microsoft.com/live/spaces/2006/rss" xmlns:dcterms="http://purl.org/dc/terms/" xmlns:cf="http://www.microsoft.com/schemas/rss/core/2005" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Machaira's Space: Blog</title><description /><link>http://machaira.spaces.live.com/blog</link><language>en-US</language><pubDate>Fri, 18 Jul 2008 07:30:12 GMT</pubDate><lastBuildDate>Fri, 18 Jul 2008 07:30:12 GMT</lastBuildDate><generator>Microsoft Spaces v1.1</generator><docs>http://www.rssboard.org/rss-specification</docs><ttl>60</ttl><cf:parentRSS>http://machaira.spaces.live.com/feed.rss</cf:parentRSS><live:type>blog</live:type><live:identity><live:id>-4134251031648887394</live:id><live:alias>machaira</live:alias></live:identity><image><title>Machaira's Space: Blog</title><url>http://byfiles.storage.live.com/y1pXYly7L4WoLL3eDTG7iKSMjNXhE746DcmzFe-aVqiQSZCqj3rJWdgtnJaVyE7O34Q</url><link>http://machaira.spaces.live.com/blog</link></image><cf:listinfo><cf:group ns="http://schemas.microsoft.com/live/spaces/2006/rss" element="typelabel" label="Type" /><cf:group ns="http://schemas.microsoft.com/live/spaces/2006/rss" element="tag" label="Tag" /><cf:group element="category" label="Category" /><cf:sort element="pubDate" label="Date" data-type="date" default="true" /><cf:sort element="title" label="Title" data-type="string" /><cf:sort ns="http://purl.org/rss/1.0/modules/slash/" element="comments" label="Comments" data-type="number" /></cf:listinfo><item><title>Great XNA Zune game video</title><link>http://machaira.spaces.live.com/Blog/cns!C6A0309746469D9E!586.entry</link><description>&lt;p&gt;Found &lt;a href="http://www.youtube.com/watch?v=xKMDTS-hQqA&amp;amp;hl=en" target="_blank"&gt;this video&lt;/a&gt; on a post on &lt;a href="http://klucher.com/default.aspx" target="_blank"&gt;Michael Klucher’s blog&lt;/a&gt;. This looks pretty good for a PC game so the fact that it’s running on the Zune is very cool.&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-4134251031648887394&amp;page=RSS%3a+Great+XNA+Zune+game+video&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=machaira.spaces.live.com&amp;amp;GT1=machaira"&gt;</description><category>XNA</category><comments>http://machaira.spaces.live.com/Blog/cns!C6A0309746469D9E!586.entry#comment</comments><guid isPermaLink="true">http://machaira.spaces.live.com/Blog/cns!C6A0309746469D9E!586.entry</guid><pubDate>Mon, 09 Jun 2008 21:47:08 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://machaira.spaces.live.com/blog/cns!C6A0309746469D9E!586/comments/feed.rss</wfw:commentRss><wfw:comment>http://machaira.spaces.live.com/Blog/cns!C6A0309746469D9E!586.entry#comment</wfw:comment><dcterms:modified>2008-06-09T21:47:08Z</dcterms:modified></item><item><title>Yeah, I'm a slacker...</title><link>http://machaira.spaces.live.com/Blog/cns!C6A0309746469D9E!577.entry</link><description>&lt;p&gt;I'm recovering from back surgery that I had just over a week ago, so I figured I'm entitled. :) &lt;p&gt;What I'm doing: &lt;ul&gt; &lt;li&gt;Working on my second XNA book - this one on RPG development. I'm been going over the proof for the first one. Hopefully it'll be out early next month.  &lt;li&gt;Trying out the &lt;a href="http://creators.xna.com" target="_blank"&gt;new Creators Club site&lt;/a&gt;. If you haven't been there in a while, check it out. If you're a CC Premium member, there's over a dozen XNA games available on the Xbox 360 for you to try out. Woot!  &lt;li&gt;Writing a design doc for a game I've been trying to get done. Hopefully I'll get the game done in time for the next Dream-Build-Play contest.  &lt;li&gt;Trying out games on the Zune. Woot again!  &lt;li&gt;I uploaded &lt;a href="http://www.youtube.com/view_play_list?p=D2D42F5BDB1ACC76" target="_blank"&gt;a couple of videos&lt;/a&gt; to YouTube of me (and &lt;a href="http://www.ziggyware.com" target="_blank"&gt;Ziggy&lt;/a&gt;) doing some Rock Band that &lt;a href="http://www.thezbuffer.com/" target="_blank"&gt;Z-Man&lt;/a&gt; was kind enough to take at the 2008 MVP Summit.  &lt;li&gt;Other (boring to you guys, and sometimes me) non-games development related stuff. :(&lt;/ul&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-4134251031648887394&amp;page=RSS%3a+Yeah%2c+I'm+a+slacker...&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=machaira.spaces.live.com&amp;amp;GT1=machaira"&gt;</description><comments>http://machaira.spaces.live.com/Blog/cns!C6A0309746469D9E!577.entry#comment</comments><guid isPermaLink="true">http://machaira.spaces.live.com/Blog/cns!C6A0309746469D9E!577.entry</guid><pubDate>Thu, 29 May 2008 20:47:15 GMT</pubDate><slash:comments>2</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://machaira.spaces.live.com/blog/cns!C6A0309746469D9E!577/comments/feed.rss</wfw:commentRss><wfw:comment>http://machaira.spaces.live.com/Blog/cns!C6A0309746469D9E!577.entry#comment</wfw:comment><dcterms:modified>2008-05-29T20:47:15Z</dcterms:modified></item><item><title>Back from the MVP Summit</title><link>http://machaira.spaces.live.com/Blog/cns!C6A0309746469D9E!560.entry</link><description>&lt;p&gt;Yes, I've been slacking off again, but for the past week I had an excuse (kinda). I was at the Microsoft MVP Summit learning about all the cool stuff that's coming and playing with my new Zune. :) &lt;p&gt;All kinds of silly (and not so silly) ideas were tossed around by the XNA MVPs and I threw together one of them - &lt;a href="http://machxgames.com/files/downloads/games/Endurance.zip" target="_blank"&gt;Endurance&lt;/a&gt;. It's a silly little game, but knowing the competitive nature of gamers, someone will keep it going for wayyyyy too long. :D &lt;p&gt;Our friend &lt;a href="http://geekswithblogs.net/clingermangw/Default.aspx" target="_blank"&gt;George&lt;/a&gt; was the originator of this one, so &lt;a href="http://www.xnadevelopment.com/index.shtml" target="_blank"&gt;go blame him&lt;/a&gt; if you'd like.&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-4134251031648887394&amp;page=RSS%3a+Back+from+the+MVP+Summit&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=machaira.spaces.live.com&amp;amp;GT1=machaira"&gt;</description><category>XNA</category><comments>http://machaira.spaces.live.com/Blog/cns!C6A0309746469D9E!560.entry#comment</comments><guid isPermaLink="true">http://machaira.spaces.live.com/Blog/cns!C6A0309746469D9E!560.entry</guid><pubDate>Mon, 21 Apr 2008 19:44:03 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://machaira.spaces.live.com/blog/cns!C6A0309746469D9E!560/comments/feed.rss</wfw:commentRss><wfw:comment>http://machaira.spaces.live.com/Blog/cns!C6A0309746469D9E!560.entry#comment</wfw:comment><dcterms:modified>2008-04-21T19:44:03Z</dcterms:modified></item><item><title>XNA Game Studio Quickie</title><link>http://machaira.spaces.live.com/Blog/cns!C6A0309746469D9E!554.entry</link><description>&lt;p&gt;&lt;a href="http://on10.net/" target="_blank"&gt;Channel 10&lt;/a&gt; has been giving XNA GS some love for a while now. &lt;a href="http://on10.net/People/Laura/" target="_blank"&gt;Laura Foy&lt;/a&gt; made another post last night that you can check out &lt;a href="http://on10.net/blogs/laura/XNA-Challenge/" target="_blank"&gt;here&lt;/a&gt;. Hit the XNA tag on the post for more good stuff.&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-4134251031648887394&amp;page=RSS%3a+XNA+Game+Studio+Quickie&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=machaira.spaces.live.com&amp;amp;GT1=machaira"&gt;</description><category>XNA</category><comments>http://machaira.spaces.live.com/Blog/cns!C6A0309746469D9E!554.entry#comment</comments><guid isPermaLink="true">http://machaira.spaces.live.com/Blog/cns!C6A0309746469D9E!554.entry</guid><pubDate>Wed, 26 Mar 2008 11:15:05 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://machaira.spaces.live.com/blog/cns!C6A0309746469D9E!554/comments/feed.rss</wfw:commentRss><wfw:comment>http://machaira.spaces.live.com/Blog/cns!C6A0309746469D9E!554.entry#comment</wfw:comment><dcterms:modified>2008-03-26T11:15:05Z</dcterms:modified></item><item><title>Some bad news and some good news</title><link>http://machaira.spaces.live.com/Blog/cns!C6A0309746469D9E!546.entry</link><description>&lt;p&gt;The bad news would be for those 2 or 3 people that were following my RPG series and waiting for the next part. I'm afraid that series is going to be discontinued. :(  The good news is that I'm starting a much larger version of it. More info will follow soon. :) &lt;p&gt;  &lt;p&gt;I've been fiddling around with this RPG and associated book/text since my VB 6 days. It's great that it'll finally see the light of day. &lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-4134251031648887394&amp;page=RSS%3a+Some+bad+news+and+some+good+news&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=machaira.spaces.live.com&amp;amp;GT1=machaira"&gt;</description><category>XNA</category><comments>http://machaira.spaces.live.com/Blog/cns!C6A0309746469D9E!546.entry#comment</comments><guid isPermaLink="true">http://machaira.spaces.live.com/Blog/cns!C6A0309746469D9E!546.entry</guid><pubDate>Thu, 20 Mar 2008 17:56:27 GMT</pubDate><slash:comments>8</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://machaira.spaces.live.com/blog/cns!C6A0309746469D9E!546/comments/feed.rss</wfw:commentRss><wfw:comment>http://machaira.spaces.live.com/Blog/cns!C6A0309746469D9E!546.entry#comment</wfw:comment><dcterms:modified>2008-03-20T17:56:27Z</dcterms:modified></item><item><title>Dishwasher makes OXM</title><link>http://machaira.spaces.live.com/Blog/cns!C6A0309746469D9E!524.entry</link><description>&lt;p&gt;Check out the latest issue (April 08) of the Official Xbox Magazine. On page 54 you'll notice that The Dishwasher: Dead Samurai game created with XNA Game Studio is included in the list of upcoming Xbox Live Arcade games. Very nice. Another known commercial  XNA GS game, Schizoid, is also included on that page. It looks like XNA Game Studio is set to take over the gaming industry, especially come the end of this year when we'll have the ability to publish XNA GS games to Live Arcade. :)&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-4134251031648887394&amp;page=RSS%3a+Dishwasher+makes+OXM&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=machaira.spaces.live.com&amp;amp;GT1=machaira"&gt;</description><category>XNA</category><comments>http://machaira.spaces.live.com/Blog/cns!C6A0309746469D9E!524.entry#comment</comments><guid isPermaLink="true">http://machaira.spaces.live.com/Blog/cns!C6A0309746469D9E!524.entry</guid><pubDate>Wed, 05 Mar 2008 21:28:32 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://machaira.spaces.live.com/blog/cns!C6A0309746469D9E!524/comments/feed.rss</wfw:commentRss><wfw:comment>http://machaira.spaces.live.com/Blog/cns!C6A0309746469D9E!524.entry#comment</wfw:comment><dcterms:modified>2008-03-05T21:29:58Z</dcterms:modified></item><item><title>A picture is worth a thousand words</title><link>http://machaira.spaces.live.com/Blog/cns!C6A0309746469D9E!521.entry</link><description>&lt;p&gt;Or a thousand HP in this case: &lt;p&gt;  &lt;p&gt;&lt;img src="http://www.penny-arcade.com/images/2008/20080304.jpg"&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-4134251031648887394&amp;page=RSS%3a+A+picture+is+worth+a+thousand+words&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=machaira.spaces.live.com&amp;amp;GT1=machaira"&gt;</description><category>Games</category><comments>http://machaira.spaces.live.com/Blog/cns!C6A0309746469D9E!521.entry#comment</comments><guid isPermaLink="true">http://machaira.spaces.live.com/Blog/cns!C6A0309746469D9E!521.entry</guid><pubDate>Wed, 05 Mar 2008 14:19:06 GMT</pubDate><slash:comments>2</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://machaira.spaces.live.com/blog/cns!C6A0309746469D9E!521/comments/feed.rss</wfw:commentRss><wfw:comment>http://machaira.spaces.live.com/Blog/cns!C6A0309746469D9E!521.entry#comment</wfw:comment><dcterms:modified>2008-03-05T14:19:06Z</dcterms:modified></item><item><title>Iron Man Movie Trailer</title><link>http://machaira.spaces.live.com/Blog/cns!C6A0309746469D9E!517.entry</link><description>&lt;p&gt;OK, so this is a little old, but it's still &lt;a href="http://link.brightcove.com/services/link/bcpid1388782857/bctid1442372066" target="_blank"&gt;freakin' cool&lt;/a&gt;! The movie is looking great so far. It might actually live up to us fanboy's expectations. :)&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-4134251031648887394&amp;page=RSS%3a+Iron+Man+Movie+Trailer&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=machaira.spaces.live.com&amp;amp;GT1=machaira"&gt;</description><category>Movies</category><comments>http://machaira.spaces.live.com/Blog/cns!C6A0309746469D9E!517.entry#comment</comments><guid isPermaLink="true">http://machaira.spaces.live.com/Blog/cns!C6A0309746469D9E!517.entry</guid><pubDate>Wed, 05 Mar 2008 03:44:41 GMT</pubDate><slash:comments>4</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://machaira.spaces.live.com/blog/cns!C6A0309746469D9E!517/comments/feed.rss</wfw:commentRss><wfw:comment>http://machaira.spaces.live.com/Blog/cns!C6A0309746469D9E!517.entry#comment</wfw:comment><dcterms:modified>2008-03-05T03:44:41Z</dcterms:modified></item><item><title>GDC Expo Floor Video</title><link>http://machaira.spaces.live.com/Blog/cns!C6A0309746469D9E!508.entry</link><description>&lt;p&gt;So you didn't get to attend this year's GDC (like me :( ) and you missed all the goodness of the GDC Expo. We'll Dave Mark has come to your rescue. &lt;a href="http://www.intrinsicalgorithm.com/IANews/2008/02/gdc-expo-floor-in-10-minutes.html" target="_blank"&gt;Here's&lt;/a&gt; his &amp;quot;Expo in 10 minutes&amp;quot; post with accompanying video.&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-4134251031648887394&amp;page=RSS%3a+GDC+Expo+Floor+Video&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=machaira.spaces.live.com&amp;amp;GT1=machaira"&gt;</description><category>Game Industry</category><comments>http://machaira.spaces.live.com/Blog/cns!C6A0309746469D9E!508.entry#comment</comments><guid isPermaLink="true">http://machaira.spaces.live.com/Blog/cns!C6A0309746469D9E!508.entry</guid><pubDate>Mon, 03 Mar 2008 17:58:46 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://machaira.spaces.live.com/blog/cns!C6A0309746469D9E!508/comments/feed.rss</wfw:commentRss><wfw:comment>http://machaira.spaces.live.com/Blog/cns!C6A0309746469D9E!508.entry#comment</wfw:comment><dcterms:modified>2008-03-03T17:58:46Z</dcterms:modified></item><item><title>XNA Game Distribution Info</title><link>http://machaira.spaces.live.com/Blog/cns!C6A0309746469D9E!505.entry</link><description>&lt;p&gt;Gamasutra has posted a &lt;a href="http://www.gamasutra.com/view/feature/3545/sponsored_feature_democratizing_.php" target="_blank"&gt;nice article&lt;/a&gt; detailing the steps for the up-coming XNA community game distribution model.&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-4134251031648887394&amp;page=RSS%3a+XNA+Game+Distribution+Info&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=machaira.spaces.live.com&amp;amp;GT1=machaira"&gt;</description><category>XNA</category><comments>http://machaira.spaces.live.com/Blog/cns!C6A0309746469D9E!505.entry#comment</comments><guid isPermaLink="true">http://machaira.spaces.live.com/Blog/cns!C6A0309746469D9E!505.entry</guid><pubDate>Fri, 22 Feb 2008 20:58:08 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://machaira.spaces.live.com/blog/cns!C6A0309746469D9E!505/comments/feed.rss</wfw:commentRss><wfw:comment>http://machaira.spaces.live.com/Blog/cns!C6A0309746469D9E!505.entry#comment</wfw:comment><dcterms:modified>2008-02-22T20:58:08Z</dcterms:modified></item><item><title>Zune XNA Game Video</title><link>http://machaira.spaces.live.com/Blog/cns!C6A0309746469D9E!504.entry</link><description>&lt;p&gt;Unfortunately, I can't embed from MSN Video (at least I couldn't figure it out in the 2 minutes I spent trying), but you can check it out &lt;a href="http://video.msn.com/video.aspx?mkt=en-us&amp;amp;vid=a97849b2-c46d-41d3-b3d5-69060d4d95f4" target="_blank"&gt;here&lt;/a&gt;.&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-4134251031648887394&amp;page=RSS%3a+Zune+XNA+Game+Video&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=machaira.spaces.live.com&amp;amp;GT1=machaira"&gt;</description><category>XNA</category><comments>http://machaira.spaces.live.com/Blog/cns!C6A0309746469D9E!504.entry#comment</comments><guid isPermaLink="true">http://machaira.spaces.live.com/Blog/cns!C6A0309746469D9E!504.entry</guid><pubDate>Thu, 21 Feb 2008 15:45:23 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://machaira.spaces.live.com/blog/cns!C6A0309746469D9E!504/comments/feed.rss</wfw:commentRss><wfw:comment>http://machaira.spaces.live.com/Blog/cns!C6A0309746469D9E!504.entry#comment</wfw:comment><dcterms:modified>2008-02-21T15:45:23Z</dcterms:modified></item><item><title>MS GDC Keynote Information Revealed</title><link>http://machaira.spaces.live.com/Blog/cns!C6A0309746469D9E!503.entry</link><description>&lt;p&gt;I've posted this to a couple of places already, but &lt;a href="http://www.igda.org/Forums/showthread.php?s=2a9495c79ce768c8a06ee15bc446e127&amp;amp;threadid=30919" target="_blank"&gt;this post&lt;/a&gt; is probably a good one to link to. &lt;p&gt;  &lt;p&gt;/me gets back to work on a game for the beta &lt;p&gt;  &lt;p&gt;edit: Gamasutra now has &lt;a href="http://www.gamasutra.com/gdc2008/index.php?id=17532" target="_blank"&gt;their review&lt;/a&gt; up&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-4134251031648887394&amp;page=RSS%3a+MS+GDC+Keynote+Information+Revealed&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=machaira.spaces.live.com&amp;amp;GT1=machaira"&gt;</description><category>XNA</category><comments>http://machaira.spaces.live.com/Blog/cns!C6A0309746469D9E!503.entry#comment</comments><guid isPermaLink="true">http://machaira.spaces.live.com/Blog/cns!C6A0309746469D9E!503.entry</guid><pubDate>Wed, 20 Feb 2008 20:32:50 GMT</pubDate><slash:comments>1</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://machaira.spaces.live.com/blog/cns!C6A0309746469D9E!503/comments/feed.rss</wfw:commentRss><wfw:comment>http://machaira.spaces.live.com/Blog/cns!C6A0309746469D9E!503.entry#comment</wfw:comment><dcterms:modified>2008-02-20T20:51:19Z</dcterms:modified></item><item><title>XNA Live Arcade extensions unveiled</title><link>http://machaira.spaces.live.com/Blog/cns!C6A0309746469D9E!502.entry</link><description>&lt;p&gt;From &lt;a href="http://www.developmag.com/news/29311/Microsoft-unveils-XNA-Live-Arcade-extensions" target="_blank"&gt;this article&lt;/a&gt;, looks like MS revealed something before the keynote tomorrow. Pro developers that aren't doing cutting edge games shouldn't have many reasons left not to adopt XNA Game Studio now.&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-4134251031648887394&amp;page=RSS%3a+XNA+Live+Arcade+extensions+unveiled&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=machaira.spaces.live.com&amp;amp;GT1=machaira"&gt;</description><category>XNA</category><comments>http://machaira.spaces.live.com/Blog/cns!C6A0309746469D9E!502.entry#comment</comments><guid isPermaLink="true">http://machaira.spaces.live.com/Blog/cns!C6A0309746469D9E!502.entry</guid><pubDate>Tue, 19 Feb 2008 22:42:12 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://machaira.spaces.live.com/blog/cns!C6A0309746469D9E!502/comments/feed.rss</wfw:commentRss><wfw:comment>http://machaira.spaces.live.com/Blog/cns!C6A0309746469D9E!502.entry#comment</wfw:comment><dcterms:modified>2008-02-19T22:42:12Z</dcterms:modified></item><item><title>Dream-Build-Play Warm-up Winners Announced</title><link>http://machaira.spaces.live.com/Blog/cns!C6A0309746469D9E!501.entry</link><description>&lt;p&gt;Five winners were &lt;a href="http://dreambuildplay.com/main/winners.aspx" target="_blank"&gt;announced&lt;/a&gt; yesterday. Congrats to all. I haven't had a chance to play any of the games, but I'm hoping to find some time. Now we just have to wait for the main competition to start. :)&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-4134251031648887394&amp;page=RSS%3a+Dream-Build-Play+Warm-up+Winners+Announced&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=machaira.spaces.live.com&amp;amp;GT1=machaira"&gt;</description><category>XNA</category><comments>http://machaira.spaces.live.com/Blog/cns!C6A0309746469D9E!501.entry#comment</comments><guid isPermaLink="true">http://machaira.spaces.live.com/Blog/cns!C6A0309746469D9E!501.entry</guid><pubDate>Tue, 19 Feb 2008 13:24:16 GMT</pubDate><slash:comments>1</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://machaira.spaces.live.com/blog/cns!C6A0309746469D9E!501/comments/feed.rss</wfw:commentRss><wfw:comment>http://machaira.spaces.live.com/Blog/cns!C6A0309746469D9E!501.entry#comment</wfw:comment><dcterms:modified>2008-02-19T13:24:16Z</dcterms:modified></item><item><title>New Xbox Live in the works?</title><link>http://machaira.spaces.live.com/Blog/cns!C6A0309746469D9E!500.entry</link><description>&lt;p&gt;According to &lt;a href="http://www.gamesindustry.biz/content_page.php?aid=33229" target="_blank"&gt;this article&lt;/a&gt;, it's possible. Combine that with the title of the &lt;a href="http://www.gdconf.com/conference/keynotes.htm" target="_blank"&gt;MS keynote&lt;/a&gt; at the Game Developers Conference and I think we'll see some interesting things in the near future from Microsoft. Stay tuned Wednesday when MS will reveal what's in store.&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-4134251031648887394&amp;page=RSS%3a+New+Xbox+Live+in+the+works%3f&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=machaira.spaces.live.com&amp;amp;GT1=machaira"&gt;</description><comments>http://machaira.spaces.live.com/Blog/cns!C6A0309746469D9E!500.entry#comment</comments><guid isPermaLink="true">http://machaira.spaces.live.com/Blog/cns!C6A0309746469D9E!500.entry</guid><pubDate>Tue, 19 Feb 2008 00:36:41 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://machaira.spaces.live.com/blog/cns!C6A0309746469D9E!500/comments/feed.rss</wfw:commentRss><wfw:comment>http://machaira.spaces.live.com/Blog/cns!C6A0309746469D9E!500.entry#comment</wfw:comment><dcterms:modified>2008-02-19T00:36:41Z</dcterms:modified></item><item><title>Attend the GDC virtually through your Xbox 360</title><link>http://machaira.spaces.live.com/Blog/cns!C6A0309746469D9E!499.entry</link><description>&lt;font face=Tahoma size=2&gt;See &lt;a href="http://gameinfowire.com/news.asp?nid=11710" target="_blank"&gt;here&lt;/a&gt;.&lt;/font&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-4134251031648887394&amp;page=RSS%3a+Attend+the+GDC+virtually+through+your+Xbox+360&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=machaira.spaces.live.com&amp;amp;GT1=machaira"&gt;</description><category>Game Industry</category><comments>http://machaira.spaces.live.com/Blog/cns!C6A0309746469D9E!499.entry#comment</comments><guid isPermaLink="true">http://machaira.spaces.live.com/Blog/cns!C6A0309746469D9E!499.entry</guid><pubDate>Fri, 15 Feb 2008 03:47:32 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://machaira.spaces.live.com/blog/cns!C6A0309746469D9E!499/comments/feed.rss</wfw:commentRss><wfw:comment>http://machaira.spaces.live.com/Blog/cns!C6A0309746469D9E!499.entry#comment</wfw:comment><dcterms:modified>2008-02-15T03:47:32Z</dcterms:modified></item><item><title>HLSL Syntax Highlighting</title><link>http://machaira.spaces.live.com/Blog/cns!C6A0309746469D9E!490.entry</link><description>&lt;p&gt;From &lt;a href="http://forums.xna.com/thread/41779.aspx" target="_blank"&gt;this post&lt;/a&gt; in the Creators Club forums: &lt;p&gt;  &lt;blockquote&gt; &lt;p&gt;InteliShade is an add-in for Visual Studio 2005 non-Express SKUs (Add-ins are not allowed in Express) that enabled syntax highlighting in your HLSL (.fx) files. New features in Beta 1.2 also include auto-completion (hit Ctrl-Space to open intelisense) and tooltip styled documentation (hovering over texture tells you what kind of object it is). All known performance issues have been taken care of. &lt;p&gt;So try it out and suggest some ideas and opinions on how to improve it! &lt;p&gt;&lt;a href="http://intelishade.net/files/folders/beta_releases/entry41.aspx"&gt;http://intelishade.net/files/folders/beta_releases/entry41.aspx&lt;/a&gt;&lt;/blockquote&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-4134251031648887394&amp;page=RSS%3a+HLSL+Syntax+Highlighting&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=machaira.spaces.live.com&amp;amp;GT1=machaira"&gt;</description><category>Programming</category><comments>http://machaira.spaces.live.com/Blog/cns!C6A0309746469D9E!490.entry#comment</comments><guid isPermaLink="true">http://machaira.spaces.live.com/Blog/cns!C6A0309746469D9E!490.entry</guid><pubDate>Wed, 16 Jan 2008 12:39:24 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://machaira.spaces.live.com/blog/cns!C6A0309746469D9E!490/comments/feed.rss</wfw:commentRss><wfw:comment>http://machaira.spaces.live.com/Blog/cns!C6A0309746469D9E!490.entry#comment</wfw:comment><dcterms:modified>2008-01-16T12:39:24Z</dcterms:modified></item><item><title>2007 Darwin Awards</title><link>http://machaira.spaces.live.com/Blog/cns!C6A0309746469D9E!489.entry</link><description>&lt;p&gt;Seems there's no limit to the amount of stupid people in this world. It continually amazes me that people willingly do things that they don't need to do that are potentially fatal. You can read about the departed &lt;a href="http://darwinawards.com/darwin/darwin2007.html" target="_blank"&gt;here&lt;/a&gt;.&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-4134251031648887394&amp;page=RSS%3a+2007+Darwin+Awards&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=machaira.spaces.live.com&amp;amp;GT1=machaira"&gt;</description><comments>http://machaira.spaces.live.com/Blog/cns!C6A0309746469D9E!489.entry#comment</comments><guid isPermaLink="true">http://machaira.spaces.live.com/Blog/cns!C6A0309746469D9E!489.entry</guid><pubDate>Mon, 14 Jan 2008 14:15:59 GMT</pubDate><slash:comments>1</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://machaira.spaces.live.com/blog/cns!C6A0309746469D9E!489/comments/feed.rss</wfw:commentRss><wfw:comment>http://machaira.spaces.live.com/Blog/cns!C6A0309746469D9E!489.entry#comment</wfw:comment><dcterms:modified>2008-01-14T14:15:59Z</dcterms:modified></item><item><title>Breakout level class</title><link>http://machaira.spaces.live.com/Blog/cns!C6A0309746469D9E!488.entry</link><description>&lt;p&gt;Threw this code together in about 5 minutes in response to a question on gamedev.net and figured I'd throw it out here for anyone that's interested. I make no claims about it being the ideal way to do a Breakout level. :) &lt;p&gt; &lt;pre&gt;    &lt;span&gt;public&lt;/span&gt; &lt;span&gt;class&lt;/span&gt; Brick
    {
        &lt;span&gt;private&lt;/span&gt; BoundingBox _box;
        &lt;span&gt;private&lt;/span&gt; Vector2 _location;
        &lt;span&gt;private&lt;/span&gt; &lt;span&gt;bool&lt;/span&gt; _alive;

        &lt;span&gt;public&lt;/span&gt; Brick(Vector2 location)
        {
            _location = location;
            _box = &lt;span&gt;new&lt;/span&gt; BoundingBox(&lt;span&gt;new&lt;/span&gt; Vector3(location.X, location.Y, 0), &lt;span&gt;new&lt;/span&gt; Vector3(location.X * Level.BrickWidth, location.Y * Level.BrickHeight, 0));
            _alive = &lt;span&gt;true&lt;/span&gt;;
        }

        &lt;span&gt;public&lt;/span&gt; Vector2 Location
        {
            get { &lt;span&gt;return&lt;/span&gt; _location; }
        }

        &lt;span&gt;public&lt;/span&gt; &lt;span&gt;bool&lt;/span&gt; Alive
        {
            get { &lt;span&gt;return&lt;/span&gt; _alive; }
        }

        &lt;span&gt;public&lt;/span&gt; BoundingBox Box
        {
            get { &lt;span&gt;return&lt;/span&gt; _box; }
        }
            
        &lt;span&gt;public&lt;/span&gt; &lt;span&gt;void&lt;/span&gt; Kill()
        {
            _alive = &lt;span&gt;false&lt;/span&gt;;
        }
    }

    &lt;span&gt;public&lt;/span&gt; &lt;span&gt;class&lt;/span&gt; Level
    {
        &lt;span&gt;public&lt;/span&gt; &lt;span&gt;const&lt;/span&gt; &lt;span&gt;int&lt;/span&gt; BrickWidth = 32;
        &lt;span&gt;public&lt;/span&gt; &lt;span&gt;const&lt;/span&gt; &lt;span&gt;int&lt;/span&gt; BrickHeight = 8;

        &lt;span&gt;private&lt;/span&gt; List&amp;lt;Brick&amp;gt; _bricks;

        &lt;span&gt;public&lt;/span&gt; Level(&lt;span&gt;int&lt;/span&gt; rows, &lt;span&gt;int&lt;/span&gt; cols)
        {
            _bricks = &lt;span&gt;new&lt;/span&gt; List&amp;lt;Brick&amp;gt;();

            Brick brick;

            &lt;span&gt;for&lt;/span&gt; (&lt;span&gt;int&lt;/span&gt; x = 0; x&amp;lt;cols;x++)
            {
                &lt;span&gt;for&lt;/span&gt; (&lt;span&gt;int&lt;/span&gt; y = 0;y&amp;lt;rows;y++)
                {
                    brick = &lt;span&gt;new&lt;/span&gt; Brick(&lt;span&gt;new&lt;/span&gt; Vector2(x * BrickWidth, y * BrickHeight));
                    _bricks.Add(brick);
                }
            }
        }

        &lt;span&gt;public&lt;/span&gt; &lt;span&gt;void&lt;/span&gt; LevelUp(&lt;span&gt;int&lt;/span&gt; rows, &lt;span&gt;int&lt;/span&gt; cols)
        {
            _bricks.Clear();

            Brick brick;

            &lt;span&gt;for&lt;/span&gt; (&lt;span&gt;int&lt;/span&gt; x = 0; x &amp;lt; cols; x++)
            {
                &lt;span&gt;for&lt;/span&gt; (&lt;span&gt;int&lt;/span&gt; y = 0; y &amp;lt; rows; y++)
                {
                    brick = &lt;span&gt;new&lt;/span&gt; Brick(&lt;span&gt;new&lt;/span&gt; Vector2(x * BrickWidth, y * BrickHeight));
                    _bricks.Add(brick);
                }
            }
        }

        &lt;span&gt;public&lt;/span&gt; &lt;span&gt;bool&lt;/span&gt; CheckForCollision(BoundingBox ball)
        {
            BoundingBox brick;
            Vector2 location;
            &lt;span&gt;bool&lt;/span&gt; ret = &lt;span&gt;false&lt;/span&gt;;

            &lt;span&gt;for&lt;/span&gt; (&lt;span&gt;int&lt;/span&gt; i = 0; i &amp;lt; _bricks.Count; i++)
            {
                &lt;span&gt;if&lt;/span&gt; (_bricks[i].Alive)
                {
                    ret = ball.Intersects(_bricks[i].Box);

                    &lt;span&gt;if&lt;/span&gt; (ret)
                    {
                        _bricks[i].Kill();
                        &lt;span&gt;break&lt;/span&gt;;
                    }
                }
            }

            &lt;span&gt;return&lt;/span&gt; ret;
        }

        &lt;span&gt;public&lt;/span&gt; &lt;span&gt;void&lt;/span&gt; Render()
        {
            &lt;span&gt;for&lt;/span&gt; (&lt;span&gt;int&lt;/span&gt; i = 0; i &amp;lt; _bricks.Count; i++)
            {
                &lt;span&gt;if&lt;/span&gt; (_bricks[i].Alive)
                {
                    &lt;span&gt;//render&lt;/span&gt;
                }
            }

        }
    }
&lt;/pre&gt;
&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-4134251031648887394&amp;page=RSS%3a+Breakout+level+class&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=machaira.spaces.live.com&amp;amp;GT1=machaira"&gt;</description><category>Programming</category><comments>http://machaira.spaces.live.com/Blog/cns!C6A0309746469D9E!488.entry#comment</comments><guid isPermaLink="true">http://machaira.spaces.live.com/Blog/cns!C6A0309746469D9E!488.entry</guid><pubDate>Thu, 10 Jan 2008 20:55:33 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://machaira.spaces.live.com/blog/cns!C6A0309746469D9E!488/comments/feed.rss</wfw:commentRss><wfw:comment>http://machaira.spaces.live.com/Blog/cns!C6A0309746469D9E!488.entry#comment</wfw:comment><dcterms:modified>2008-01-10T20:55:33Z</dcterms:modified></item><item><title>MVP Status Renewed!</title><link>http://machaira.spaces.live.com/Blog/cns!C6A0309746469D9E!485.entry</link><description>&lt;p&gt;Yes, MS saw fit to renew my MVP Award for another year. I guess I did something worthwhile during the year to earn it. Since George will make me look bad with &lt;a href="http://geekswithblogs.net/clingermangw/archive/2008/01/01/118113.aspx" target="_blank"&gt;his list&lt;/a&gt;, I'll have to do one myself. :) &lt;p&gt;  &lt;p&gt;&lt;strong&gt;&lt;u&gt;XBL Radio Podcast&lt;/u&gt;&lt;/strong&gt; &lt;p&gt;I started the year off by participating in a podcast with the guys over at XBL Radio and a couple of developers talking about XNA and the possibility for gamers and game developers. You can download the podcast from &lt;a href="http://www.xblpodcast.com/media/podcast/XBLIVE34.5.mp3" target="_blank"&gt;here&lt;/a&gt;. &lt;p&gt;  &lt;p&gt;&lt;u&gt;&lt;strong&gt;Tech Editing&lt;/strong&gt;&lt;/u&gt; &lt;p&gt;I did the tech edits for two XNA books, Ben Nitschke's &lt;a href="http://www.amazon.com/Professional-XNA-Game-Programming-Windows/dp/0470126779/ref=pd_bbs_sr_1/103-0412737-9835841?ie=UTF8&amp;amp;s=books&amp;amp;qid=1174084376&amp;amp;sr=8-1" target="_blank"&gt;Pro XNA Game Programming book&lt;/a&gt; and the as-yet-unreleased &lt;a href="http://www.amazon.com/Expert-One-One-Game-Programming/dp/0470149485/ref=pd_bbs_sr_3/103-0412737-9835841?ie=UTF8&amp;amp;s=books&amp;amp;qid=1174084376&amp;amp;sr=8-3" target="_blank"&gt;Expert One-on-One XNA Game Programming book&lt;/a&gt;. &lt;p&gt;  &lt;p&gt;&lt;u&gt;&lt;strong&gt;Forums&lt;/strong&gt;&lt;/u&gt; &lt;p&gt;I continued helping out on a couple of forums - the Creators Club site &lt;a href="http://forums.xna.com/" target="_blank"&gt;forums&lt;/a&gt;, &lt;a href="http://www.gamedev.net/community/forums" target="_blank"&gt;GameDev.net&lt;/a&gt;, and the Game Programming Wiki &lt;a href="http://www.gpwiki.org/forums/" target="_blank"&gt;forums&lt;/a&gt;, although my posts on the CC forums lagged behind a couple of others. But hey, one of them is on the XNA team and another sits around the house for a living, supposedly doing software development (yes, I'm talking about &lt;a href="http://www.thezbuffer.com/" target="_blank"&gt;the Z-Man&lt;/a&gt; ;) ). I'm guessing &lt;a href="http://nick.gravelyn.com/" target="_blank"&gt;Nick&lt;/a&gt; just doesn't have a life (even more so than me) to have upped his post count so greatly. &lt;p&gt;  &lt;p&gt;&lt;strong&gt;&lt;u&gt;Blog&lt;/u&gt;&lt;/strong&gt; &lt;p&gt;Although I didn't make as many posts as I wanted on this blog, I think I did manage to get a couple out there that someone hopefully found useful. I'm determined to finish my serious on RPG game dev using XNA and get my RPG Starter Kit out there before MS releases theirs. :) &lt;p&gt;  &lt;p&gt;&lt;u&gt;&lt;strong&gt;XNA Book&lt;/strong&gt;&lt;/u&gt; &lt;p&gt;I guess the biggest thing I worked on was &lt;a href="http://www.amazon.com/Essential-XNA-2-0-Game-Programming/dp/1598220551/ref=pd_bbs_sr_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1199826713&amp;amp;sr=8-1" target="_blank"&gt;the book&lt;/a&gt; I'm co-authoring for Wordware. While not quite aimed at the same audience as Ben's, hopefully it'll help people out. The fact that it's been updated for XNA Game Studio 2.0 (which threw a big wrench in the works and has delayed it a bit) is a plus. I'd love opportunity to do another, maybe on RPG game development in XNA (maybe even an MMORPG!!! :D OK, so it wouldn't be an MMO, but it's cool to dream, right!?) &lt;p&gt;  &lt;p&gt;Maybe George and I will set a precedent for the other XNA MVPs and we'll get more of us talking about how great game development using XNA GS can be! ;)&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-4134251031648887394&amp;page=RSS%3a+MVP+Status+Renewed!&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=machaira.spaces.live.com&amp;amp;GT1=machaira"&gt;</description><category>MVP</category><comments>http://machaira.spaces.live.com/Blog/cns!C6A0309746469D9E!485.entry#comment</comments><guid isPermaLink="true">http://machaira.spaces.live.com/Blog/cns!C6A0309746469D9E!485.entry</guid><pubDate>Tue, 08 Jan 2008 21:19:49 GMT</pubDate><slash:comments>2</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://machaira.spaces.live.com/blog/cns!C6A0309746469D9E!485/comments/feed.rss</wfw:commentRss><wfw:comment>http://machaira.spaces.live.com/Blog/cns!C6A0309746469D9E!485.entry#comment</wfw:comment><dcterms:modified>2008-01-08T21:19:49Z</dcterms:modified></item><item><title>Fun Quiz Time</title><link>http://machaira.spaces.live.com/Blog/cns!C6A0309746469D9E!483.entry</link><description>&lt;p&gt;Stumbled across these in one of my net wanderings. Nice to know I have a good chance of surviving a zombie apocalypse. :) Click them and see how you match up. &lt;p&gt; &lt;a style="display:block;width:268px;height:82px;text-decoration:none" href="http://www.justsayhi.com/bb/geek"&gt;&lt;span style="display:block;padding-left:125px;font-size:22px;color:#000;padding-top:28px;font-family:arial"&gt;72% Geek&lt;/span&gt;&lt;/a&gt; &lt;p&gt;&lt;a style="display:block;font-size:60px;width:385px;color:#fff;padding-top:35px;font-family:times new roman, sans-serif;height:209px;text-align:center;text-decoration:none" href="http://www.justsayhi.com/bb/zombie"&gt;&lt;span style="display:block"&gt;60%&lt;/span&gt;&lt;/a&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-4134251031648887394&amp;page=RSS%3a+Fun+Quiz+Time&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=machaira.spaces.live.com&amp;amp;GT1=machaira"&gt;</description><comments>http://machaira.spaces.live.com/Blog/cns!C6A0309746469D9E!483.entry#comment</comments><guid isPermaLink="true">http://machaira.spaces.live.com/Blog/cns!C6A0309746469D9E!483.entry</guid><pubDate>Fri, 04 Jan 2008 18:55:33 GMT</pubDate><slash:comments>5</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://machaira.spaces.live.com/blog/cns!C6A0309746469D9E!483/comments/feed.rss</wfw:commentRss><wfw:comment>http://machaira.spaces.live.com/Blog/cns!C6A0309746469D9E!483.entry#comment</wfw:comment><dcterms:modified>2008-01-04T18:55:33Z</dcterms:modified></item><item><title>Free Xbox Live Arcade Game Coming</title><link>http://machaira.spaces.live.com/Blog/cns!C6A0309746469D9E!482.entry</link><description>&lt;p&gt;Marc Whitten, the General Manager of Xbox LIVE says in an upcoming letter: &lt;blockquote&gt; &lt;p&gt;Dear Xbox LIVE Members:  &lt;p&gt;During this past holiday season you helped us break a number of Xbox LIVE records. This included our largest sign-up of new members to Xbox LIVE in our 5 year history and just yesterday you broke the record for the single biggest day of concurrent members ever on the service.  &lt;p&gt;As a result of this massive increase in usage we know that some of you experienced intermittent Xbox LIVE issues over the holiday break. While the service was not completely offline at any given time, we are disappointed in our performance. I would like to take this moment to thank you each and every one of you for your patience and understanding as our team has worked around the clock to return the service to a stable state.  &lt;p&gt;At the same time we would like to offer a token of our appreciation to all of you in celebration of record success for the service. And as a thank you for your loyalty during this holiday period, we will be offering all of our Xbox LIVE members around the world access to a full Xbox LIVE Arcade game that will be available to download free of charge. In the coming weeks we will be sharing the specific details of this offer with you.  &lt;p&gt;Thank you again for helping make Xbox LIVE everything that it is today!  &lt;p&gt;Sincerely,  &lt;p&gt;Marc Whitten&lt;br&gt;General Manager, Xbox LIVE&lt;/blockquote&gt; &lt;p&gt;  &lt;p&gt;Gotta love free stuff. I wonder if we'll get to choose which game? Probably not, but it's still nice that they're doing this.&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-4134251031648887394&amp;page=RSS%3a+Free+Xbox+Live+Arcade+Game+Coming&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=machaira.spaces.live.com&amp;amp;GT1=machaira"&gt;</description><comments>http://machaira.spaces.live.com/Blog/cns!C6A0309746469D9E!482.entry#comment</comments><guid isPermaLink="true">http://machaira.spaces.live.com/Blog/cns!C6A0309746469D9E!482.entry</guid><pubDate>Fri, 04 Jan 2008 18:47:26 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://machaira.spaces.live.com/blog/cns!C6A0309746469D9E!482/comments/feed.rss</wfw:commentRss><wfw:comment>http://machaira.spaces.live.com/Blog/cns!C6A0309746469D9E!482.entry#comment</wfw:comment><dcterms:modified>2008-01-04T18:47:26Z</dcterms:modified></item><item><title>RPG Game Development - Part 6</title><link>http://machaira.spaces.live.com/Blog/cns!C6A0309746469D9E!478.entry</link><description>&lt;p&gt;A mainstay of RPGs are quests. Usually there's at least one main quest and often several side quests that may or may not be necessary. The main quest may involve many people, places, and/or items. We need an easy way to track all of this so the player knows what he's already done and what needs to be done next. We'll implement a system that should be able to handle most questing needs of a developer. &lt;p&gt;  &lt;p&gt;A quest is made up of one or more steps, so we'll start off with a class to encapsulate the data for a step: &lt;p&gt; &lt;pre&gt;    [Serializable]
    &lt;span&gt;public&lt;/span&gt; &lt;span&gt;class&lt;/span&gt; QuestStep 
    {
        &lt;span&gt;private&lt;/span&gt; &lt;span&gt;string&lt;/span&gt; _stepName;
        &lt;span&gt;private&lt;/span&gt; &lt;span&gt;int&lt;/span&gt; _giveItemID;
        &lt;span&gt;private&lt;/span&gt; &lt;span&gt;int&lt;/span&gt; _getItemID;
        &lt;span&gt;private&lt;/span&gt; &lt;span&gt;int&lt;/span&gt; _stepEntityID;
        &lt;span&gt;private&lt;/span&gt; InteractionType _stepInteractionType;

        &lt;span&gt;// ID of conversation script which is started when StepEntity is interacted with&lt;/span&gt;
        &lt;span&gt;private&lt;/span&gt; &lt;span&gt;int&lt;/span&gt; _conversationID;

        &lt;span&gt;// array of IDs of subquests&lt;/span&gt;
        &lt;span&gt;private&lt;/span&gt; List&amp;lt;&lt;span&gt;int&lt;/span&gt;&amp;gt; _subQuestIDs;

        &lt;span&gt;private&lt;/span&gt; List&amp;lt;Item&amp;gt; _requiredItems;
        
        &lt;span&gt;// required level to start the step, each step may have a different level&lt;/span&gt;
        &lt;span&gt;private&lt;/span&gt; &lt;span&gt;byte&lt;/span&gt; _minimumLevel;

        &lt;span&gt;// number of minutes the step can take&lt;/span&gt;
        &lt;span&gt;private&lt;/span&gt; &lt;span&gt;long&lt;/span&gt; _timeLimit;

        &lt;span&gt;private&lt;/span&gt; QuestRewardType _rewardItemType;
        &lt;span&gt;private&lt;/span&gt; &lt;span&gt;int&lt;/span&gt; _rewardItemID;
        &lt;span&gt;private&lt;/span&gt; &lt;span&gt;int&lt;/span&gt; _rewardMoneyAmount;
        
        &lt;span&gt;public&lt;/span&gt; QuestStep() 
        {
            
        }

        &lt;span&gt;public&lt;/span&gt; &lt;span&gt;string&lt;/span&gt; StepName
        {
            get {&lt;span&gt;return&lt;/span&gt; _stepName;}
            set {&lt;span&gt;if&lt;/span&gt; (!&lt;span&gt;string&lt;/span&gt;.IsNullOrEmpty(&lt;span&gt;value&lt;/span&gt;)) _stepName=&lt;span&gt;value&lt;/span&gt;;}
        }

        &lt;span&gt;public&lt;/span&gt; &lt;span&gt;int&lt;/span&gt; GiveItemID
        {
            get { &lt;span&gt;return&lt;/span&gt; _giveItemID; }
            set { &lt;span&gt;if&lt;/span&gt; (&lt;span&gt;value&lt;/span&gt; &amp;gt; 0) _giveItemID = &lt;span&gt;value&lt;/span&gt;; }
        }

        &lt;span&gt;public&lt;/span&gt; &lt;span&gt;int&lt;/span&gt; GetItemID
        {
            get { &lt;span&gt;return&lt;/span&gt; _getItemID; }
            set { &lt;span&gt;if&lt;/span&gt; (&lt;span&gt;value&lt;/span&gt; &amp;gt; 0) _getItemID = &lt;span&gt;value&lt;/span&gt;; }
        }

        &lt;span&gt;public&lt;/span&gt; &lt;span&gt;int&lt;/span&gt; StepEntityID
        {
            get { &lt;span&gt;return&lt;/span&gt; _stepEntityID; }
            set { &lt;span&gt;if&lt;/span&gt; (&lt;span&gt;value&lt;/span&gt; &amp;gt; 0) _stepEntityID = &lt;span&gt;value&lt;/span&gt;; }
        }

        &lt;span&gt;public&lt;/span&gt; InteractionType StepInteractionType
        {
            get { &lt;span&gt;return&lt;/span&gt; _stepInteractionType; }
            set { _stepInteractionType = &lt;span&gt;value&lt;/span&gt;; }
        }

        &lt;span&gt;public&lt;/span&gt; &lt;span&gt;int&lt;/span&gt; ConversationID
        {
            get { &lt;span&gt;return&lt;/span&gt; _conversationID; }
            set { &lt;span&gt;if&lt;/span&gt; (&lt;span&gt;value&lt;/span&gt; &amp;gt; 0) _conversationID = &lt;span&gt;value&lt;/span&gt;; }
        }

        &lt;span&gt;public&lt;/span&gt; &lt;span&gt;void&lt;/span&gt; AddSubQuest(&lt;span&gt;int&lt;/span&gt; ID)
        {
            &lt;span&gt;if&lt;/span&gt; (_subQuestIDs == &lt;span&gt;null&lt;/span&gt;)
                _subQuestIDs = &lt;span&gt;new&lt;/span&gt; List&amp;lt;&lt;span&gt;int&lt;/span&gt;&amp;gt;();

            _subQuestIDs.Add(ID);
        }

        &lt;span&gt;public&lt;/span&gt; &lt;span&gt;void&lt;/span&gt; InsertSubQuestID(&lt;span&gt;int&lt;/span&gt; index, &lt;span&gt;int&lt;/span&gt; ID)
        {
            &lt;span&gt;if&lt;/span&gt; (_subQuestIDs == &lt;span&gt;null&lt;/span&gt;)
                _subQuestIDs = &lt;span&gt;new&lt;/span&gt; List&amp;lt;&lt;span&gt;int&lt;/span&gt;&amp;gt;();

            &lt;span&gt;if&lt;/span&gt; (index &amp;lt;= _subQuestIDs.Count - 1)
                _subQuestIDs.Insert(index, ID);
            &lt;span&gt;else&lt;/span&gt;
                &lt;span&gt;throw&lt;/span&gt; &lt;span&gt;new&lt;/span&gt; IndexOutOfRangeException(&lt;span&gt;&amp;quot;Number of sub-quests is less than the index passed to the InsertSubQuestID method&amp;quot;&lt;/span&gt;);
        }

        &lt;span&gt;public&lt;/span&gt; List&amp;lt;&lt;span&gt;int&lt;/span&gt;&amp;gt; SubQuestIDs
        {
            get { &lt;span&gt;return&lt;/span&gt; _subQuestIDs; }
        }

        &lt;span&gt;public&lt;/span&gt; &lt;span&gt;void&lt;/span&gt; RemoveSubQuestIDByIndex(&lt;span&gt;int&lt;/span&gt; index)
        {
            _subQuestIDs.RemoveAt(index);
        }

        &lt;span&gt;public&lt;/span&gt; &lt;span&gt;void&lt;/span&gt; RemoveSubQuestIDByID(&lt;span&gt;int&lt;/span&gt; ID)
        {
            _subQuestIDs.Remove(ID);
        }

        &lt;span&gt;public&lt;/span&gt; &lt;span&gt;void&lt;/span&gt; AddRequiredItem(Item item)
        {
            &lt;span&gt;if&lt;/span&gt; (_requiredItems == &lt;span&gt;null&lt;/span&gt;)
                _requiredItems = &lt;span&gt;new&lt;/span&gt; List&amp;lt;Item&amp;gt;();

            _requiredItems.Add(item);
        }

        &lt;span&gt;public&lt;/span&gt; &lt;span&gt;void&lt;/span&gt; RemoveRequiredItemByIndex(&lt;span&gt;int&lt;/span&gt; index)
        {
            _requiredItems.RemoveAt(index);
        }

        &lt;span&gt;public&lt;/span&gt; &lt;span&gt;void&lt;/span&gt; RemoveSubQuestIDByItem(Item item)
        {
            _requiredItems.Remove(item);
        }

        &lt;span&gt;public&lt;/span&gt; List&amp;lt;Item&amp;gt; RequiredItems
        {
            get { &lt;span&gt;return&lt;/span&gt; _requiredItems; }
        }

        &lt;span&gt;public&lt;/span&gt; &lt;span&gt;byte&lt;/span&gt; MinimumLevel
        {
            get { &lt;span&gt;return&lt;/span&gt; _minimumLevel; }
            set { &lt;span&gt;if&lt;/span&gt; (&lt;span&gt;value&lt;/span&gt; &amp;gt; 0) _minimumLevel = &lt;span&gt;value&lt;/span&gt;; }
        }

        &lt;span&gt;public&lt;/span&gt; &lt;span&gt;long&lt;/span&gt; TimeLimit
        {
            get { &lt;span&gt;return&lt;/span&gt; _timeLimit; }
            set { &lt;span&gt;if&lt;/span&gt; (&lt;span&gt;value&lt;/span&gt; &amp;gt; 0) _timeLimit = &lt;span&gt;value&lt;/span&gt;; }
        }

        &lt;span&gt;public&lt;/span&gt; QuestRewardType RewardItemType
        {
            get { &lt;span&gt;return&lt;/span&gt; _rewardItemType; }
            set { _rewardItemType = &lt;span&gt;value&lt;/span&gt;; }
        }

        &lt;span&gt;public&lt;/span&gt; &lt;span&gt;int&lt;/span&gt; RewardItemID
        {
            get { &lt;span&gt;return&lt;/span&gt; _rewardItemID; }
            set { &lt;span&gt;if&lt;/span&gt; (&lt;span&gt;value&lt;/span&gt; &amp;gt; -1) _rewardItemID = &lt;span&gt;value&lt;/span&gt;; }
        }

        &lt;span&gt;public&lt;/span&gt; &lt;span&gt;int&lt;/span&gt; RewardMoneyAmount
        {
            get { &lt;span&gt;return&lt;/span&gt; _rewardMoneyAmount; }
            set { &lt;span&gt;if&lt;/span&gt; (&lt;span&gt;value&lt;/span&gt; &amp;gt; 0) _rewardMoneyAmount = &lt;span&gt;value&lt;/span&gt;; }
        }
    }
&lt;/pre&gt;




&lt;p&gt; The InteractionType enum contains only two items at this point:
&lt;p&gt; &lt;pre&gt;    &lt;span&gt;public&lt;/span&gt; &lt;span&gt;enum&lt;/span&gt; InteractionType 
    {
        Talk,
        Kill
    }&lt;/pre&gt;
&lt;p&gt;


&lt;p&gt;You could add some other values here - Steal, Subdue, Follow, etc. but for our purposes these two will do.
&lt;p&gt; 
&lt;p&gt;The QuestRewardType enum has the following in it:
&lt;p&gt; &lt;pre&gt;    &lt;span&gt;public&lt;/span&gt; &lt;span&gt;enum&lt;/span&gt; QuestRewardType 
    {
        Armor,
        Item,
        Money,
        Spell,
        Weapon
    }
&lt;/pre&gt;


&lt;p&gt; 
&lt;p&gt;You might be asking what the difference between _giveItemID and _rewardItemID are. That's a very good question. Imagine a step where an NPC says &amp;quot;Give this ring to &amp;lt;some other NPC&amp;gt; and here's &amp;lt;some random item&amp;gt; for your trouble&amp;quot;. The first item is the _giveItemID and the second is the _rewardItemID. In the case of money as a reward the _rewardItemID is ignored and the _rewardMoneyAmount is used instead.
&lt;p&gt; 
&lt;p&gt;Here's the main Quest class:
&lt;p&gt; &lt;pre&gt;    [Serializable]
    &lt;span&gt;public&lt;/span&gt; &lt;span&gt;class&lt;/span&gt; Quest 
    {
        &lt;span&gt;private&lt;/span&gt; &lt;span&gt;int&lt;/span&gt; _id;
        &lt;span&gt;private&lt;/span&gt; &lt;span&gt;string&lt;/span&gt; _name;
        &lt;span&gt;private&lt;/span&gt; &lt;span&gt;string&lt;/span&gt; _description;
        &lt;span&gt;private&lt;/span&gt; QuestType _type;
        &lt;span&gt;private&lt;/span&gt; QuestRewardType _rewardType;
        &lt;span&gt;private&lt;/span&gt; &lt;span&gt;int&lt;/span&gt; _rewardItemID;
        &lt;span&gt;private&lt;/span&gt; &lt;span&gt;int&lt;/span&gt; _rewardMoneyAmount;
        &lt;span&gt;private&lt;/span&gt; List&amp;lt;&lt;span&gt;int&lt;/span&gt;&amp;gt; _requiredClasses;
        &lt;span&gt;private&lt;/span&gt; &lt;span&gt;int&lt;/span&gt; _requiredLevel;
        &lt;span&gt;private&lt;/span&gt; &lt;span&gt;bool&lt;/span&gt; _isMultipleAllowed;

        &lt;span&gt;// 0 means no limit&lt;/span&gt;
        &lt;span&gt;private&lt;/span&gt; &lt;span&gt;long&lt;/span&gt; _timeBetweenQuests;

        &lt;span&gt;// total time in which quest must be completed, 0 for none&lt;/span&gt;
        &lt;span&gt;private&lt;/span&gt; &lt;span&gt;long&lt;/span&gt; _timeLimit;

        &lt;span&gt;// is the reward known by the player when accepting the quest&lt;/span&gt;
        &lt;span&gt;private&lt;/span&gt; &lt;span&gt;bool&lt;/span&gt; _isRewardShown;

        &lt;span&gt;private&lt;/span&gt; List&amp;lt;FactionAdjust&amp;gt; _factions;

        &lt;span&gt;private&lt;/span&gt; List&amp;lt;QuestStep&amp;gt; _steps = &lt;span&gt;new&lt;/span&gt; List&amp;lt;QuestStep&amp;gt;();
        
        &lt;span&gt;private&lt;/span&gt; &lt;span&gt;string&lt;/span&gt; _fileName;
        
        &lt;span&gt;public&lt;/span&gt; Quest() 
        {

        }
        
        &lt;span&gt;public&lt;/span&gt; &lt;span&gt;int&lt;/span&gt; ID 
        {
            get { &lt;span&gt;return&lt;/span&gt; _id; }
            set { &lt;span&gt;if&lt;/span&gt; (&lt;span&gt;value&lt;/span&gt; &amp;gt; 0) _id = &lt;span&gt;value&lt;/span&gt;; }
        }

        &lt;span&gt;public&lt;/span&gt; &lt;span&gt;string&lt;/span&gt; Name
        {
            get { &lt;span&gt;return&lt;/span&gt; _name; }
            set { &lt;span&gt;if&lt;/span&gt; (!&lt;span&gt;string&lt;/span&gt;.IsNullOrEmpty(&lt;span&gt;value&lt;/span&gt;)) _name = &lt;span&gt;value&lt;/span&gt;; }
        }

        &lt;span&gt;public&lt;/span&gt; &lt;span&gt;string&lt;/span&gt; Description
        {
            get { &lt;span&gt;return&lt;/span&gt; _description; }
            set { _description = &lt;span&gt;value&lt;/span&gt;; }
        }

        &lt;span&gt;public&lt;/span&gt; QuestType Type
        {
            get { &lt;span&gt;return&lt;/span&gt; _type; }
            set { _type = &lt;span&gt;value&lt;/span&gt;; }
        }

        &lt;span&gt;public&lt;/span&gt; QuestRewardType RewardType
        {
            get { &lt;span&gt;return&lt;/span&gt; _rewardType; }
            set { _rewardType = &lt;span&gt;value&lt;/span&gt;; }
        }

        &lt;span&gt;public&lt;/span&gt; &lt;span&gt;int&lt;/span&gt; RewardItemID
        {
            get { &lt;span&gt;return&lt;/span&gt; _rewardItemID; }
            set { _rewardItemID = &lt;span&gt;value&lt;/span&gt;; }
        }

        &lt;span&gt;public&lt;/span&gt; List&amp;lt;&lt;span&gt;int&lt;/span&gt;&amp;gt; RequiredClasses
        {
            get { &lt;span&gt;return&lt;/span&gt; _requiredClass; }
            set { _requiredClass = &lt;span&gt;value&lt;/span&gt;; }
        }

        &lt;span&gt;public&lt;/span&gt; &lt;span&gt;int&lt;/span&gt; RequiredLevel
        {
            get { &lt;span&gt;return&lt;/span&gt; _requiredLevel; }
            set { &lt;span&gt;if&lt;/span&gt; (&lt;span&gt;value&lt;/span&gt; &amp;gt; 0) _requiredLevel = &lt;span&gt;value&lt;/span&gt;; }
        }

        &lt;span&gt;public&lt;/span&gt; &lt;span&gt;bool&lt;/span&gt; MultipleAllowed
        {
            get { &lt;span&gt;return&lt;/span&gt; _isMultipleAllowed; }
            set { _isMultipleAllowed = &lt;span&gt;value&lt;/span&gt;; }
        }

        &lt;span&gt;public&lt;/span&gt; &lt;span&gt;long&lt;/span&gt; TimeBetweenQuests
        {
            get { &lt;span&gt;return&lt;/span&gt; _timeBetweenQuests; }
            set { &lt;span&gt;if&lt;/span&gt; (&lt;span&gt;value&lt;/span&gt; &amp;gt; -1) _timeBetweenQuests = &lt;span&gt;value&lt;/span&gt;; }
        }

        &lt;span&gt;public&lt;/span&gt; &lt;span&gt;long&lt;/span&gt; TimeLimit
        {
            get { &lt;span&gt;return&lt;/span&gt; _timeLimit; }
            set { &lt;span&gt;if&lt;/span&gt; (&lt;span&gt;value&lt;/span&gt; &amp;gt; -1) _timeLimit = &lt;span&gt;value&lt;/span&gt;; }
        }

        &lt;span&gt;public&lt;/span&gt; &lt;span&gt;bool&lt;/span&gt; RewardShown
        {
            get { &lt;span&gt;return&lt;/span&gt; _isRewardShown; }
            set { _isRewardShown = &lt;span&gt;value&lt;/span&gt;; }
        }

        &lt;span&gt;public&lt;/span&gt; List&amp;lt;FactionAdjust&amp;gt; Factions
        {
            get { &lt;span&gt;return&lt;/span&gt; _factions; }
            set { _factions = &lt;span&gt;value&lt;/span&gt;; }
        }

        &lt;span&gt;public&lt;/span&gt; List&amp;lt;QuestStep&amp;gt; Steps
        {
            get { &lt;span&gt;return&lt;/span&gt; _steps; }
            set { _steps = &lt;span&gt;value&lt;/span&gt;; }
        }

        &lt;span&gt;public&lt;/span&gt; &lt;span&gt;string&lt;/span&gt; FileName
        {
            get { &lt;span&gt;return&lt;/span&gt; _fileName; }
            set { _fileName = &lt;span&gt;value&lt;/span&gt;; }
        }
    }
&lt;/pre&gt;


&lt;p&gt; 
&lt;p&gt; A quest can be one of the following types:
&lt;p&gt; &lt;pre&gt;    &lt;span&gt;public&lt;/span&gt; &lt;span&gt;enum&lt;/span&gt; QuestType 
    {
        FedEx,
        Item,
        Kill,
        Rescue
    }&lt;/pre&gt;
&lt;p&gt;


&lt;p&gt;A FedEx quest is a delivery of some item from one NPC to another. The Item value means the player has to find some item and return it to the NPC that originates the quest. 
&lt;p&gt; 
&lt;p&gt;Factions are something that allow you to determine how a group of people, guards for instance, react to the player. Most MMORPGs have quests that allow the player to modify their faction value for certain groups. This can be used in single-player RPGs as well. The FactionAdjust class is simply an ID and Value pair:
&lt;p&gt; &lt;pre&gt;    [Serializable]
    &lt;span&gt;public&lt;/span&gt; &lt;span&gt;class&lt;/span&gt; FactionAdjust
    {
        &lt;span&gt;public&lt;/span&gt; &lt;span&gt;int&lt;/span&gt; ID;
        &lt;span&gt;public&lt;/span&gt; &lt;span&gt;int&lt;/span&gt; Value;
    }
&lt;/pre&gt;


&lt;p&gt; 
&lt;p&gt;In your data somewhere you'd have a list of faction types (Merchant, Guard, specific monster type). Value can be positive or negative and a quest could affect one faction positively and lower another. For instance, a quest to kill 10 goblins might positively affect the people in an area where the goblins are a problem but would obviously affect the goblin nation negatively. If you allow players to play as a race that is normally not reacted to hostilely by goblins, this allows you to make them so if the player goes on a goblin killing spree.
&lt;p&gt; 
&lt;p&gt;One area you might want to change, depending on how you work your classes, is the _requiredLevel member. The way the class is implemented, all classes that are allowed have to be the same. You couldn't have a quest where a warrior has to be level 5 and a mage has to be level 10. That's easily fixed by implementing a list of ID and value pairs, like the FactionAdjust above, and replacing the _requiredClasses and _requiredLevel members with it.
&lt;p&gt; 
&lt;p&gt;So how do we assign a question to the player? We add an instance of the AssignedQuest class to the player's Entity object:
&lt;p&gt; &lt;pre&gt;    &lt;span&gt;// An array of this goes in the Entity class&lt;/span&gt;
    [Serializable]
    &lt;span&gt;public&lt;/span&gt; &lt;span&gt;class&lt;/span&gt; AssignedQuest
    {
        &lt;span&gt;private&lt;/span&gt; &lt;span&gt;long&lt;/span&gt; _questID;
        &lt;span&gt;private&lt;/span&gt; &lt;span&gt;int&lt;/span&gt; _curStep;
        &lt;span&gt;private&lt;/span&gt; &lt;span&gt;long&lt;/span&gt; _timeStepStarted;
        &lt;span&gt;private&lt;/span&gt; &lt;span&gt;long&lt;/span&gt; _timeStepFinished;
        &lt;span&gt;private&lt;/span&gt; &lt;span&gt;long&lt;/span&gt; _timeQuestStarted;
        &lt;span&gt;private&lt;/span&gt; &lt;span&gt;long&lt;/span&gt; _timeQuestFinished;
        
    }&lt;/pre&gt;&lt;pre&gt; &lt;/pre&gt;
&lt;p&gt;We'll need a manager and service to allow code to get information about quests. Here they are:
&lt;p&gt; &lt;pre&gt;    &lt;span&gt;public&lt;/span&gt; &lt;span&gt;class&lt;/span&gt; QuestManager
    {
        &lt;span&gt;private&lt;/span&gt; List&amp;lt;Quest&amp;gt; _quests;

        &lt;span&gt;private&lt;/span&gt; &lt;span&gt;static&lt;/span&gt; &lt;span&gt;int&lt;/span&gt; _numQuests = 0;

        &lt;span&gt;public&lt;/span&gt; &lt;span&gt;static&lt;/span&gt; &lt;span&gt;int&lt;/span&gt; NumQuests
        {
            get { &lt;span&gt;return&lt;/span&gt; _numQuests; }
        }

        &lt;span&gt;public&lt;/span&gt; QuestManager(&lt;span&gt;string&lt;/span&gt; filename)
        {
            &lt;span&gt;if&lt;/span&gt; (File.Exists(filename))
            {
                XmlSerializer serializer = &lt;span&gt;new&lt;/span&gt; XmlSerializer(&lt;span&gt;typeof&lt;/span&gt;(List&amp;lt;Quest&amp;gt;));

                FileStream fs = &lt;span&gt;new&lt;/span&gt; FileStream(filename, FileMode.Open);

                _quests = (List&amp;lt;Quest&amp;gt;)serializer.Deserialize(fs);

                _numQuests = _quests.Count;
            }
        }

        &lt;span&gt;public&lt;/span&gt; Quest GetQuest(&lt;span&gt;int&lt;/span&gt; id)
        {
            &lt;span&gt;foreach&lt;/span&gt; (Quest quest &lt;span&gt;in&lt;/span&gt; _quests)
            {
                &lt;span&gt;if&lt;/span&gt; (quest.ID == id)
                    &lt;span&gt;return&lt;/span&gt; quest;
                &lt;span&gt;break&lt;/span&gt;;
            }

            &lt;span&gt;return&lt;/span&gt; &lt;span&gt;null&lt;/span&gt;;
        }
    }&lt;/pre&gt;&lt;pre&gt; &lt;/pre&gt;&lt;pre&gt;    &lt;span&gt;public&lt;/span&gt; &lt;span&gt;interface&lt;/span&gt; IQuestManagerService
    {
        Quest GetQuest(&lt;span&gt;int&lt;/span&gt; id);
    }
&lt;/pre&gt;
&lt;p&gt;


&lt;p&gt;I should probably mention that the Starter Kit that will eventually be developed will contain an interface for creating quests (as it will for all the other objects) so don't feel you need to start working on one (unless you really want to, of course). :)
&lt;p&gt; 
&lt;p&gt;&lt;a href="http://www.machxgames.com/forum/default.aspx?g=posts&amp;amp;t=37" target="_blank"&gt;Here's&lt;/a&gt; the usual link to the forums for discussion. I'm sure there's areas for improvement here so feel free to let me know. Hopefully this post will be useful in helping you to design your quest system if you don't want to wait for the release of the Starter Kit or use the code I've provided here.


&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-4134251031648887394&amp;page=RSS%3a+RPG+Game+Development+-+Part+6&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=machaira.spaces.live.com&amp;amp;GT1=machaira"&gt;</description><category>Programming</category><comments>http://machaira.spaces.live.com/Blog/cns!C6A0309746469D9E!478.entry#comment</comments><guid isPermaLink="true">http://machaira.spaces.live.com/Blog/cns!C6A0309746469D9E!478.entry</guid><pubDate>Thu, 27 Dec 2007 22:30:54 GMT</pubDate><slash:comments>2</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://machaira.spaces.live.com/blog/cns!C6A0309746469D9E!478/comments/feed.rss</wfw:commentRss><wfw:comment>http://machaira.spaces.live.com/Blog/cns!C6A0309746469D9E!478.entry#comment</wfw:comment><dcterms:modified>2007-12-27T22:30:54Z</dcterms:modified></item><item><title>Hotkey Bar Component</title><link>http://machaira.spaces.live.com/Blog/cns!C6A0309746469D9E!474.entry</link><description>&lt;p&gt;A &lt;a href="http://forums.xna.com/thread/35138.aspx" target="_blank"&gt;post&lt;/a&gt; on the Creators Club forums got me thinking about how a typical MMORPG hotkey bar interface could be done that would use the 360 Gamepad controller. I took a couple minutes to whip up a component with one idea on how to do this. Grab it from the &lt;a href="http://www.machxgames.com/Downloads.aspx" target="_blank"&gt;Downloads page&lt;/a&gt; on my site and let me know what you think by posting in my &lt;a href="http://www.machxgames.com/forum/default.aspx" target="_blank"&gt;forums&lt;/a&gt;.&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-4134251031648887394&amp;page=RSS%3a+Hotkey+Bar+Component&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=machaira.spaces.live.com&amp;amp;GT1=machaira"&gt;</description><category>XNA</category><comments>http://machaira.spaces.live.com/Blog/cns!C6A0309746469D9E!474.entry#comment</comments><guid isPermaLink="true">http://machaira.spaces.live.com/Blog/cns!C6A0309746469D9E!474.entry</guid><pubDate>Mon, 24 Dec 2007 18:16:13 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://machaira.spaces.live.com/blog/cns!C6A0309746469D9E!474/comments/feed.rss</wfw:commentRss><wfw:comment>http://machaira.spaces.live.com/Blog/cns!C6A0309746469D9E!474.entry#comment</wfw:comment><dcterms:modified>2007-12-24T18:16:13Z</dcterms:modified></item><item><title>XNA 2.0 and VS 2008</title><link>http://machaira.spaces.live.com/Blog/cns!C6A0309746469D9E!471.entry</link><description>&lt;p&gt;Yup, although it's not officially supported, you can use them together. Check out &lt;a href="http://www.thecodeproject.com/KB/game/XNA_And_Beyond.aspx" target="_blank"&gt;Ultrahead's great article&lt;/a&gt; and then be sure to vote for it.&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-4134251031648887394&amp;page=RSS%3a+XNA+2.0+and+VS+2008&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=machaira.spaces.live.com&amp;amp;GT1=machaira"&gt;</description><category>XNA</category><comments>http://machaira.spaces.live.com/Blog/cns!C6A0309746469D9E!471.entry#comment</comments><guid isPermaLink="true">http://machaira.spaces.live.com/Blog/cns!C6A0309746469D9E!471.entry</guid><pubDate>Wed, 19 Dec 2007 13:04:48 GMT</pubDate><slash:comments>1</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://machaira.spaces.live.com/blog/cns!C6A0309746469D9E!471/comments/feed.rss</wfw:commentRss><wfw:comment>http://machaira.spaces.live.com/Blog/cns!C6A0309746469D9E!471.entry#comment</wfw:comment><dcterms:modified>2007-12-19T13:04:48Z</dcterms:modified></item><item><title>XNA Game Installer</title><link>http://machaira.spaces.live.com/Blog/cns!C6A0309746469D9E!470.entry</link><description>&lt;p&gt;Cygon has come up with an installer template for &lt;a href="http://sourceforge.net/projects/wix" target="_blank"&gt;Wix&lt;/a&gt; for your XNA games. Looks like it could be the answer many people are looking for. Check it out over at &lt;a href="http://www.codeplex.com/xnainstaller" target="_blank"&gt;CodePlex&lt;/a&gt;.&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-4134251031648887394&amp;page=RSS%3a+XNA+Game+Installer&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=machaira.spaces.live.com&amp;amp;GT1=machaira"&gt;</description><category>XNA</category><comments>http://machaira.spaces.live.com/Blog/cns!C6A0309746469D9E!470.entry#comment</comments><guid isPermaLink="true">http://machaira.spaces.live.com/Blog/cns!C6A0309746469D9E!470.entry</guid><pubDate>Wed, 19 Dec 2007 12:38:30 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://machaira.spaces.live.com/blog/cns!C6A0309746469D9E!470/comments/feed.rss</wfw:commentRss><wfw:comment>http://machaira.spaces.live.com/Blog/cns!C6A0309746469D9E!470.entry#comment</wfw:comment><dcterms:modified>2007-12-19T12:38:30Z</dcterms:modified></item><item><title>RPG Game Development - Part 5</title><link>http://machaira.spaces.live.com/Blog/cns!C6A0309746469D9E!469.entry</link><description>&lt;p&gt;Almost every RPG, no matter what type, has some kind of system that allows for extra-normal abilities. Whether it's called magic in a fantasy RPG or psionics in a sci-fi RPG doesn't matter. It's easy enough to build a system that allows for both and that's what we'll do here. &lt;p&gt;  &lt;p&gt;We'll start out with the Spell class: &lt;p&gt; &lt;pre&gt;    [Serializable()]
    &lt;span&gt;public&lt;/span&gt; &lt;span&gt;class&lt;/span&gt; Spell
    {
        &lt;span&gt;private&lt;/span&gt; SpellType _type;
        &lt;span&gt;private&lt;/span&gt; &lt;span&gt;string&lt;/span&gt; _name;
        &lt;span&gt;private&lt;/span&gt; &lt;span&gt;string&lt;/span&gt; _description;
        &lt;span&gt;private&lt;/span&gt; &lt;span&gt;string&lt;/span&gt; _effectAmount;
        &lt;span&gt;private&lt;/span&gt; &lt;span&gt;string&lt;/span&gt; _range;
        &lt;span&gt;private&lt;/span&gt; List&amp;lt;&lt;span&gt;int&lt;/span&gt;&amp;gt; _classesRequired;
        &lt;span&gt;private&lt;/span&gt; &lt;span&gt;string&lt;/span&gt; _duration;
        &lt;span&gt;private&lt;/span&gt; &lt;span&gt;byte&lt;/span&gt; _levelRequired;
        &lt;span&gt;private&lt;/span&gt; &lt;span&gt;short&lt;/span&gt; _manaCost;
        &lt;span&gt;private&lt;/span&gt; AlignmentBitwise _alignmentsRequired;
        &lt;span&gt;private&lt;/span&gt; SpellCastRate _castRate;
        &lt;span&gt;private&lt;/span&gt; List&amp;lt;Bonus&amp;gt; _defBonuses;
        &lt;span&gt;private&lt;/span&gt; List&amp;lt;Bonus&amp;gt; _offBonuses;
        &lt;span&gt;private&lt;/span&gt; List&amp;lt;Bonus&amp;gt; _miscBonuses;

        &lt;span&gt;//graphic used in the spellbook in-game&lt;/span&gt;
        [NonSerialized()]
        &lt;span&gt;private&lt;/span&gt; Texture2D _spellBookGraphic;

        &lt;span&gt;private&lt;/span&gt; &lt;span&gt;string&lt;/span&gt; _spellBookGraphicFilename;

        &lt;span&gt;public&lt;/span&gt; SpellType Type
        {
            get { &lt;span&gt;return&lt;/span&gt; _type; }
            set { _type = &lt;span&gt;value&lt;/span&gt;; }
        }

        &lt;span&gt;public&lt;/span&gt; &lt;span&gt;string&lt;/span&gt; Name
        {
            get { &lt;span&gt;return&lt;/span&gt; _name; }
            set { &lt;span&gt;if&lt;/span&gt; (!&lt;span&gt;string&lt;/span&gt;.IsNullOrEmpty(&lt;span&gt;value&lt;/span&gt;)) _name = &lt;span&gt;value&lt;/span&gt;; }
        }

        &lt;span&gt;public&lt;/span&gt; &lt;span&gt;string&lt;/span&gt; Description
        {
            get { &lt;span&gt;return&lt;/span&gt; _description; }
            set { &lt;span&gt;if&lt;/span&gt; (!&lt;span&gt;string&lt;/span&gt;.IsNullOrEmpty(&lt;span&gt;value&lt;/span&gt;)) _description = &lt;span&gt;value&lt;/span&gt;; }
        }

        &lt;span&gt;public&lt;/span&gt; &lt;span&gt;string&lt;/span&gt; EffectAmount
        {
            get { &lt;span&gt;return&lt;/span&gt; _effectAmount; }
            set { _effectAmount = &lt;span&gt;value&lt;/span&gt;; }
        }

        &lt;span&gt;public&lt;/span&gt; &lt;span&gt;string&lt;/span&gt; Range
        {
            get { &lt;span&gt;return&lt;/span&gt; _range; }
            set { _range = &lt;span&gt;value&lt;/span&gt;; }
        }

        &lt;span&gt;public&lt;/span&gt; List&amp;lt;&lt;span&gt;int&lt;/span&gt;&amp;gt; ClassesRequired
        {
            get { &lt;span&gt;return&lt;/span&gt; _classesRequired; }
            set { _classesRequired = &lt;span&gt;value&lt;/span&gt;; }
        }

        &lt;span&gt;public&lt;/span&gt; &lt;span&gt;string&lt;/span&gt; Duration
        {
            get { &lt;span&gt;return&lt;/span&gt; _duration; }
            set { _duration = &lt;span&gt;value&lt;/span&gt;; }
        }

        &lt;span&gt;public&lt;/span&gt; &lt;span&gt;byte&lt;/span&gt; LevelRequired
        {
            get { &lt;span&gt;return&lt;/span&gt; _levelRequired; }
            set { _levelRequired = &lt;span&gt;value&lt;/span&gt;; }
        }

        &lt;span&gt;public&lt;/span&gt; &lt;span&gt;short&lt;/span&gt; ManaCost
        {
            get { &lt;span&gt;return&lt;/span&gt; _manaCost; }
            set { _manaCost = &lt;span&gt;value&lt;/span&gt;; }
        }

        &lt;span&gt;public&lt;/span&gt; AlignmentBitwise AlignmentsRequired
        {
            get { &lt;span&gt;return&lt;/span&gt; _alignmentsRequired; }
            set { _alignmentsRequired = &lt;span&gt;value&lt;/span&gt;; }
        }

        &lt;span&gt;public&lt;/span&gt; SpellCastRate CastRate
        {
            get { &lt;span&gt;return&lt;/span&gt; _castRate; }
            set { _castRate = &lt;span&gt;value&lt;/span&gt;; }
        }

        &lt;span&gt;public&lt;/span&gt; List&amp;lt;Bonus&amp;gt; DefensiveBonuses
        {
            get { &lt;span&gt;return&lt;/span&gt; _defBonuses; }
            set { _defBonuses = &lt;span&gt;value&lt;/span&gt;; }
        }

        &lt;span&gt;public&lt;/span&gt; List&amp;lt;Bonus&amp;gt; OffensiveBonuses
        {
            get { &lt;span&gt;return&lt;/span&gt; _offBonuses; }
            set { _offBonuses = &lt;span&gt;value&lt;/span&gt;; }
        }

        &lt;span&gt;public&lt;/span&gt; List&amp;lt;Bonus&amp;gt; MiscBonuses
        {
            get { &lt;span&gt;return&lt;/span&gt; _miscBonuses; }
            set { _miscBonuses = &lt;span&gt;value&lt;/span&gt;; }
        }
        
        &lt;span&gt;public&lt;/span&gt; &lt;span&gt;bool&lt;/span&gt; Cast(&lt;span&gt;ref&lt;/span&gt; Object target, &lt;span&gt;ref&lt;/span&gt; Entity caster)
        {


            &lt;span&gt;return&lt;/span&gt; &lt;span&gt;true&lt;/span&gt;;
        }

        &lt;span&gt;public&lt;/span&gt; &lt;span&gt;bool&lt;/span&gt; Cast(&lt;span&gt;ref&lt;/span&gt; Entity target, &lt;span&gt;ref&lt;/span&gt; Entity caster)
        {
            &lt;span&gt;short&lt;/span&gt; mr = target.MagicResistance;
            &lt;span&gt;short&lt;/span&gt; roll = GlobalFunctions.GetRandomNumber(DieType.d100);

            &lt;span&gt;//Get caster's skill bonus&lt;/span&gt;
            roll += (&lt;span&gt;short&lt;/span&gt;)caster.GetCastingSkillBonus();

            &lt;span&gt;//resistance not applicable for any but offensive spells&lt;/span&gt;
            &lt;span&gt;if&lt;/span&gt; (_type == SpellType.Offensive)
                roll -= mr;

            &lt;span&gt;if&lt;/span&gt; (roll &amp;gt;= 100)
            {
                &lt;span&gt;switch&lt;/span&gt; (_type)
                {
                    &lt;span&gt;case&lt;/span&gt; SpellType.BuffAny:
                    &lt;span&gt;case&lt;/span&gt; SpellType.BuffSelf:
                    {

                        &lt;span&gt;break&lt;/span&gt;;
                    }
                    &lt;span&gt;case&lt;/span&gt; SpellType.Defensive:
                    {

                        &lt;span&gt;break&lt;/span&gt;;
                    }

                    &lt;span&gt;case&lt;/span&gt; SpellType.Miscellaneous:
                    {

                        &lt;span&gt;break&lt;/span&gt;;
                    }

                    &lt;span&gt;case&lt;/span&gt; SpellType.NonCombat:
                    {

                        &lt;span&gt;break&lt;/span&gt;;
                    }

                    &lt;span&gt;case&lt;/span&gt; SpellType.Offensive:
                    {
                        target.Damage((&lt;span&gt;int&lt;/span&gt;)GlobalFunctions.GetRangeAmount(_effectAmount), DamageType.Magical);

                        &lt;span&gt;break&lt;/span&gt;;
                    }

                }

                &lt;span&gt;return&lt;/span&gt; &lt;span&gt;true&lt;/span&gt;;
            }

            &lt;span&gt;return&lt;/span&gt; &lt;span&gt;false&lt;/span&gt;;
        }
    }
&lt;/pre&gt;




&lt;p&gt;


&lt;p&gt;SpellType is an enum with the following members:
&lt;p&gt; &lt;pre&gt;    &lt;span&gt;public&lt;/span&gt; &lt;span&gt;enum&lt;/span&gt; SpellType
    {
        Offensive,
        Defensive,
        BuffSelf,
        BuffAny,
        NonCombat,
        Miscellaneous
    }&lt;/pre&gt;


&lt;p&gt; 
&lt;p&gt;_effectAmount, _range, and _duration are declared as strings as they could be a range, say 1-20. 
&lt;p&gt;_classesRequired is a list of IDs of EntityClass objects. In almost every RPG system I've seen spells can overlap between classes. This allows us to do so here.
&lt;p&gt;_levelRequired could be set to 0 if you're using a level-less system.
&lt;p&gt;_alignmentsRequired is an Enum with a [Flags] attribute tacked to it which allows it to be treated as a bit field so multiple alignments can use the spell. Unlike entity classes, this will be unchangeable with just 3 alignments. If you want to have a more in-depth alignment system, you could set it up similar to how classes are handled. Here's the enum:
&lt;p&gt; &lt;pre&gt;    [Flags] 
    &lt;span&gt;public&lt;/span&gt; &lt;span&gt;enum&lt;/span&gt; AlignmentBitwise
    {
        None = 0,
        Good = 1,
        Neutral = 2,
        Evil = 4
    }&lt;/pre&gt;
&lt;p&gt;


&lt;p&gt;_castRate is another property that could be adjusted to fit your system. Currently these are the values:
&lt;p&gt; &lt;pre&gt;    &lt;span&gt;public&lt;/span&gt; &lt;span&gt;enum&lt;/span&gt; SpellCastRate
    {
        None=-1,             &lt;span&gt;//No restrictions&lt;/span&gt;
        Round,           &lt;span&gt;//Once per round of combat&lt;/span&gt;
        Minute,
        Hour,
        Day,
        Week,
        Month
    }&lt;/pre&gt;
&lt;p&gt;


&lt;p&gt;The Bonus structure for the _defBonuses, _offBonuses, and _miscBonuses looks like this:
&lt;p&gt; &lt;pre&gt;    &lt;span&gt;public&lt;/span&gt; &lt;span&gt;enum&lt;/span&gt; BonusType
    {
        Disease,
        Magic,
        Poison,
        Potion,
        Other
    }

    &lt;span&gt;public&lt;/span&gt; &lt;span&gt;struct&lt;/span&gt; Bonus
    {
        &lt;span&gt;public&lt;/span&gt; BonusType Type;
        &lt;span&gt;public&lt;/span&gt; &lt;span&gt;short&lt;/span&gt; Amount;
        &lt;span&gt;public&lt;/span&gt; &lt;span&gt;int&lt;/span&gt;  TimeStarted;
        &lt;span&gt;public&lt;/span&gt; &lt;span&gt;int&lt;/span&gt; Duration;
        &lt;span&gt;public&lt;/span&gt; &lt;span&gt;int&lt;/span&gt; ElapsedTime;
    }&lt;/pre&gt;


&lt;p&gt; 
&lt;p&gt;The Cast function is overloaded to allow different handling if the spell is cast on an entity or an object. This might not be necessary but I thought it would allow a bit more flexibility. For my system resolution works like this - a random number from 1 to 100 is generated. The total of any resistances the entity might have is subtracted and any bonuses the cast might have is added. If the result is 100 or greater the casting succeeds. If the spell is an offensive type, a function is called to get the random amount of damage in the spell's damage range and the entity's Damage method is called, passing the amount and type of damage, since even though the casting succeeded, the entity could have a bonus that reduces the amount.
&lt;p&gt; 
&lt;p&gt;Like most other base classes, we'll have a class between the Spell class and the Entity class:
&lt;p&gt; &lt;pre&gt;    [Serializable]
    &lt;span&gt;public&lt;/span&gt; &lt;span&gt;class&lt;/span&gt; EntitySpell
    {
        &lt;span&gt;private&lt;/span&gt; &lt;span&gt;int&lt;/span&gt; _id;
        &lt;span&gt;private&lt;/span&gt; &lt;span&gt;bool&lt;/span&gt; _learned;
        &lt;span&gt;private&lt;/span&gt; &lt;span&gt;bool&lt;/span&gt; _memorized;
        &lt;span&gt;private&lt;/span&gt; &lt;span&gt;byte&lt;/span&gt; _skillPointsAllocated;
        &lt;span&gt;private&lt;/span&gt; &lt;span&gt;long&lt;/span&gt; _lastCast;
        &lt;span&gt;private&lt;/span&gt; &lt;span&gt;string&lt;/span&gt; _hotKey;

        &lt;span&gt;public&lt;/span&gt; &lt;span&gt;int&lt;/span&gt; ID
        {
            get { &lt;span&gt;return&lt;/span&gt; _id; }
            set { _id = &lt;span&gt;value&lt;/span&gt;; }
        }

        &lt;span&gt;public&lt;/span&gt; &lt;span&gt;bool&lt;/span&gt; Learned
        {
            get { &lt;span&gt;return&lt;/span&gt; _learned; }
        }

        &lt;span&gt;public&lt;/span&gt; &lt;span&gt;bool&lt;/span&gt; Memorized
        {
            get { &lt;span&gt;return&lt;/span&gt; _memorized; }
        }

        &lt;span&gt;public&lt;/span&gt; &lt;span&gt;byte&lt;/span&gt; SkillPointsAllocated
        {
            get { &lt;span&gt;return&lt;/span&gt; _skillPointsAllocated; }
        }

        &lt;span&gt;public&lt;/span&gt; &lt;span&gt;long&lt;/span&gt; LastCast
        {
            get { &lt;span&gt;return&lt;/span&gt; _lastCast; }
            set { _lastCast = &lt;span&gt;value&lt;/span&gt;; }
        }

        &lt;span&gt;public&lt;/span&gt; &lt;span&gt;string&lt;/span&gt; HotKey
        {
            get { &lt;span&gt;return&lt;/span&gt; _hotKey; }
            set { _hotKey = &lt;span&gt;value&lt;/span&gt;; }
        }

        &lt;span&gt;public&lt;/span&gt; &lt;span&gt;void&lt;/span&gt; AllocatePoints(&lt;span&gt;byte&lt;/span&gt; amount)
        {
            _skillPointsAllocated += amount;
        }

        &lt;span&gt;public&lt;/span&gt; &lt;span&gt;bool&lt;/span&gt; Learn()
        {
            &lt;span&gt;short&lt;/span&gt; roll = GlobalFunctions.GetRandomNumber(DieType.d100);

            &lt;span&gt;if&lt;/span&gt; (roll + (_skillPointsAllocated * 5) &amp;gt;= 100)
            {
                _learned = &lt;span&gt;true&lt;/span&gt;;
                _skillPointsAllocated = 0;
            }

            &lt;span&gt;return&lt;/span&gt; _learned;
        }

        &lt;span&gt;public&lt;/span&gt; &lt;span&gt;void&lt;/span&gt; Memorize()
        {
            &lt;span&gt;if&lt;/span&gt; (_learned)
                _memorized = &lt;span&gt;true&lt;/span&gt;;
        }
    }
&lt;/pre&gt;
&lt;p&gt;The class is set up so that you have to learn a spell by allocating points that you get each level. If you're going with a level-less system you'll have to make some changes. The character also has to memorize the spell after learning it before he can use it. If you want the character to be able to cast any spell he knows at any time, you'll want to just ignore the _memorized property. You could add a MustMemorize property to the Spell class or a MustMemorizeSpells property to the EntityClass  objects that have spell casting ability and key off that.
&lt;p&gt; 
&lt;p&gt;That's pretty much the basics of the magic system. We'll be adding things later like a spell book to display the spells known by a character. Once we have our Entity class we'll hook it into using the spells (and skills and items :D ).
&lt;p&gt; 
&lt;p&gt;As always, please &lt;a href="http://www.machxgames.com/forum/default.aspx?g=posts&amp;amp;t=33" target="_blank"&gt;post feedback&lt;/a&gt; on the forums.
&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-4134251031648887394&amp;page=RSS%3a+RPG+Game+Development+-+Part+5&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=machaira.spaces.live.com&amp;amp;GT1=machaira"&gt;</description><comments>http://machaira.spaces.live.com/Blog/cns!C6A0309746469D9E!469.entry#comment</comments><guid isPermaLink="true">http://machaira.spaces.live.com/Blog/cns!C6A0309746469D9E!469.entry</guid><pubDate>Wed, 19 Dec 2007 12:35:35 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://machaira.spaces.live.com/blog/cns!C6A0309746469D9E!469/comments/feed.rss</wfw:commentRss><wfw:comment>http://machaira.spaces.live.com/Blog/cns!C6A0309746469D9E!469.entry#comment</wfw:comment><dcterms:modified>2007-12-19T13:58:34Z</dcterms:modified></item><item><title>RPG Game Development - Part 4</title><link>http://machaira.spaces.live.com/Blog/cns!C6A0309746469D9E!467.entry</link><description>&lt;p&gt;An RPG wouldn't be an RPG without all the cool loot, right (I resisted the temptation to spell it k3w1 13w7 or however it's spelled in leet speak :D). In order to get some loot in the game, we'll need some classes to create them. Since almost every type of item has some of the same properties we'll start out with a base class: &lt;p&gt; &lt;pre&gt;    &lt;span&gt;abstract&lt;/span&gt; &lt;span&gt;public&lt;/span&gt; &lt;span&gt;class&lt;/span&gt; BaseItem : Object
    {
        &lt;span&gt;protected&lt;/span&gt; &lt;span&gt;int&lt;/span&gt; _id;

        &lt;span&gt;protected&lt;/span&gt; &lt;span&gt;string&lt;/span&gt; _name;
        &lt;span&gt;protected&lt;/span&gt; &lt;span&gt;string&lt;/span&gt; _description;
        &lt;span&gt;protected&lt;/span&gt; &lt;span&gt;float&lt;/span&gt; _weight;
        &lt;span&gt;protected&lt;/span&gt; &lt;span&gt;byte&lt;/span&gt; _strengthRequired;
        &lt;span&gt;//Used for different purposes depending on the type of derived item&lt;/span&gt;
        &lt;span&gt;protected&lt;/span&gt; &lt;span&gt;string&lt;/span&gt; _tag;

        &lt;span&gt;protected&lt;/span&gt; Texture2D _picture;   &lt;span&gt;//used in inventory/vendor dialogs&lt;/span&gt;

    }&lt;/pre&gt;
&lt;p&gt; 
&lt;p&gt;The Texture2D is an XNA Framework class, so if you're doing a non-XNA game you'll need to replace it with whatever class is similar.
&lt;p&gt; 
&lt;p&gt;We'll have one type of object that inherits from this, money:
&lt;p&gt; &lt;pre&gt;    &lt;span&gt;public&lt;/span&gt; &lt;span&gt;class&lt;/span&gt; Money : BaseItem
    {
        &lt;span&gt;private&lt;/span&gt; &lt;span&gt;const&lt;/span&gt; &lt;span&gt;int&lt;/span&gt; NUM_COINS_TO_WEIGHT_UNIT = 100;

        &lt;span&gt;private&lt;/span&gt; &lt;span&gt;int&lt;/span&gt; _amount;

        &lt;span&gt;//Overrides since the strength required changes as the amount changes&lt;/span&gt;
        &lt;span&gt;public&lt;/span&gt; Byte StrengthRequired()
        {
            &lt;span&gt;return&lt;/span&gt; (&lt;span&gt;byte&lt;/span&gt;)(_amount * 0.01);
        }

        &lt;span&gt;public&lt;/span&gt; &lt;span&gt;int&lt;/span&gt; Total()
        {
            &lt;span&gt;return&lt;/span&gt; _amount;
        }
        
        &lt;span&gt;public&lt;/span&gt; Money()
        {

        }

        &lt;span&gt;public&lt;/span&gt; &lt;span&gt;static&lt;/span&gt; &lt;span&gt;int&lt;/span&gt; GetWeight(&lt;span&gt;int&lt;/span&gt; amount)
        {
            &lt;span&gt;return&lt;/span&gt; (&lt;span&gt;int&lt;/span&gt;)(amount / NUM_COINS_TO_WEIGHT_UNIT);
        }

        &lt;span&gt;public&lt;/span&gt; &lt;span&gt;int&lt;/span&gt; TotalWeight
        {
            get { &lt;span&gt;return&lt;/span&gt; GetWeight(_amount); }
        }

        &lt;span&gt;//Called for things like buying items&lt;/span&gt;
        &lt;span&gt;public&lt;/span&gt; &lt;span&gt;void&lt;/span&gt; Subtract(&lt;span&gt;int&lt;/span&gt; amount)
        {
            &lt;span&gt;if&lt;/span&gt; (amount &amp;lt;= _amount)
                _amount -= amount;
        }

        &lt;span&gt;//Parameter is declared as ref so we can modify it to let the calling code know&lt;/span&gt;
        &lt;span&gt;//that we couldn't hold the full amount. This should never happen however&lt;/span&gt;
        &lt;span&gt;//as the weight alone should limit what an entity can carry&lt;/span&gt;
        &lt;span&gt;public&lt;/span&gt; &lt;span&gt;void&lt;/span&gt; Add(&lt;span&gt;ref&lt;/span&gt; &lt;span&gt;int&lt;/span&gt; amount)
        {
            &lt;span&gt;if&lt;/span&gt; (amount + _amount &amp;lt;= &lt;span&gt;int&lt;/span&gt;.MaxValue)
            {
                _amount += amount;
            }
            &lt;span&gt;else&lt;/span&gt;
            {
                amount = (&lt;span&gt;int&lt;/span&gt;)(&lt;span&gt;int&lt;/span&gt;.MaxValue - _amount);
                _amount = &lt;span&gt;int&lt;/span&gt;.MaxValue;
            }
        }

        &lt;span&gt;//Called for things like dropping on the ground etc&lt;/span&gt;
        &lt;span&gt;//Added simply for making sense in the context for which it's used&lt;/span&gt;
        &lt;span&gt;public&lt;/span&gt; &lt;span&gt;void&lt;/span&gt; Drop(&lt;span&gt;int&lt;/span&gt; amount)
        {
            Subtract(amount);
        }

        &lt;span&gt;public&lt;/span&gt; &lt;span&gt;void&lt;/span&gt; Give(&lt;span&gt;ref&lt;/span&gt; &lt;span&gt;int&lt;/span&gt; amount, &lt;span&gt;ref&lt;/span&gt; Entity target)
        {
            &lt;span&gt;if&lt;/span&gt; (amount &amp;lt;= _amount)
            {
                target.AddMoney(&lt;span&gt;ref&lt;/span&gt; amount);

            }
        }
    }&lt;/pre&gt;
&lt;p&gt;


&lt;p&gt; 
&lt;p&gt;All our other item types will inherit from the Item class, which itself inherits BaseItem:
&lt;p&gt; &lt;pre&gt;    &lt;span&gt;public&lt;/span&gt; &lt;span&gt;abstract&lt;/span&gt; &lt;span&gt;class&lt;/span&gt; Item : BaseItem
    {
        &lt;span&gt;protected&lt;/span&gt; ItemType _type;

        &lt;span&gt;protected&lt;/span&gt; &lt;span&gt;int&lt;/span&gt; _cost;
        &lt;span&gt;protected&lt;/span&gt; &lt;span&gt;bool&lt;/span&gt; _magical;
        &lt;span&gt;protected&lt;/span&gt; AlignmentBitwise_alignment;

        &lt;span&gt;protected&lt;/span&gt; &lt;span&gt;bool&lt;/span&gt; _questItem;
        &lt;span&gt;protected&lt;/span&gt; &lt;span&gt;byte&lt;/span&gt; _questItemPiece;
        &lt;span&gt;protected&lt;/span&gt; &lt;span&gt;int&lt;/span&gt; _questID;
        &lt;span&gt;protected&lt;/span&gt; &lt;span&gt;bool&lt;/span&gt; _questReward;&lt;/pre&gt;
&lt;blockquote&gt;&lt;pre&gt;        &lt;span&gt;protected&lt;/span&gt; &lt;span&gt;bool&lt;/span&gt; _droppable;
        &lt;span&gt;protected&lt;/span&gt; &lt;span&gt;bool&lt;/span&gt; _tradeable;

        &lt;span&gt;protected&lt;/span&gt; &lt;span&gt;int&lt;/span&gt; _baseHP;

        &lt;span&gt;protected&lt;/span&gt; List&amp;lt;Spell&amp;gt; _spells;

        &lt;span&gt;protected&lt;/span&gt; List&amp;lt;Bonus&amp;gt; _defBonuses;
        &lt;span&gt;protected&lt;/span&gt; List&amp;lt;Bonus&amp;gt; _offBonuses;
        &lt;span&gt;protected&lt;/span&gt; List&amp;lt;Bonus&amp;gt; _miscBonuses;

        &lt;span&gt;//Is item automatically put in character's hand when picked up&lt;/span&gt;
        &lt;span&gt;protected&lt;/span&gt; &lt;span&gt;bool&lt;/span&gt; _autoReady;

        &lt;span&gt;protected&lt;/span&gt; &lt;span&gt;bool&lt;/span&gt; _repairable;

        &lt;span&gt;protected&lt;/span&gt; &lt;span&gt;bool&lt;/span&gt; _unique;

        &lt;span&gt;//ID of the skill required to use this&lt;/span&gt;
        &lt;span&gt;protected&lt;/span&gt; &lt;span&gt;int&lt;/span&gt; _skillRequired;

        &lt;span&gt;//All classes that derive from this one must implement this function&lt;/span&gt;
        &lt;span&gt;public&lt;/span&gt; &lt;span&gt;abstract&lt;/span&gt; &lt;span&gt;bool&lt;/span&gt; Use(&lt;span&gt;ref&lt;/span&gt; Object target, &lt;span&gt;ref&lt;/span&gt; Entity wielder);

        &lt;span&gt;public&lt;/span&gt; ItemType Type
        {
            get { &lt;span&gt;return&lt;/span&gt; _type; }
            set { _type = &lt;span&gt;value&lt;/span&gt;; }
        }

        &lt;span&gt;public&lt;/span&gt; &lt;span&gt;string&lt;/span&gt; Name
        {
            get { &lt;span&gt;return&lt;/span&gt; _name; }
            set { _name = &lt;span&gt;value&lt;/span&gt;; }
        }

        &lt;span&gt;public&lt;/span&gt; &lt;span&gt;float&lt;/span&gt; Weight
        {
            get { &lt;span&gt;return&lt;/span&gt; _weight; }
            set { _weight = &lt;span&gt;value&lt;/span&gt;; }
        }
&lt;span&gt;//other property accessors snipped for brevity&lt;/span&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;   }
&lt;/pre&gt;
&lt;p&gt;


&lt;p&gt;ItemType is one of the following:
&lt;p&gt; &lt;pre&gt;    &lt;span&gt;public&lt;/span&gt; &lt;span&gt;enum&lt;/span&gt; ItemType
    {
        Armor,
        Chest,
        Key,
        Potion,
        Scroll,
        Shield,
        Weapon,
        Money         &lt;span&gt;//Placed out of order since we don't create money in the Editor&lt;/span&gt;
    }&lt;/pre&gt;


&lt;p&gt; 
&lt;p&gt;For the game I'm creating using this framework, I have an editor that I use to create items. I load the names of the items in this enum into a combobox but since money isn't created I just put it at the end of the list and load all the items except that last one. A bit of a hack, but it works in this case. Any items that a developer wants to add to the list should be placed before Money to avoid breaking any existing created items.
&lt;p&gt; 
&lt;p&gt;If you want to have character alignments in your game the _alignment property allows you to have items that are only used by characters of a certain alignment. In the case of my game it's a pretty simple enum:
&lt;p&gt; &lt;pre&gt;    [Flags] 
    &lt;span&gt;public&lt;/span&gt; &lt;span&gt;enum&lt;/span&gt; AlignmentBitwise
    {
        None,
        Good,
        Neutral,
        Evil
    }
&lt;/pre&gt;




&lt;p&gt; 
&lt;p&gt;The [Flags] attribute allows for multiple alignments to be selected. 
&lt;p&gt; 
&lt;p&gt;Every good RPG has quests and the rewards are sometimes items so there's a group of properties to allow you to tell if an item is the object of a quest or the reward of a quest. You can also have items that are broken into pieces. You can also have the item be unique in your world if you'd like so everyone in your multiplayer game isn't running around with the most powerful item in the game.
&lt;p&gt; 
&lt;p&gt;If you're doing a multiplayer RPG you can allow items to not be tradeable between players by setting the _tradeable property. You can also not allow items to be dropped so other players can pick them up, requiring that the item be destroyed if the player wants to get rid of it (or put in a bank if you have that functionality).
&lt;p&gt; 
&lt;p&gt;If you want to have your items be capable of being destroyed and repaired those properties exist.
&lt;p&gt; 
&lt;p&gt;A set of properties exist to allow you to add defensive, offensive, or miscellaneous bonuses to the item and to specify if the item is magical and has spells embedded in it that allows the character to use them as if they knew them. The Bonus structure looks like this:
&lt;p&gt; &lt;pre&gt;    &lt;span&gt;public&lt;/span&gt; &lt;span&gt;struct&lt;/span&gt; Bonus
    {
        &lt;span&gt;public&lt;/span&gt; BonusType Type;
        &lt;span&gt;public&lt;/span&gt; &lt;span&gt;short&lt;/span&gt; Amount;
        &lt;span&gt;public&lt;/span&gt; &lt;span&gt;int&lt;/span&gt;  TimeStarted;
        &lt;span&gt;public&lt;/span&gt; &lt;span&gt;int&lt;/span&gt; Duration;
        &lt;span&gt;public&lt;/span&gt; &lt;span&gt;int&lt;/span&gt; ElapsedTime;
    }&lt;/pre&gt;
&lt;p&gt;


&lt;p&gt; 
&lt;p&gt;It allows for temporary bonuses. If the bonus is permanent you would just set the Duration to 0. The Type member is an enum with the following:
&lt;p&gt; &lt;pre&gt;    &lt;span&gt;public&lt;/span&gt; &lt;span&gt;enum&lt;/span&gt; BonusType
    {
        Disease,
        Magic,
        Poison,
        Potion,
        Other
    }&lt;/pre&gt;


&lt;p&gt; 
&lt;p&gt;You could have a dagger with that does additional poison damage by adding a Bonus object to the _offBonuses list with a BonusType of Poison. When the damage is calculated this additional bonus amount would be handled separately since the target could have a weakness or resistance to poison. If the target had neither, the bonus amount would apply even if the other damage doesn't get applied for some reason. Again, flexibility is key in what I'm trying to put together.
&lt;p&gt; 
&lt;p&gt;Depending on how you want your engine to work you can either have the calculation of whether or not using the item succeeds as a member of the item itself or of the Entity class (which we'll build in a couple of posts). At this point I haven't determined how I'm going to do it so the Use method just exists.  I'm leaning towards just having the Entity object do it, but having the method in the Item class allows me to go either way.
&lt;p&gt; 
&lt;p&gt;The classes that derive from Item have additional properties and methods depending on the type of item. The Armor class looks like the following:
&lt;p&gt; &lt;pre&gt;    [Serializable()]
    &lt;span&gt;public&lt;/span&gt; &lt;span&gt;class&lt;/span&gt; Armor : Item
    {
        &lt;span&gt;private&lt;/span&gt; ArmorArea _location;
        &lt;span&gt;private&lt;/span&gt; &lt;span&gt;short&lt;/span&gt; _defValue;
        &lt;span&gt;private&lt;/span&gt; &lt;span&gt;bool&lt;/span&gt; _equipped;

        &lt;span&gt;public&lt;/span&gt; ArmorArea Location
        {
            get { &lt;span&gt;return&lt;/span&gt; _location; }
            set { _location = &lt;span&gt;value&lt;/span&gt;; }
        }

        &lt;span&gt;public&lt;/span&gt; &lt;span&gt;short&lt;/span&gt; DefensiveValue
        {
            get { &lt;span&gt;return&lt;/span&gt; _defValue; }
            set { _defValue = &lt;span&gt;value&lt;/span&gt;; }
        }

        &lt;span&gt;public&lt;/span&gt; &lt;span&gt;bool&lt;/span&gt; Equipped
        {
            get { &lt;span&gt;return&lt;/span&gt; _equipped; }
        }

        &lt;span&gt;public&lt;/span&gt; &lt;span&gt;override&lt;/span&gt; &lt;span&gt;bool&lt;/span&gt; Use(&lt;span&gt;ref&lt;/span&gt; Object target, &lt;span&gt;ref&lt;/span&gt; Entity wielder)
        {
            &lt;span&gt;//Use for this class means to equip, so set member if it's being equipped&lt;/span&gt;
            &lt;span&gt;short&lt;/span&gt; loc = (&lt;span&gt;short&lt;/span&gt;)target;

            &lt;span&gt;if&lt;/span&gt; (loc &amp;gt; -1)
            {
                &lt;span&gt;//the value tells us where it's trying to be equipped so check it&lt;/span&gt;
                &lt;span&gt;//for instance, a piece is dragged onto the wrong location in the character screen&lt;/span&gt;
                &lt;span&gt;if&lt;/span&gt; (loc != (&lt;span&gt;short&lt;/span&gt;)_location)
                    &lt;span&gt;return&lt;/span&gt; &lt;span&gt;false&lt;/span&gt;;

                _equipped = &lt;span&gt;true&lt;/span&gt;;
            }
            &lt;span&gt;else&lt;/span&gt;
                _equipped = &lt;span&gt;false&lt;/span&gt;;
            
            &lt;span&gt;return&lt;/span&gt; &lt;span&gt;true&lt;/span&gt;;
        }
    }
&lt;/pre&gt;
&lt;p&gt;


&lt;p&gt;The _location is an enum with the following:
&lt;p&gt; &lt;pre&gt;    &lt;span&gt;public&lt;/span&gt; &lt;span&gt;enum&lt;/span&gt; ArmorArea
    {
        None=-1,
        Head,
        Neck,
        Chest,
        LeftUpperArm,
        UpperArms,
        LeftLowerArm,
        LowerArms,
        LeftWrist,
        Wrists,
        LeftHand,
        &lt;span&gt;//Could add fingers here for rings&lt;/span&gt;
        Hands,
        RightUpperArm,
        RightLowerArm,
        RightWrist,
        RightHand,
        &lt;span&gt;//Could add fingers here for rings&lt;/span&gt;
        Waist,
        Groin,
        LeftUpperLeg,
        UpperLegs,
        LeftKnee,
        Knees,
        LeftLowerLeg,
        LowerLegs,
        LeftFoot,
        Feet,
        RightUpperLeg,
        RightKnee,
        RightLowerLeg,
        RightFoot
    }&lt;/pre&gt;
&lt;p&gt;


&lt;p&gt; 
&lt;p&gt;I've tried to account for any type of armor you could want to create. If you can think of an area I've missed feel free to let me know.
&lt;p&gt; 
&lt;p&gt;The Armor class is one example of where I've overridden the Use method. It simply sets the _equipped member if the armor is trying to be used in the correct area of the body.
&lt;p&gt; 
&lt;p&gt;Your character is probably going to need some weapons in the course of the game so we have a Weapon class that derives from Item:
&lt;p&gt; &lt;pre&gt;    &lt;span&gt;public&lt;/span&gt; &lt;span&gt;enum&lt;/span&gt; WeaponType
    {
        OneHandSword,
        TwoHandSword,
        Staff,
        Mace,
        Bow
    }

    &lt;span&gt;public&lt;/span&gt; &lt;span&gt;class&lt;/span&gt; Weapon : Item
    {
        &lt;span&gt;//array of Damager objects&lt;/span&gt;
        &lt;span&gt;private&lt;/span&gt; List&amp;lt;Damager&amp;gt; _damagers;
        &lt;span&gt;private&lt;/span&gt; WeaponType _weaponType;

        &lt;span&gt;public&lt;/span&gt; &lt;span&gt;void&lt;/span&gt; AddDamager(Damager item)
        {
            _damagers.Add(item);
        }

        &lt;span&gt;public&lt;/span&gt; &lt;span&gt;void&lt;/span&gt; AddDamager(DamageType type, String amount, String affects)
        {
            Damager item = &lt;span&gt;new&lt;/span&gt; Damager();

            item.Affects = affects;
            item.DamageAmount = amount;
            item.Type = type;

            _damagers.Add(item);

        }

        &lt;span&gt;protected&lt;/span&gt; &lt;span&gt;int&lt;/span&gt; GetDamage(Byte damageType)
        {
            String min, max;

            min = _damagers[damageType].DamageAmount.Substring(0, _damagers[damageType].DamageAmount.IndexOf(&lt;span&gt;&amp;quot;-&amp;quot;&lt;/span&gt;));
            max = _damagers[damageType].DamageAmount.Substring(_damagers[damageType].DamageAmount.IndexOf(&lt;span&gt;&amp;quot;-&amp;quot;&lt;/span&gt;)+1);

            &lt;span&gt;return&lt;/span&gt; GlobalFunctions.GetRandomNumber(Convert.ToInt32(min), Convert.ToInt32(max));
        }

        &lt;span&gt;public&lt;/span&gt; &lt;span&gt;override&lt;/span&gt; &lt;span&gt;bool&lt;/span&gt; Use(&lt;span&gt;ref&lt;/span&gt; Object target, &lt;span&gt;ref&lt;/span&gt; Entity wielder)
        {



            &lt;span&gt;return&lt;/span&gt; &lt;span&gt;true&lt;/span&gt;;
        }
    }
&lt;/pre&gt;


&lt;p&gt; 
&lt;p&gt;I've allowed a weapon to be able to affect different types of entities differently by using the _damagers member. The type of damage can be one or more of the following:
&lt;p&gt; &lt;pre&gt;    &lt;span&gt;public&lt;/span&gt; &lt;span&gt;enum&lt;/span&gt; DamageType
    {
        Crushing,
        Piercing,
        Slashing,
        Fire,
        Water,
        Magical,
        Disease,
        Poison
    }&lt;/pre&gt;


&lt;p&gt; 
&lt;p&gt;If you want to create a Dagger of Troll Vanquishing, you could add a damager with the Affects member set to &amp;quot;Troll&amp;quot; and the Type member set to Poison or Magic and, assuming you have Entity objects in your game with the name &amp;quot;Troll&amp;quot; you can have the dagger cause damage to them even if they resist any normal damage. Every weapon will have at least one damager item in the list with a Type of Crushing, Piercing, or Slashing to represent the normal damage of that type of weapon. Add a Fire damager to the Dagger of Troll Vanquishing and stack the possible damage that can be done. A Water Sprite creature would probably have a weakness to fire based attacks so a Fire type damager would do more than normal damage and probably couldn't be resisted.
&lt;p&gt; 
&lt;p&gt;Another item type we can have is the ever-present treasure chest. This one is a little more complicated than most because of all the options that can exist - does it require a key to open, is it locked; if so, how hard would it be to pick the lock, is it trapped; if so, what type of trap is it and how difficult is it to disarm, what items does it contain, etc.? Here's a first cut of the Chest class:
&lt;p&gt; &lt;pre&gt;    &lt;span&gt;class&lt;/span&gt; Chest : Item
    {
        &lt;span&gt;private&lt;/span&gt; &lt;span&gt;bool&lt;/span&gt; _locked;

        &lt;span&gt;//tag property of the key item required to open the lock, &lt;/span&gt;
        &lt;span&gt;//set to &amp;quot;&amp;quot; if a generic key item will open the lock&lt;/span&gt;
        &lt;span&gt;private&lt;/span&gt; &lt;span&gt;string&lt;/span&gt; _keyRequired;   

        &lt;span&gt;private&lt;/span&gt; &lt;span&gt;bool&lt;/span&gt; _open;

        &lt;span&gt;private&lt;/span&gt; &lt;span&gt;bool&lt;/span&gt; _randomlyGenerate;
        &lt;span&gt;private&lt;/span&gt; &lt;span&gt;int&lt;/span&gt; _randomType;
        &lt;span&gt;private&lt;/span&gt; &lt;span&gt;int&lt;/span&gt; _maxValue;

        &lt;span&gt;private&lt;/span&gt; &lt;span&gt;bool&lt;/span&gt; _trapped;
        &lt;span&gt;private&lt;/span&gt; TrapType _trapType;
        &lt;span&gt;private&lt;/span&gt; Difficulty _trapLevel;
        &lt;span&gt;private&lt;/span&gt; &lt;span&gt;int&lt;/span&gt; _damage;

        &lt;span&gt;private&lt;/span&gt; List&amp;lt;Item&amp;gt; _items;

        &lt;span&gt;public&lt;/span&gt; &lt;span&gt;bool&lt;/span&gt; Open
        {
            get { &lt;span&gt;return&lt;/span&gt; _open; }
            set 
            { 
                _open = &lt;span&gt;value&lt;/span&gt;; 
                &lt;span&gt;if&lt;/span&gt; (_open)
                    _locked = &lt;span&gt;false&lt;/span&gt;; 
            }
        }

        &lt;span&gt;public&lt;/span&gt; &lt;span&gt;override&lt;/span&gt; &lt;span&gt;bool&lt;/span&gt; Use(&lt;span&gt;ref&lt;/span&gt; &lt;span&gt;object&lt;/span&gt; target, &lt;span&gt;ref&lt;/span&gt; Entity wielder)
        {
            &lt;span&gt;//if the chest is already open return&lt;/span&gt;
            &lt;span&gt;if&lt;/span&gt; (_open)
                &lt;span&gt;return&lt;/span&gt; &lt;span&gt;true&lt;/span&gt;;

            &lt;span&gt;//target in this case is null, since the chest is the target&lt;/span&gt;
            &lt;span&gt;//wielder is the entity trying to open the chest&lt;/span&gt;
            &lt;span&gt;//call PickLock if the chest is locked&lt;/span&gt;
            &lt;span&gt;if&lt;/span&gt; (_locked)
            {
                &lt;span&gt;if&lt;/span&gt; (!wielder.HasItemByTag(_keyRequired))
                    &lt;span&gt;return&lt;/span&gt; &lt;span&gt;false&lt;/span&gt;;

                _open = &lt;span&gt;true&lt;/span&gt;;
            }

            &lt;span&gt;return&lt;/span&gt; &lt;span&gt;true&lt;/span&gt;;
        }

        &lt;span&gt;public&lt;/span&gt; &lt;span&gt;bool&lt;/span&gt; PickLock(&lt;span&gt;ref&lt;/span&gt; Entity entity)
        {
            &lt;span&gt;//function should never be called for an unlocked chest but just in case...&lt;/span&gt;
            &lt;span&gt;if&lt;/span&gt; (_locked)
            {
                &lt;span&gt;if&lt;/span&gt; (entity.HasSkillByID(_skillRequired))
                {
                    Object chest = (Object)&lt;span&gt;this&lt;/span&gt;;

                    &lt;span&gt;return&lt;/span&gt; entity.UseSkill(&lt;span&gt;ref&lt;/span&gt; chest, _skillRequired, _trapLevel);

                }
                &lt;span&gt;else&lt;/span&gt;
                    &lt;span&gt;return&lt;/span&gt; &lt;span&gt;false&lt;/span&gt;;
            }

            &lt;span&gt;return&lt;/span&gt; &lt;span&gt;true&lt;/span&gt;;
        }

        &lt;span&gt;public&lt;/span&gt; List&amp;lt;Item&amp;gt; GetItems()
        {
            &lt;span&gt;if&lt;/span&gt; (_randomlyGenerate)
            {
                &lt;span&gt;int&lt;/span&gt; &lt;span&gt;value&lt;/span&gt; = 0;
                Item item = &lt;span&gt;null&lt;/span&gt;;

                &lt;span&gt;do&lt;/span&gt;
                {
                    &lt;span&gt;//get a random item type&lt;/span&gt;


                    &lt;span&gt;//get a random item of that type&lt;/span&gt;


                    &lt;span&gt;//add the value of that item to the value of the items in the list&lt;/span&gt;
                    &lt;span&gt;value&lt;/span&gt; += item.Cost;

                }
                &lt;span&gt;while&lt;/span&gt; (&lt;span&gt;value&lt;/span&gt; &amp;lt; _maxValue);

                &lt;span&gt;return&lt;/span&gt; _items;
            }
            &lt;span&gt;else&lt;/span&gt;
            {
                &lt;span&gt;if&lt;/span&gt; (!(_items == &lt;span&gt;null&lt;/span&gt;))
                    &lt;span&gt;return&lt;/span&gt; _items;
                &lt;span&gt;else&lt;/span&gt;
                    &lt;span&gt;throw&lt;/span&gt; (&lt;span&gt;new&lt;/span&gt; Exception(&lt;span&gt;&amp;quot;Invalid items list&amp;quot;&lt;/span&gt;));
            }
        }
    }
&lt;/pre&gt;


&lt;p&gt;


&lt;p&gt; 
&lt;p&gt;There's a lot of other item types that we can create - potions, scrolls, wands, etc. but this will do for now. Hopefully this will guide you in a good direction for the Item system for your RPG. We'll probably update and possibly change some things as we go along. I know that's not an ideal way to do development, but we'll get there. :)
&lt;p&gt; 
&lt;p&gt;I think for the next post we'll cover the magic system I'm currently using. After that maybe quests and conversation, then we'll tie everything together in our Entity class. From there it's a short step to actually throwing all this stuff into some kind of game. I'm just as anxious to get there as hopefully everyone else is, so stay tuned. &lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-4134251031648887394&amp;page=RSS%3a+RPG+Game+Development+-+Part+4&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=machaira.spaces.live.com&amp;amp;GT1=machaira"&gt;</description><comments>http://machaira.spaces.live.com/Blog/cns!C6A0309746469D9E!467.entry#comment</comments><guid isPermaLink="true">http://machaira.spaces.live.com/Blog/cns!C6A0309746469D9E!467.entry</guid><pubDate>Tue, 18 Dec 2007 17:02:40 GMT</pubDate><slash:comments>2</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://machaira.spaces.live.com/blog/cns!C6A0309746469D9E!467/comments/feed.rss</wfw:commentRss><wfw:comment>http://machaira.spaces.live.com/Blog/cns!C6A0309746469D9E!467.entry#comment</wfw:comment><dcterms:modified>2007-12-18T17:02:40Z</dcterms:modified></item><item><title>XNA GS 2.0 Available</title><link>http://machaira.spaces.live.com/Blog/cns!C6A0309746469D9E!459.entry</link><description>&lt;p&gt;So you've been living under a rock or just escaped your kidnappers and haven't heard that XNA Game Studio 2.0 was released this morning. This is your wake up call to go &lt;a href="http://creators.xna.com/Education/GettingStarted.aspx" target="_blank"&gt;here&lt;/a&gt; and download it and get started making those multiplayer games you've always wanted to make. Let me know when you make them so I can play too. :)&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-4134251031648887394&amp;page=RSS%3a+XNA+GS+2.0+Available&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=machaira.spaces.live.com&amp;amp;GT1=machaira"&gt;</description><comments>http://machaira.spaces.live.com/Blog/cns!C6A0309746469D9E!459.entry#comment</comments><guid isPermaLink="true">http://machaira.spaces.live.com/Blog/cns!C6A0309746469D9E!459.entry</guid><pubDate>Thu, 13 Dec 2007 18:42:49 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://machaira.spaces.live.com/blog/cns!C6A0309746469D9E!459/comments/feed.rss</wfw:commentRss><wfw:comment>http://machaira.spaces.live.com/Blog/cns!C6A0309746469D9E!459.entry#comment</wfw:comment><dcterms:modified>2007-12-13T18:42:49Z</dcterms:modified></item><item><title>RPG Game Development - Part 3</title><link>http://machaira.spaces.live.com/Blog/cns!C6A0309746469D9E!455.entry</link><description>&lt;p&gt;An RPG is useless unless the character can do something in the world, thus the need for a Skill class, which we'll talk about in this post. &lt;p&gt;  &lt;p&gt;The first thing we need to do is define what type of skills we can have. For now, we'll limit them to 3:&lt;pre&gt;    &lt;span&gt;public&lt;/span&gt; &lt;span&gt;enum&lt;/span&gt; SkillType
    {
        Defensive,
        NonCombat,
        Offensive
    }&lt;/pre&gt;


&lt;p&gt; 
&lt;p&gt;Our Skill class looks like this:
&lt;p&gt; &lt;pre&gt;    [Serializable]
    &lt;span&gt;public&lt;/span&gt; &lt;span&gt;class&lt;/span&gt; Skill
    {
        &lt;span&gt;private&lt;/span&gt; &lt;span&gt;int&lt;/span&gt; _id;
        &lt;span&gt;private&lt;/span&gt; String _name;
        &lt;span&gt;private&lt;/span&gt; String _description;

        &lt;span&gt;private&lt;/span&gt; SkillType _type;

        &lt;span&gt;private&lt;/span&gt; &lt;span&gt;int&lt;/span&gt; _preferredClassID;

        &lt;span&gt;private&lt;/span&gt; Dictionary&amp;lt;&lt;span&gt;int&lt;/span&gt;, &lt;span&gt;string&lt;/span&gt;&amp;gt; _costs;
        &lt;span&gt;private&lt;/span&gt; Dictionary&amp;lt;&lt;span&gt;int&lt;/span&gt;,&lt;span&gt;int&lt;/span&gt;&amp;gt; _classBonuses;
        &lt;span&gt;private&lt;/span&gt; List&amp;lt;MinMaxBonus&amp;gt; _levelBonuses;
        &lt;span&gt;private&lt;/span&gt; Dictionary&amp;lt;&lt;span&gt;int&lt;/span&gt;, &lt;span&gt;int&lt;/span&gt;&amp;gt; _raceBonuses;
        &lt;span&gt;private&lt;/span&gt; Dictionary&amp;lt;&lt;span&gt;int&lt;/span&gt;, MinMaxBonus&amp;gt; _statBonuses;

        &lt;span&gt;private&lt;/span&gt; &lt;span&gt;bool&lt;/span&gt; _alwaysOn;

        &lt;span&gt;public&lt;/span&gt; &lt;span&gt;int&lt;/span&gt; ID
        {
            get { &lt;span&gt;return&lt;/span&gt; _id; }
        }

        &lt;span&gt;public&lt;/span&gt; &lt;span&gt;string&lt;/span&gt; Name
        {
            get { &lt;span&gt;return&lt;/span&gt; _name; }
            set { &lt;span&gt;if&lt;/span&gt; (&lt;span&gt;value&lt;/span&gt;.Length &amp;gt; 0) _name = &lt;span&gt;value&lt;/span&gt;; }
        }

        &lt;span&gt;public&lt;/span&gt; &lt;span&gt;string&lt;/span&gt; Description
        {
            get { &lt;span&gt;return&lt;/span&gt; _description; }
            set { &lt;span&gt;if&lt;/span&gt; (&lt;span&gt;value&lt;/span&gt;.Length &amp;gt; 0) _description = &lt;span&gt;value&lt;/span&gt;; }
        }

        &lt;span&gt;public&lt;/span&gt; SkillType Type
        {
            get { &lt;span&gt;return&lt;/span&gt; _type; }
            set { _type = &lt;span&gt;value&lt;/span&gt;; }
        }

        &lt;span&gt;public&lt;/span&gt; &lt;span&gt;int&lt;/span&gt; PreferredClassID
        {
            get { &lt;span&gt;return&lt;/span&gt; _preferredClassID; }
            set { _preferredClassID = &lt;span&gt;value&lt;/span&gt;; }
        }

        &lt;span&gt;public&lt;/span&gt; &lt;span&gt;bool&lt;/span&gt; AlwaysOn
        {
            get { &lt;span&gt;return&lt;/span&gt; _alwaysOn; }
            set { _alwaysOn = &lt;span&gt;value&lt;/span&gt;; }
        }

        &lt;span&gt;public&lt;/span&gt; Skill(&lt;span&gt;int&lt;/span&gt; id)
        {
            _costs = &lt;span&gt;new&lt;/span&gt; Dictionary&amp;lt;&lt;span&gt;int&lt;/span&gt;, &lt;span&gt;string&lt;/span&gt;&amp;gt;();
            _classBonuses = &lt;span&gt;new&lt;/span&gt; Dictionary&amp;lt;&lt;span&gt;int&lt;/span&gt;, &lt;span&gt;int&lt;/span&gt;&amp;gt;();
            _raceBonuses = &lt;span&gt;new&lt;/span&gt; Dictionary&amp;lt;&lt;span&gt;int&lt;/span&gt;, &lt;span&gt;int&lt;/span&gt;&amp;gt;();
            _levelBonuses = &lt;span&gt;new&lt;/span&gt; List&amp;lt;MinMaxBonus&amp;gt;();
            _statBonuses = &lt;span&gt;new&lt;/span&gt; Dictionary&amp;lt;&lt;span&gt;int&lt;/span&gt;, MinMaxBonus&amp;gt;();
            _alwaysOn = &lt;span&gt;false&lt;/span&gt;;

            _id = id;

        }

        &lt;span&gt;public&lt;/span&gt; &lt;span&gt;void&lt;/span&gt; AddCost(&lt;span&gt;int&lt;/span&gt; id, &lt;span&gt;string&lt;/span&gt; cost)
        {
            &lt;span&gt;if&lt;/span&gt; (_costs == &lt;span&gt;null&lt;/span&gt;)
                _costs = &lt;span&gt;new&lt;/span&gt; Dictionary&amp;lt;&lt;span&gt;int&lt;/span&gt;, &lt;span&gt;string&lt;/span&gt;&amp;gt;();

            _costs.Add(id, cost);

        }

        &lt;span&gt;public&lt;/span&gt; &lt;span&gt;void&lt;/span&gt; RemoveCost(&lt;span&gt;int&lt;/span&gt; id)
        {
            &lt;span&gt;if&lt;/span&gt; (_costs != &lt;span&gt;null&lt;/span&gt;)
                _costs.Remove(id);
        }

        &lt;span&gt;public&lt;/span&gt; &lt;span&gt;string&lt;/span&gt; GetCost(&lt;span&gt;int&lt;/span&gt; id)
        {
            &lt;span&gt;string&lt;/span&gt; cost = &lt;span&gt;&amp;quot;&amp;quot;&lt;/span&gt;;

            &lt;span&gt;if&lt;/span&gt; (_costs != &lt;span&gt;null&lt;/span&gt;)
                _costs.TryGetValue(id, &lt;span&gt;out&lt;/span&gt; cost);

            &lt;span&gt;return&lt;/span&gt; cost;
        }

        &lt;span&gt;public&lt;/span&gt; &lt;span&gt;void&lt;/span&gt; AddClassBonus(&lt;span&gt;int&lt;/span&gt; id, &lt;span&gt;string&lt;/span&gt; bonus)
        {
            &lt;span&gt;if&lt;/span&gt; (_classBonuses == &lt;span&gt;null&lt;/span&gt;)
                _classBonuses = &lt;span&gt;new&lt;/span&gt; Dictionary&amp;lt;&lt;span&gt;int&lt;/span&gt;, &lt;span&gt;int&lt;/span&gt;&amp;gt;();

            _costs.Add(id, bonus);

        }

        &lt;span&gt;public&lt;/span&gt; &lt;span&gt;void&lt;/span&gt; RemoveClassBonus(&lt;span&gt;int&lt;/span&gt; id)
        {
            &lt;span&gt;if&lt;/span&gt; (_classBonuses != &lt;span&gt;null&lt;/span&gt;)
                _classBonuses.Remove(id);
        }

        &lt;span&gt;public&lt;/span&gt; &lt;span&gt;int&lt;/span&gt; GetClassBonus(&lt;span&gt;int&lt;/span&gt; id)
        {
            &lt;span&gt;int&lt;/span&gt; bonus = 0;

            &lt;span&gt;if&lt;/span&gt; (_classBonuses != &lt;span&gt;null&lt;/span&gt;)
                _classBonuses.TryGetValue(id, &lt;span&gt;out&lt;/span&gt; bonus);

            &lt;span&gt;return&lt;/span&gt; bonus;
        }

        &lt;span&gt;public&lt;/span&gt; &lt;span&gt;void&lt;/span&gt; AddRaceBonus(&lt;span&gt;int&lt;/span&gt; id, &lt;span&gt;int&lt;/span&gt; bonus)
        {
            &lt;span&gt;if&lt;/span&gt; (_raceBonuses == &lt;span&gt;null&lt;/span&gt;)
                _raceBonuses = &lt;span&gt;new&lt;/span&gt; Dictionary&amp;lt;&lt;span&gt;int&lt;/span&gt;, &lt;span&gt;int&lt;/span&gt;&amp;gt;();

            _raceBonuses.Add(id, bonus);

        }

        &lt;span&gt;public&lt;/span&gt; &lt;span&gt;void&lt;/span&gt; RemoveRaceBonus(&lt;span&gt;int&lt;/span&gt; id)
        {
            &lt;span&gt;if&lt;/span&gt; (_raceBonuses != &lt;span&gt;null&lt;/span&gt;)
                _raceBonuses.Remove(id);
        }

        &lt;span&gt;public&lt;/span&gt; &lt;span&gt;int&lt;/span&gt; GetRaceBonus(&lt;span&gt;int&lt;/span&gt; id)
        {
            &lt;span&gt;int&lt;/span&gt; bonus = 0;

            &lt;span&gt;if&lt;/span&gt; (_raceBonuses != &lt;span&gt;null&lt;/span&gt;)
                _raceBonuses.TryGetValue(id, &lt;span&gt;out&lt;/span&gt; bonus);

            &lt;span&gt;return&lt;/span&gt; bonus;
        }

        &lt;span&gt;public&lt;/span&gt; &lt;span&gt;void&lt;/span&gt; AddStatBonus(&lt;span&gt;int&lt;/span&gt; id, MinMaxBonus bonus)
        {
            &lt;span&gt;if&lt;/span&gt; (_statBonuses == &lt;span&gt;null&lt;/span&gt;)
                _statBonuses = &lt;span&gt;new&lt;/span&gt; Dictionary&amp;lt;&lt;span&gt;int&lt;/span&gt;, MinMaxBonus&amp;gt;();

            _statBonuses.Add(id, bonus);

        }

        &lt;span&gt;public&lt;/span&gt; &lt;span&gt;void&lt;/span&gt; RemoveStatBonus(&lt;span&gt;int&lt;/span&gt; id)
        {
            &lt;span&gt;if&lt;/span&gt; (_statBonuses != &lt;span&gt;null&lt;/span&gt;)
                _statBonuses.Remove(id);
        }

        &lt;span&gt;public&lt;/span&gt; MinMaxBonus GetStatBonus(&lt;span&gt;int&lt;/span&gt; id)
        {
            MinMaxBonus bonus = &lt;span&gt;new&lt;/span&gt; MinMaxBonus();

            &lt;span&gt;if&lt;/span&gt; (_statBonuses != &lt;span&gt;null&lt;/span&gt;)
                _statBonuses.TryGetValue(id, &lt;span&gt;out&lt;/span&gt; bonus);

            &lt;span&gt;return&lt;/span&gt; bonus;
        }

        &lt;span&gt;public&lt;/span&gt; &lt;span&gt;void&lt;/span&gt; AddLevelBonus(MinMaxBonus bonus)
        {
            &lt;span&gt;if&lt;/span&gt; (_levelBonuses == &lt;span&gt;null&lt;/span&gt;)
                _levelBonuses = &lt;span&gt;new&lt;/span&gt; List&amp;lt;MinMaxBonus&amp;gt;();

            _levelBonuses.Add(bonus);

        }

        &lt;span&gt;public&lt;/span&gt; &lt;span&gt;void&lt;/span&gt; RemoveLevelBonus(&lt;span&gt;int&lt;/span&gt; index)
        {
            &lt;span&gt;if&lt;/span&gt; (_levelBonuses != &lt;span&gt;null&lt;/span&gt;)
                _levelBonuses.RemoveAt(index);
        }

        &lt;span&gt;public&lt;/span&gt; &lt;span&gt;int&lt;/span&gt; GetLevelBonus(&lt;span&gt;int&lt;/span&gt; level)
        {
            &lt;span&gt;if&lt;/span&gt; (_levelBonuses != &lt;span&gt;null&lt;/span&gt;)
            {
                &lt;span&gt;foreach&lt;/span&gt; (MinMaxBonus bonus &lt;span&gt;in&lt;/span&gt; _levelBonuses)
                {
                    &lt;span&gt;if&lt;/span&gt; (bonus.IsValueInRange(level))
                        &lt;span&gt;return&lt;/span&gt; bonus.Amount;
                }
            }

            &lt;span&gt;return&lt;/span&gt; 0;
        }

        &lt;span&gt;public&lt;/span&gt; &lt;span&gt;bool&lt;/span&gt; Use(&lt;span&gt;ref&lt;/span&gt; Object target, &lt;span&gt;ref&lt;/span&gt; Entity caster, Difficulty difficulty, &lt;span&gt;ref&lt;/span&gt; &lt;span&gt;int&lt;/span&gt; result)
        {

            &lt;span&gt;int&lt;/span&gt; roll;
            &lt;span&gt;int&lt;/span&gt; bns = 0;

            roll = GlobalFunctions.GetRandomNumber(DieType.d100);

            roll += (Int16)difficulty;

            &lt;span&gt;switch&lt;/span&gt; (_type)
            {
                &lt;span&gt;case&lt;/span&gt; SkillType.Defensive:
                {
                    roll += ((Entity)target).GetTotalOffBonus();
                    &lt;span&gt;break&lt;/span&gt;;
                }
                &lt;span&gt;case&lt;/span&gt; SkillType.NonCombat:
                {
                    roll += ((Entity)target).GetTotalMiscBonus();
                    &lt;span&gt;break&lt;/span&gt;;
                }
                &lt;span&gt;case&lt;/span&gt; SkillType.Offensive:
                {
                    roll += ((Entity)target).GetTotalDefBonus();
                    &lt;span&gt;break&lt;/span&gt;;
                }
            }

            &lt;span&gt;//Calculate level bonus&lt;/span&gt;
            &lt;span&gt;if&lt;/span&gt; (_levelBonuses == &lt;span&gt;null&lt;/span&gt;)
            {
                Int16 level = caster.Level;
                &lt;span&gt;//use default&lt;/span&gt;
                &lt;span&gt;switch&lt;/span&gt; (level)
                {
                    &lt;span&gt;case&lt;/span&gt; 1:
                    &lt;span&gt;case&lt;/span&gt; 2:
                    &lt;span&gt;case&lt;/span&gt; 3:
                    &lt;span&gt;case&lt;/span&gt; 4:
                    &lt;span&gt;case&lt;/span&gt; 5:
                    {
                        bns = (