tag:blogger.com,1999:blog-74069946359001755282024-03-12T20:30:35.439-07:00Game Development 101Richardhttp://www.blogger.com/profile/00190211511966499616noreply@blogger.comBlogger21125tag:blogger.com,1999:blog-7406994635900175528.post-75328456372143501682014-08-12T18:13:00.003-07:002014-08-12T18:25:58.339-07:00ImperatorAfter 2.5 years it should be apparent already, but for the formal record: Praetor will never be finished. For all the fans who are reading this and are dismayed, please believe me when I say that this pains me <em>far more</em> than it does you. My wife will attest that I <em>hate</em> leaving anything unfinished, much less something that I invested so much time in.<br />
<br />
The death blow was a conjunction of three unthinkables:<br />
<ul>
<li><strong>My source code repository died - </strong>The hard drive failure that took out my repository didn't worry me at first, since I had an active working copy of all the source code. But when I had replaced the repository's drive and went to rebuild the repository from the active content, the active stuff was gone--and I don't know why.</li>
</ul>
<br />
<ul>
<li><strong>My backups died too - </strong>Here's the unthinkable part: being a veteran programmer, I make backups religiously--in fact, in addition to my primary and repository sites, I have a dedicated RAID-based NAS device to keep backups around. So when my first two sites died, I shrugged and started recovery from my most recent backup on the NAS--not too bad, just a month or so out of date. Except that while it was restoring, the NAS died too--and instead of its RAID masking the drive failure, it panicked. I was never able to get the source off--and had to resort to my fourth, last-ditch backup, a thumb drive on my keychain: this has all the Earth, Water and Air levels but none of the new stuff I had written for Fire at all. But worst was:</li>
</ul>
<br />
<ul>
<li><strong>Microsoft killed support for XNA on Windows Phone - </strong>XNA is the graphics toolkit that Microsoft encouraged us all to use in writing games for Xbox, Windows Desktop and Windows Phone. They still in fact tell you to use XNA for the first two, but no longer support it at all on the phone. Which means I can't even recompile the old out-of-date Praetor source code that I managed to recover, much less add new stuff.</li>
</ul>
So, to move on! I've thrown out the NAS box and replaced it with an entirely new brand, I've rebuilt my desktop machine, and I've invested in a bunch of next-generation development tools including <a href="http://unity3d.com/">Unity</a>. I've planned and schemed, I've contracted an honest-to-god <em>fantasy author</em> to do the plotting and script writing, and I've got a screenshot or two to throw out there to whet your palate. Yes, there's going to be a sequel--and it's going to be <em>awesome.</em><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-EF16FQ6jsPs/U-q7mgfu9nI/AAAAAAAAAgU/P3vLWpR2b4U/s1600/Screenshot-2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/-EF16FQ6jsPs/U-q7mgfu9nI/AAAAAAAAAgU/P3vLWpR2b4U/s1600/Screenshot-2.jpg" height="360" width="640" /></a></div>
Richardhttp://www.blogger.com/profile/00190211511966499616noreply@blogger.com9tag:blogger.com,1999:blog-7406994635900175528.post-458075139862498502012-01-09T22:29:00.000-08:002012-01-09T22:29:05.648-08:00Third Praetor Campaign FinishedThe last six months have been just awful. This blog is all about Game Development 101, though, and I guess that's part of the deal: that being able to design and implement a game isn't enough. You need a lot of drive to get the projects done, even in the face of some truly terrible resistance.<br />
<br />
In my case, my mother just passed away following an unexpected stroke and diagnosis of metastatic cancer. I've spent a lot of time travelling to visit and a lot of time worrying about her; my free time has gone to make up for the office time that I've lost, which means I've barely been able to work on Praetor at all. I apologize to all the people who have bought and enjoyed the game and have been waiting for the next campaign.<br />
<br />
Like many people though, I find some degree of solace in work: it's sometimes easiest to bury your head in a project until life feels bearable again. So over the last month or so I've managed to burn through the remainder of the 25 battles that make up the third Praetor campaign--and tonight I finished the last one. Done and done, as my mother used to say while brushing her hands together.<br />
<br />
I need to do some final testing and tuning on this release prior to submitting it, but that step should only be days away now. I've play-tested every level individually and need only to spot-check to make sure I haven't broken anything as I pushed forward, plus a little testing around the transitions to make sure upgrades go smoothly.<br />
<br />
This third release includes the aforementioned 25 new bad guys to fight--actually it's 25 battles, but something like 35 different bad guys and another dozen magic enchantments that they bring to the party. In compensation you gain access to another dozen good guys and a dozen new magics, plus you get stronger and healthier and gain a number of other new abilities. The story line also moves forward, introducing a new ally (Kaitronius) who will play a big part in the fourth-and-final campaign. Finally, I took the opportunity to sharpen the graphics a little bit: I recolored the water on the main screen, reworked the world map a good bit to reduce the noise introduced in ocean areas and recolored certain territories to match the campaign story. And I put a new icon on it, because that's fun. I also fixed a ton of bugs, including adding some very substantial safeguards to prevent losing saved-game files; I'll talk about those changes in a later post, because they represent relevant Game Development 101 content.<br />
<br />
From a game sales perspective, Praetor continues to provide a slow but steady income: it's enough to cover my expenses for the hobby--including the dedicated server for the Random Software web site, which is non-trivial, and periodic upgrades in cell phone hardware for testing. Looking back, though, the free version of Praetor was a mistake: it significantly siphoned off downloads of the for-pay version, and yet it never generated much in the way of ad revenue--maybe a dollar or two a day on average. Peanuts. I've withdrawn Praetor Free from distribution in the US, but have left it available in other countries (I've had people write to thank me for making it available in places where Zune doesn't accept purchases). And I won't be updating Praetor Free to contain this new third campaign; if people want to play the full game, they can damn well shell out a few bucks. It has only cost me two years of effort to write this thing after all.Richardhttp://www.blogger.com/profile/00190211511966499616noreply@blogger.com0tag:blogger.com,1999:blog-7406994635900175528.post-32286299006574506562011-08-15T21:58:00.000-07:002011-08-15T21:58:06.103-07:00Third Praetor Campaign Progress<a href="http://3.bp.blogspot.com/-wtArLcINhrc/Tkn2G9psBQI/AAAAAAAAAEA/FminOueM4h4/s1600/Image1.png" imageanchor="1"><img align="right" border="10" height="320" src="http://3.bp.blogspot.com/-wtArLcINhrc/Tkn2G9psBQI/AAAAAAAAAEA/FminOueM4h4/s320/Image1.png" width="192" /></a> This has been a busy time for me--lots of travel, lots of activity at the office, a family member very ill--so it's been hard to find a few moments to work on Praetor. But I'm continuing to make progress anyway, as much for my sanity as for any desperate desire to actually finish.<br />
<br />
Importantly, after writing 57 of the 100 distinct battles in the game, I've finally added support for walled encampments. The picture to the right is a live screenshot, as opposed to the mockup I posted last time. And walled areas like this--I'm calling them <i>palisades</i> internally--are extremely cool in the game.<br />
<br />
First, the ownership of a palisade automatically shifts based on who's inside it. The one in the picture is red-tinged because my opponent owns it; if I manage to get someone inside, that tinge will go away to show it's open, and if I'm the only one inside it will turn blue.<br />
<br />
Palisade ownership is important because those walls are normally impenetrable: nothing's allowed to go through them (though flying creatures can go over, and so can projectiles). But if you're standing next to a wall you <i>can</i> step through it if the stuff on the other side isn't owned by your enemy--so if you're inside your own palisade you can send out sorties, and your men can even step back inside to safety where the enemy can't follow.<br />
<br />
Better, catapults tear down palisade walls: in this picture you can see a catapult has already put a hole in the walls up north. Creatures can walk right through there and suddenly the encampment is overrun: the red tint goes away because it's contested territory, and now everyone can sneak through the walls.<br />
<br />
I'm still tuning this particular battle and I haven't written the code for the victory piece yet, but it's good progress. 57 battles done; when I get to 75 I can release this stage, and 100 is the whole game. <i>If</i> the sales remain (comparably) strong I may actually make it there. Praetor is slowly dropping in the Top Downloads list, though Praetor Free is climbing--and they're both ranked very highly. Ad revenue looks pretty poor--something like $90 last month--but I'm still experimenting with ad mixes to try to improve that. It's too early to tell if the price increase on Praetor has had a net positive or negative effect.<br />
<br />
I'm a little frustrated with not having finished Praetor, partially because I've got some great ideas for the next game to write--including some ideas put together by my kids--and I want to get started on those. But first things first: there are a lot of people who have paid for this game, and for their sake--and my own--I feel like I should keep pushing this one until it's done.Richardhttp://www.blogger.com/profile/00190211511966499616noreply@blogger.com3tag:blogger.com,1999:blog-7406994635900175528.post-54255444737500045772011-07-23T15:43:00.000-07:002011-07-23T16:00:27.728-07:00Third Praetor Campaign Underway<a href="http://2.bp.blogspot.com/-Z59l8GlmYZY/TitP2gnywmI/AAAAAAAAADc/ZW0sHAhm0VY/s1600/FakeScreenshot.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 120px; height: 200px;" src="http://2.bp.blogspot.com/-Z59l8GlmYZY/TitP2gnywmI/AAAAAAAAADc/ZW0sHAhm0VY/s200/FakeScreenshot.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5632683556845306466" /></a><br />I've been seeing a lot of crashes reported by Praetor users, and the new WP7 developer "App Hub" reports statistics that corroborate: both the for-pay Praetor and the new ad-supported Praetor Free have been crashing far too often.<div><br /></div><div>To fix this, over the last few weeks I've been concentrating on finding and fixing crashes and adding defensive code to make any as-yet-undiscovered bugs less visible in the field. For example, one of the computer opponent's current symptoms is that sometimes--maybe once every fifty battles or so--it will run forever trying to decide on its next move. I've found and fixed lots of causes of this, but there might be more causes--so I've taught the for-release builds to just give up looking for new options after a certain amount of effort, such that the computer opponent might play stupid but at least won't crash and bring the game down. Invariably that kind of defensive code is disabled in my debug builds, so that I'll still see the bad behaviors in house and will have a chance to fix them.</div><div><br /></div><div>The newly stabilized Praetor 2.4 is in the release process, awaiting Microsoft's say-so to release. With any luck this will be the last substantial update I'll need to make until it's time to release the next campaign as Praetor 3.0.</div><div><br /></div><div>With every campaign I'm adding 25 new battles, including 25-35 new bad guys and 20-25 new good guys to join your army. I'm also trying to add new features to the base game, however simple--for instance with the Water campaign I added the new Swamp tiles, which have an unusual effect on your movement across the land and can inflict a nasty Swamp Rot on your creatures. The Water campaign also added the idea of Allies--named warriors that join you on the battlefield as each fight begins.</div><div><br /></div><div>The screenshot in the upper-right is faked--it's just a mock-up that I'm using as I try to get the visuals right--but it shows two of the new things I'm adding for the Air campaign. In the lower left is a series of Desert tiles, which inflict Exhaustion much as Swamp tiles inflict Rot. As your creatures try to travel through the deep desert their movement speed slows and their movement cost increases, and the longer they stay in the desert the more strength they lose. That strength recovers slowly once you leave the desert--unlike Rot, Exhaustion isn't fatal--until you're back to full strength. The result should be that crossing a desert will be a lengthy, wearying process--just as it should be.</div><div><br /></div><div>More interesting is the red field in the upper right. Yes, Praetor is going to gain walls now: with the Air campaign you'll actually be tackling multiple cities and other fortifications, and you'll need to bring your catapults and siege engines to break down those walls. Oh, it's going to be simply tremendous.</div><div><br /></div><div>I wrote the first 50 battles (all I've published so far) one at a time, kind of choosing where the plot would go with each battle as I wrote it. For the Air campaign, since I've been writing code only to fix bugs in the current release, I've spent time designing the new campaign instead of just immediately writing it. I've now got all 25 battles figured out ahead of time: all the bad guys, all their skills and strengths, all the things you gain and all the little plot twisties are already plotted out. That should make actual construction of the levels a lot easier to accomplish, since that creative part is the stuff I find hardest to accomplish--and now it's out of the way, leaving me able to concentrate on the easy part (the coding).</div><div><br /></div><div>Oh, one more spoiler: in the Air campaign you'll be picking up a new ally: Kaitronius, a cousin of your second-in-command Tallius. Kaitronius will be with you for the rest of the game, and eventually the land in which you're fighting will be named for him ("Kaitron") when he is martyred near the end of the Fire campaign. That's all paving the road for the follow-up game "Lords of Kaitron," which I'm busily plotting out.</div>Richardhttp://www.blogger.com/profile/00190211511966499616noreply@blogger.com0tag:blogger.com,1999:blog-7406994635900175528.post-79771588155516542242011-06-22T19:53:00.000-07:002011-06-22T20:09:58.256-07:00<a href="http://3.bp.blogspot.com/-dv2bgcz66MI/TgKq8H8ap3I/AAAAAAAAACs/Mw_OHw8aKoY/s1600/Screenshot%2B7.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 120px; height: 200px;" src="http://3.bp.blogspot.com/-dv2bgcz66MI/TgKq8H8ap3I/AAAAAAAAACs/Mw_OHw8aKoY/s200/Screenshot%2B7.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5621243234813126514" /></a>It's been about three months since I posted here. See, Praetor was just a huge undertaking and it left me kind of exhausted--so I took about a month off from doing anything other than the most essential bugfixing for my games, and concentrated on other stuff. Got my third-degree black belt. Turned 40. That kind of stuff.<div><br /><div>And since it's been a full quarter since Praetor hit the markets, I bet you're all just dying to know how well it's selling. Well, I've got good news and bad there.</div></div><div><br /></div><div>First, Praetor has unquestionably been a hit. It's in the phone's Top Downloads list just half a dozen flicks of the finger down from the top, far above many games--including some Xbox Live games--that I would've considered top notch. It has amassed over 100 reviews, almost all 4 or 5 stars (average is rounded to .5's, and stands at 4.5) and almost all using words like "incredible" and "amazing." I confess that I'm a little addicted to checking for new reviews a couple of times a day, just for the minor ego boost.</div><div><br /></div><div>So subjectively, the game is doing well in the marketplace. Here's a more objective set of metrics: to date Praetor has racked up 1150 sales out of approximately 6000 downloads. That's a conversion rate of nearly 20%--extremely solid, especially considering that the app currently on the market doesn't even have an in-game link to make purchasing easy.</div><div><br /></div><div>But in absolute numbers, 1150 sales isn't very much--not for a game that's doing so well by all the other metrics. Praetor sells at 99 cents, and I get 70% of that as gross income--so I'm making 70 cents per sale, which means to date Praetor has turned in about $800. Subtract the several hundred that I invested in outsourcing for music and graphics, and the yearly fee for being in the WP7 marketplace at all, and I'd be lucky to have netted half that. Subtract another 30% for taxes, and the 10% that I'm paying my son (who helped me come up with content for the game) and I'm left with about enough to support my Starbucks habit. Year of work == Starbucks habit. Yikes.</div><div><br /></div><div>So I'm going to try something I never thought I would try: I'm going to release a second version of Praetor, this one free and displaying ads. Word on the developers' forums is that ad-supported apps are generating far more revenue than their paid equivalents, and it was the work of only one night to add the necessary code. Will give it a shot and see what happens.</div><div><br /></div><div>In the mean time, after my brief "break" I've picked up working on the second episode of Praetor. Actually I just finished coding and testing battle number 47; when I finish number 50 I'll give it a little more testing and release version 2.0 to the world. I've also decided to increase the price to $1.99 for the non-ad-supported version; after all, there's twice the content now, so why not twice the price? If it drives more people to the ad version, well, so be it; I'll get paid there too.</div><div><br /></div><div>I hope, anyway.</div>Richardhttp://www.blogger.com/profile/00190211511966499616noreply@blogger.com4tag:blogger.com,1999:blog-7406994635900175528.post-12398412187519053222011-03-27T15:59:00.001-07:002011-03-27T16:04:57.262-07:00And it's away!I've just submitted Praetor to the Zune marketplace for inclusion in the WP7 app catalog. It will take several days at least before I know whether they're willing to include it as-is or require changes first.<div><br /></div><div>It's been almost exactly one full year since I started development, and this is unquestionably the biggest game I've tried to produce under my one-man "Random Software" hobby label. The final package, fully compressed and encoded for release on a cell phone, is 24MB; anything beyond 10MB is considered sufficiently big that you need to connect your phone to a computer to download it, so this lands squarely in the Epic category as far as cell phone games are concerned.</div><div><br /></div><div>I'm releasing Praetor exactly as my wife wisely suggested: rather than finishing the full hundred battles immediately, I've done a solid 25--including the first mini-boss and completing the entire Earth Magic saga. If this Episode 1 proves popular enough to justify the extra effort, I'll push ahead with Episode 2 where we wander into the lands where Water Magic prevails--and then on to Air and Fire if my enthusiasm stays strong.</div><div><br /></div><div>So, congratulations to me! All three readers of my blog can rejoice. With projects that take a year to complete, it's pretty rare to get one to this stage of completion--and that feels pretty good. I'll post again if/when it finally shows up in the Zune marketplace.</div>Richardhttp://www.blogger.com/profile/00190211511966499616noreply@blogger.com9tag:blogger.com,1999:blog-7406994635900175528.post-47946270568166356982011-02-03T19:11:00.000-08:002011-02-03T19:19:16.542-08:00Praetor Progress<a href="http://randomsoftware.com/apps/praetor/card.png"><img src="http://randomsoftware.com/apps/praetor/cardsmall.png" align="right" /></a><br />When we last left our hero--on Christmas day 2010--he reported in with 4 Praetor battles completed and good hopes for the future. Today, about 5.5 weeks later, the total stands at 23 completed battles and the game is looking <i>great</i>.<br /><br />My wife is pushing me to declare victory at 50 levels, composing the game for a decent storyline completion halfway to my original goal and releasing it to the general public at that point with an upgrade (or "expansion pack" as she calls it) to follow down the road. And I have to admit I'm starting to like the idea; Praetor is turning out to be a lot of fun, and I'd like to see if it can actually build a following or not before I plow N more months of effort into it. At expert difficulty each battle still takes me 5 to 10 minutes, so 50 levels is between 4 and 8 hours of game play--perfectly fine for a 99-cent cell phone game.<br /><br />I've also started adding more material to the web site--a couple of new screenshots and the beginnings of a <a href="http://randomsoftware.com/apps/praetor/guide.html">strategy guide</a> to help you get through the levels. Some of them are pretty tough, and reading through the guide you can see how your tactics have to shift as the opponents get stronger and you get new pieces to work with.Richardhttp://www.blogger.com/profile/00190211511966499616noreply@blogger.com0tag:blogger.com,1999:blog-7406994635900175528.post-29781174670881942602011-01-03T09:54:00.001-08:002011-01-03T09:56:38.502-08:00Robots.Not really gaming related, but it's taken up some of my free time lately so I wanted to share my latest toy.<div><br /></div><div><br /><a href="http://www.randomly.com/richard/robot/31-%20MarkTwo%20Improved%20Line%20Following.mp4"><img src="http://www.randomly.com/richard/robot/31.png" /></a><br /></div><br />Several other amateur-robotics photos and videos are collected in that same path, available for browsing on <a href=http://www.randomly.com/richard/robot>http://www.randomly.com/richard/robot</a>.Richardhttp://www.blogger.com/profile/00190211511966499616noreply@blogger.com0tag:blogger.com,1999:blog-7406994635900175528.post-11138152597179520892010-12-25T17:44:00.001-08:002010-12-25T17:52:29.445-08:00Praetor: Not Dead!<div>It's been a few months since I posted here--a gap that started, appropriately, just after I declared Praetor past the hard bits. Heh.</div><div><br /></div><div> </div><div>The delay has been caused by a new project starting at the office, which has consumed all my free time. The office is shutting down (as in, fully powered off while they swap power transformers or something) for a whole week during the holidays, though, so I can't make any progress on my Official Work and have plenty of time to play with Praetor again.</div><div><br /></div><div> </div><div>A few months ago I hired an artist to provide the big map, a 4-megapixel image that the game will reveal progressively as you work your way through the campaign. He delivered that in October, and it's <em>perfect</em>. A lesson from this: invest a little and farm out the things you can't do well to someone who can. If<i> I'd</i> done that map it would've looked awful; instead, this key piece looks like something out of the Lord of the Rings and it adds credibility to the whole project. Here's a small piece from it to give you an idea:</div><div><br /></div><div> <a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.randomly.com/richard/misc/PraetorMapSample.png"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 200px; height: 200px;" src="http://www.randomly.com/richard/misc/PraetorMapSample.png" border="0" alt="" /></a><br /></div><div> </div><div>In addition to incorporating this gem, over the last few days I've made a lot of little changes: polishing up the tutorial, fixing bugs, rounding off the UI (adding an options dialog, delete-game popup and so on) and even adding some new content.</div><div><br /></div><div>I've also made the executive decision that this first release will provide the campaign game only: no two-person online play yet. That's an unpleasant step back but it's very freeing; there was a good month of work needed to allow two-player games, and I don't want to waste that time. Now I can focus on the campaign, which is really the essential one-player RPG part anyway.</div><div><br /></div><div>The role playing campaign takes place over 100 battles that occur as you work your way through the world map. Last week I had one test battle available; now I've thrown that test code away and have 4 finished battles instead--each with its own enemy, sound effects, game strategy and incorporation into the campaign narrative. In other words, the game is now 4% complete. Experience says it takes about two hours to add each battle at this point, which means I'm about 192 working hours from finishing the app.</div><div><br /></div><div>That sounds like a lot, but in truth it's pretty exciting. Just as I predicted last time, I'm now seeing Praetor marching forwards: every few hours I extend the campaign a little further, and I'm already seeing my character increase in strength and gain new playing pieces as he racks up victories. And best of all, the freaking game is <i>fun</i>--I'm really enjoying the test play, and am still learning new ways to use the pieces I have.</div><div><br /></div><div>This thing's going to be a winner, and I'm all excited about it. :)</div>Richardhttp://www.blogger.com/profile/00190211511966499616noreply@blogger.com0tag:blogger.com,1999:blog-7406994635900175528.post-73428585253877372942010-09-04T19:59:00.000-07:002010-09-04T20:34:54.910-07:00Progress? Yes, that would be lovely. Thanks.<table><tbody><tr valign="top"><td valign="top" width="100%"><p>I think Praetor has finally gotten past the Hard Part.</p><p>Every project reaches a point where multiple subcomponents have become functional--maybe not finished, but at least functional--and it's time to integrate them. That's when the real hairball begins. Integrating the audio, the rendering engine, animation sequencing, the storage subsystem and so on turns the complexity knob up to eleven. If the subsystems aren't individually stable or if their interfaces were designed poorly then the whole thing usually cracks and the project ends. On the other hand, if it hangs together, the the rest of the project gets easier and easier.</p><p>Being such a large project (okay, large for a one-man outfit anyway), Praetor has had an unusually long period of integration. Fortunately, though a number of minor problems have turned up from time to time, its separate subsystems have held up very well indeed and I believe the worst of the work is over.</p><p>At this point one can start a new Campaign, read through some filler RPG elements, mess with the world map, challenge enemies and actually play a full battle against the enemy. If the player loses there's more RPG elements and the player gets to retry; after a victory the world map expands and new options appear. The computer AI--rewritten three times--plays a tough game and moves quickly. Changes in the game are saved persistently, and one can pop in and out of the game without any ill effects--perfect for handling inbound phone calls for example. In other words, it's acting like the real, final game should.</p><p>But having passed the tough part doesn't mean it's anywhere near halfway done.</p><p>This project is unusal for me in many ways, not the least of which is that it involves a lot of <em>content</em>. Most games I produce rely on either fixed or random initial conditions; they don't have narrative, they don't require a series of fifty different playing boards or anything. I pick projects that are simple like that because I don't have time (or adequate creativity) to fill in all those details.</p><p>Praetor, though, needs a lot of content. The campaign alone involves a hundred different battles, each with its own playing field and custom opponent, and most of them use new types of cards. There are narrative elements throughout the campaign, and unique graphics and sounds for all this stuff. And I only have a small fraction of that finished: one territory's battlefield, seven or eight different cards and "TODO: show something meaningful now" text appearing for the campaign RPG elements.</p><p>All that stuff is bulky, but none of it is particularly risky. So at the point the game looks like it will make it--it's just a matter of time.</p></td><td width="240"><p><img style="MARGIN: 0px 0px 10px 10px; WIDTH: 240px; FLOAT: right; HEIGHT: 400px; CURSOR: hand" border="0" alt="" src="http://www.randomly.com/richard/misc/pshot-11.png" /><br /><img style="MARGIN: 0px 0px 10px 10px; WIDTH: 240px; FLOAT: right; HEIGHT: 400px; CURSOR: hand" border="0" alt="" src="http://www.randomly.com/richard/misc/pshot-10.png" /> </p><p align="right">^^^ <br />Hey, look, new screenshots!</p></td></tr></tbody></table>Richardhttp://www.blogger.com/profile/00190211511966499616noreply@blogger.com0tag:blogger.com,1999:blog-7406994635900175528.post-5647726021240535002010-08-23T14:40:00.000-07:002010-08-23T15:39:48.238-07:00When AI is plenty A, but not so I<p align="left"><a href="http://en.wikipedia.org/wiki/Alpha-beta_pruning"><img style="MARGIN: 0px 0px 10px 10px; WIDTH: 305px; FLOAT: right; HEIGHT: 187px; CURSOR: hand" border="0" src="http://www.cs.rice.edu/~mgricken/teaching/202/08-fall/lectures/games2/minmax.gif" /></a></p>Normally one of the parts I like best about writing a strategy game is implementing the computer opponent. Trying to find a balance between heuristics and raw CPU horsepower is almost as much fun as playing an AI-enabled game and <em>losing to it</em> for the first time.<br /><br />In Praetor, though, the AI is a pain in the ass. The problem is that each player has way too many options.<br /><br />Consider chess: on the opening move you have 20 different moves from which to choose. A computer player could pick the best first move by simulating the board after each one of those 20 moves, and deciding which of the resulting boards looks the best. Not so bad, right? Just 20 moves to consider--can't take too long. That's called a "1-ply" search.<br /><br />But regardless of the computer player does first, the second player then gets a turn--and he likewise has 20 moves to pick from. If the computer player wants to consider his opponent's responses, then for each simulated move it makes it needs to consider each possible response by the opponent. That would be a "2-ply" search, and it means the computer would be setting up and studying a total of 400 boards to decide which first move is probably best. As the game progresses the number of options each player has will increase a little because the board opens up, but then it also starts decreasing again as pieces come off the board. If we average those effects and assume that each player always has roughly 20 moves to choose from, then a 3-ply search would require the computer to consider 8,000 boards, and a 4-ply search would involve considering 160,000.<br /><br />In Praetor, an average piece has about 18 squares to which it can move--maybe limited to 12 in a typical case because of terrain or other pieces being in the way. The player can play cards from his hand, and most cards either let you pick a target piece or square to manipulate. Some pieces have special abilities they can invoke, and others will happen to be within range to attack enemies. And here's the real pinch: most actions a player takes use up some <em>energy</em>, and a player's turn continues until he runs out of it. So instead of just picking which single piece to move or card to play, a player needs to pick what order to do those things in <em>for each turn</em>. Is it better to move then play this card, or play this card then move?<br /><br />All those options mean that, just a few turns into the game, a player typically has <em>millions</em> of possible ways to play on each turn. Which means that even a simplistic 1-ply brute force search is out of the question (remember, the first release vehicle is a cell phone: not much CPU to spare). So what to do?<br /><br />Heuristics to the rescue. A modern chess AI for your desktop will easily walk 8- or 9-ply deep--that would be 512 <em>billion </em>chess boards if it were walking that tree brute-force (e.g., considering every option). There's no way that's going to happen, which means chess AIs also rely on heuristics to prune that vast tree of options.<br /><br />The goal of heuristics is always the same: to quickly identify probably-pointless moves and discard them, so you can reduce the number of choices that you have consider at each stage. With Praetor, since the game tree is so wide, I need to rely on heuristics that prune pretty heavily in order to get good moves in any kind of reasonable amount of time.<br /><br />The first heuristic I've chosen is the most drastic: instead of considering in depth the result of moving every piece to every square, I'm going to have the computer quickly consider each square and pick exactly one to consider in depth. That immediately reduces the millions-of-options-per-turn to just hundreds-of-options-per-turn. I also plan to heuristically restrict where particular cards can be played: no point in sending a fireball <em>there</em> since it wouldn't hurt any opposing pieces, nor <em>there</em> since it would hurt mine. Sometimes sacrificing a piece would let the AI win the game six moves later on, but most of the time it's dumb so I won't even let it look.Richardhttp://www.blogger.com/profile/00190211511966499616noreply@blogger.com0tag:blogger.com,1999:blog-7406994635900175528.post-74815338686891494172010-08-16T12:20:00.000-07:002010-08-16T12:24:21.540-07:00Praetor in Pictures<a href="http://www.randomly.com/richard/misc/pshot.html"><img style="MARGIN: 0px 0px 10px 10px; WIDTH: 240px; FLOAT: right; HEIGHT: 400px; CURSOR: hand" border="0" alt="" src="http://www.randomly.com/richard/misc/pshot-7.png" /></a><br /><div></div><br /><div>They say a picture is worth a thousand words; I hope so, because I'm many thousands of words behind in posting to this blog and yet I have a lot of pictures to show.</div><div> </div><div>(Click the picture--or <a href="http://www.randomly.com/richard/misc/pshot.html">right here</a>--to see a lot more stuff.)</div><br /><div></div><br /><div>As my family will tell you, I'm still working full speed on Praetor as I try to get it ready for an early launch with the Windows Phone 7 devices that are coming out later this fall. This is such an ambitious project that I don't think a 2010 launch of the game is realistic, but I'd like to have it substantially complete by the end of the year anyway.</div><div> </div><div>I've got a lot to post about move sequencing, network gameplay and computer AI--just too busy coding to explain what I'm doing. So hang in there, more posts are forthcoming as things slow down.</div>Richardhttp://www.blogger.com/profile/00190211511966499616noreply@blogger.com0tag:blogger.com,1999:blog-7406994635900175528.post-86138213436319778862010-07-27T10:32:00.000-07:002010-07-27T10:33:46.548-07:00<a href="http://www.randomly.com/richard/misc/multitouch.jpg"><img style="MARGIN: 0px 0px 10px 10px; WIDTH: 264px; FLOAT: right; HEIGHT: 196px; CURSOR: hand" border="0" alt="" src="http://www.randomly.com/richard/misc/multitouch.jpg" /></a><br /><div>I stayed up late last night to finish writing a bit of multitouch code--actually the first time I've ever needed to do so (write multitouch support, that is, not stay up late). I was surprised at the amount of math involved to get the behavior that I wanted.<br /><br />Still working on my new project Praetor, which among other things presents a fairly large world map at one point. I wanted that map to be able to pan and zoom with the same smooth behavior as Google Maps. If you've ever tried the Maps applet on the iPhone you know what I mean: it's surprisingly intuitive to drag the map around, pinch to zoom out and reverse-pinch to zoom in. And although I've observed the mechanics of the display matching itself to my motions frequently, I'd stopped at the reverse-engineer stage and hadn't really thought about implementing my own subset.<br /><br />I started with a world map--just a big image (say, 2000 pixels on each side), far larger than the tiny screen of this phone (480x800) can show at once. To allow zooming in and out I had to allow for a scaling factor: the on-screen size of the image would be (worldmapsize / scale), so if scale==1 then I'd show a small portion of the map life-size and if scale==2 then I'd show a lot more of the map but shrunken down by 50%. And since I can't fit the whole map on the screen at once (except when scale is very large, zooming way away from the image), I have to account for panning too: what virtual pixel sits right underneath the center of the physical screen?<br /><br />Anyway, I'll skip a lot of the trial and error in order to summarize the approach that finally worked out. When my app first notices there are two fingers on the display, it remembers how far apart they are and it averages their locations to identify the spot right in the middle--noticing primarily not the actual coordinates of the pixel on the screen, but more importantly which point in the virtual world map is currently being drawn there.<br /><br />Thereafter when the fingers move--one or both, doesn't matter--I calculate a new distance-between value and a new center-point (this time worrying about both screen-space and world-map space). The change in distance-between-fingers represents a change in scale, and it turns out that the new scale should be equal to (old scale) * (old distance) / (new distance). From that simple formula it's clear that if you spread your fingers apart, the scale is going to decrease--moving from a high value towards 1, meaning that the pixels on screen are getting bigger. And the reverse for zooming out.<br /><br />It's important to be precise about just how much the scale changes when you move your fingers, because ideally the behavior of the map is likewise very precise. Put two fingers on a map of the US--one finger in NYC and another in LA, and pinch. When you look again, your fingers should still be on those cities--which means you need to have calculated exactly the right scale and moved the map exactly with the fingers.<br /><br />Right, so there was scale: just look at the distance between the fingers. To make the pan aspect work too, I concentrated on the center point, remembering that initial virtual pixel that was visible in the center when the fingers first touched down, and panning the display until that same virtual pixel is once again directly between the two fingers wherever they go. And poof: instant Google Maps behavior.<br /><br />The last polishing touch was to allow the map to actually leave the legal bounds of the screen. This is something that Apple introduced in its iPhone and is really pleasing to the eye. In Windows, a scrollbar is a hard stop: if you try to page-up when you're at the top of the page, nothing happens. On an iPhone, if you're at the top of the page and try to drag downwards with your finger, the page will actually follow you (technically it does so at half speed from your finger, but that's a minor point). When you release your finger, the page will snap back to its legal setting--right at the top of the screen.<br /><br />There are two reasons this works well from a UI standpoint. The first is that there's an immediate, direct visual response to any input you give: there's no concept of "that motion is illegal so I'll ignore you," which is otherwise very frustrating. The second is that the user gets used to being able to peek around the sides of an object to see if there's anything else--and that behavior makes the device's virtual space feel larger than it really is, which is freeing and pleasant. All good stuff.<br /><br />Fortunately, it's also really easy to implement--you just have to relax your constraints a little bit, and recognize that it's just not that awful to draw this rectangular image such that it's halfway off the screen. Once the fingers stop dragging, on every frame you move the image 1/Nth of the way back to where it was (newPos = oldPos + (correctPos - oldPos) / N), and over the next few animation frames the display will "snap" back to where it belongs. </div>Richardhttp://www.blogger.com/profile/00190211511966499616noreply@blogger.com0tag:blogger.com,1999:blog-7406994635900175528.post-4029611396403241022010-07-20T07:41:00.000-07:002010-07-20T08:11:34.760-07:00Working from Mock-UpsThe DVD for <a href="http://www.imdb.com/title/tt0120794/">Prince of Egypt</a> has a making-of track, which for one reason or another I ended up watching some years ago. And in there, one of the talking heads described that one of the first things they produced for the movie--even before any substantial animation was done--was the title track's music. (Remember that theme, the one that plays while we're watching the slaves being beaten?) The talking head said that having that song supplied a tone for the whole rest of the work.<br /><br />For me, I've found that I can establish the tone of a work best by throwing together screen mockups in Paint Shop Pro. In the early days of a project I'll spend more time in PSP than I will writing code, as I try to get the look of the game right. Mechanically screen mockups are also useful--for example, to ensure that my hexagonal tiles will actually tile together properly to form a solid board with no gaps, or that my cloud layer isn't so thick that it obscures the game, and so on.<br /><br />I was going to start Praetor by jumping right into the thick of the battle and putting that engine together, but every time I started down that track I found there were too many parts that had to be done first. So I backed up and started with--of course--the main menu.<br /><br /><div align="center"><br /><a href="http://www.randomly.com/richard/misc/p-menu-mockup.png"><img style="WIDTH: 240px; HEIGHT: 400px" border="0" src="http://www.randomly.com/richard/misc/p-menu-mockup.png" /></a> <a href="http://www.randomly.com/richard/misc/p-menu-live.png"><img style="WIDTH: 240px; HEIGHT: 400px" border="0" src="http://www.randomly.com/richard/misc/p-menu-live.png" /></a><br /></div><br /><br />The left-hand screenshot is the PSP mockup I put together, and the right-hand shot is live from the emulator. I've darkened the background a bit from the mockup to help the buttons stand out, but when I see how the game looks on the <a href="http://www.engadget.com/2010/04/21/dell-lightning-the-ultimate-windows-phone-7-device-leaks-out/">actual hardware</a> I'll have to retune it.<br /><br />If all goes well you'll be able to play Praetor three ways: playing the campaign (which consists of roughly 100 battles against the computer, with some RPG elements thrown in), playing an isolated battle against a local computer or networked human, and playing an isolated battle as a correspondence game over the net. It's that last aspect that led to the main menu design: in theory you could have a dozen games going, each with a shot clock measured in hours or days. So the main menu evolved into just a list of games that you're playing, and it will show the status of each game (it's my turn, or it's not, or my opponent resigned, or I'm still looking for an opponent, or whatever).Richardhttp://www.blogger.com/profile/00190211511966499616noreply@blogger.com2tag:blogger.com,1999:blog-7406994635900175528.post-90541369245736824012010-07-12T22:04:00.000-07:002010-07-14T07:28:22.070-07:00Chess Club, FinishedMicrosoft finally (<em>finally</em>) dropped us a new SDK for writing Windows Phone 7 apps, and that let me throw together the last remaining bit for the Chess Club app: landscape support.<br /><br />Landscape's important not because it's particularly essential in practice--in point of fact I like holding the phone vertically for this one, not sideways--but because it lets you capture videos better for YouTube. To celebrate, I put together the third and final demo video for Chess Club--this time with an audio track too, since watching four minutes of chess with no one saying anything is the kind of thing only I can enjoy. :)<br /><br /><a href=http://www.youtube.com/watch?v=OBuq9Zaa3ng>http://www.youtube.com/watch?v=OBuq9Zaa3ng<br /></a><br /><br />Next up, revisiting Omega--this time with extra crunchy bits added. Yum.Richardhttp://www.blogger.com/profile/00190211511966499616noreply@blogger.com0tag:blogger.com,1999:blog-7406994635900175528.post-6542539707723659562010-07-02T21:00:00.000-07:002010-07-02T21:01:48.096-07:00Nearing CompletionMy Windows Phone 7 app, cleverly named Chess Club in an attempt to obfuscate what it really does, is nearing completion. I've thrown a four-minute video up on YouTube to show off what it can do. :)<br /><br /><a href=http://www.youtube.com/watch?v=AkeNHTXJ28g>http://www.youtube.com/watch?v=AkeNHTXJ28g</a>Richardhttp://www.blogger.com/profile/00190211511966499616noreply@blogger.com0tag:blogger.com,1999:blog-7406994635900175528.post-13411772838091943822010-06-26T17:05:00.000-07:002010-06-26T17:07:44.004-07:00More Kaitron, More ChessWizards of Kaitron, now with more tiles! We've made three decks like this one, each with about 22 playing tiles.<br /><br /><img src=http://www.randomly.com/richard/misc/Kaitron2.jpg><br /><br />The unusual tile in the center is just a helper: it's to remind the player which kind of element beats which other kind of element.<br /><br />On the WP7 front, my Chess Club program is starting to look pretty sweet. I've finished the watch-others-play and watch-lectures sections, along with the solve-chess-puzzles for FICS (ICC support on the latter is forthcoming). That last part was tricky because I finally had to teach the thing to let users move the pieces, not just watch what's happening on the server. Still <i>lots</i> of UI work to do, but for sheer functionality the game is nearing completion.Richardhttp://www.blogger.com/profile/00190211511966499616noreply@blogger.com3tag:blogger.com,1999:blog-7406994635900175528.post-31238608887261947372010-06-24T16:36:00.000-07:002010-06-24T16:57:10.590-07:00WP7: Word Wrapping in XNA, Made Easy<a href="http://www.randomly.com/richard/misc/ccscreen-1.png"><img style="MARGIN: 0px 0px 10px 10px; WIDTH: 275px; FLOAT: right; HEIGHT: 460px; CURSOR: hand" border="0" alt="" src="http://www.randomly.com/richard/misc/ccscreen-1.png" /></a><br /><div>In Silverlight, formatting text is about the easiest task of all. Boldface? Different colors? HTML markups? Word wrapping? Bah--all these are trivial.<br /><br />In XNA, though, there are no primitives for any of these features. Instead there are exactly two tools at your disposal: SpriteFont.MeasureString() and SpriteBatch.DrawString(). Neither of these know anything about formatting at all--and they're certainly not going to accomplish any word-wrapping for you.</div><div></div><div>XNA isn't the only environment that lacks this basic text manipulation toolset. After running into this wall several times, I've eventually settled on an approach: a <em>CompiledText</em> class that turns a plain string into a formatted, word-wrapped, ready-to-draw array of individual text segments. Each segment lives on a single line and has the same formatting options--italicized, boldfaced, color blue, whatever.</div><div></div><div></div><div>One of the nice things about this approach is that you can do the hard work of constructing the CompiledText object infrequently--only when the text to be displayed changes--and in your calculation time rather than while you're doing the actual frame rendering. Once you've built the object, actually rendering the formatted text is accomplished by a very tight loop that just iteratively makes SpriteBatch.DrawString() calls--minimizing CPU cost while drawing a frame.</div><div></div><div></div><p><div>The <a href="http://www.randomly.com/richard/misc/CompiledText.cs">CompiledText class</a> I've uploaded needs a second file to run: <a href="http://www.randomly.com/richard/misc/AnimationUtils.cs">AnimationUtils.cs</a>, which exports a SqueezeText method. This thing figures out exactly how much text you can fit onto a line, by calling the primitive SpriteFont.MeasureString() and running a binary search across the string. (For better performance, you might want to refactor this thing to only test at word-break boundaries; it's currently doing the measuring first, then finding word-break boundaries afterwards.)</div><p><div></div><div>By the way, those who take a look in AnimationUtils.cs will discover an HslColor class that allows you to convert an XNA color to hue/saturation/luminosity values, then change them and convert back to RGB. Great for fades and color-shifts and such. Also in there is a C# version of probably the oldest method I've ever written: a method for moving sprites from one square of a chess board to another with a nice pretty motion that speeds up at the start and slows down at the end.</div>Richardhttp://www.blogger.com/profile/00190211511966499616noreply@blogger.com0tag:blogger.com,1999:blog-7406994635900175528.post-73580532161044600022010-06-21T22:23:00.001-07:002010-06-21T22:35:26.931-07:00Resurrecting Chess Club<a href="http://www.randomly.com/richard/misc/ccdemo.wmv"><img style="MARGIN: 0px 0px 10px 10px; WIDTH: 186px; FLOAT: right; HEIGHT: 320px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5485464476135028370" border="0" alt="" src="http://4.bp.blogspot.com/_4FoIhzYKwj4/TCBI4LgNdpI/AAAAAAAAABs/anHJlfo9594/s320/cclub.png" /></a>A long, long time ago I wrote a program called Icarus. It was a chess game, but it didn't know how to play. Instead, it was client software for interacting with the <a href="http://chessclub.com/">Internet Chess Club</a>. You'd fire this thing up, and next thing you knew you'd be playing chess against someone else over the intertubez.<br /><br />Fast-forward about ten years and Icarus had long since been sold to ICC for parts, and I didn't really care since the world had moved to mobile phones anyway. And there was this nice company called Danger that sold a Hiptop cell phone (T-mobile's Sidekick), and I could write programs for it. And naturally I wrote yet another client to talk with ICC--this time from your mobile phone. It was actually a pretty slick piece of technology and a well done little game. But Danger refused to sell it, for reasons they never really explained well.<br /><br />(Every time you read in the news about how developers are all up in arms about Apple being too opaque or restrictive about their App Catalog, I laugh. Heartily. Danger was so <em>insanely</em> protective of their app catalog--which pre-existed the iPhone by years, mind you--that they made Apple look like a porn starlet eager for her first Big Flick.)<br /><br />Anyway, fast forward a few more years, and Microsoft is just a few months from entering the smartphone market itself. And here I am, once again writing a chess client for a mobile phone. But <i>(insert Monty Python swamp-routine accent here)</i> <b>this time, it will stay up</b>.<br /><br />For all that internet chess is an old story, I'm actually doing something kind of novel here. Microsoft, in its wisdom, has decided not to provide a <a href="http://en.wikipedia.com/wiki/Internet_socket">sockets API</a> with their phone--and that means there will be just about zero online games happening in the first release. Well, one: mine. Because I'm damned well connecting to the chess servers anyway, even without sockets. Woot. I'll post about how that's working after I've had a nap.Richardhttp://www.blogger.com/profile/00190211511966499616noreply@blogger.com2tag:blogger.com,1999:blog-7406994635900175528.post-24859368744552076452010-06-21T22:06:00.001-07:002010-06-21T22:17:54.432-07:00WP7: Primitive CoolImagine this: you've got a <a href="http://developer.windowsmobile.com">cool new mobile phone</a> coming to market, and you want to compete on the world stage against the iPhones and Androids of the day. What do you need?<br /><br />Slick multi-touch screen, check. Good MP3 experience, check. Um, telephone stuff I guess, check. Mmm... what about a gaming experience? Well, turns out it's Microsoft's turn to come out with a new phone, and since they've got this Xbox product line, they've got a bit of entertainment reputation to uphold. So, the new toy better have a heavy 3D processor or six built in. Check.<br /><br />Picking up with WP7 (that's "windows phone 7" for those who aren't yet <em>in the know</em>) development kit, the first confrontation I got was from the language: everything's written in "C#". Which <em>I do not know</em>. This is kind of embarrassing, since I (a) used to work for Microsoft, the company that eventually came up with C#; and since I (b) am used to knowing all about any programming language I need. Whoops.<br /><br />Fortunately, picking up C# was really just a day or two of effort (thanks in part to a C# pocket reference, which really summarized the language quite nicely). What proved harder was teaching the stupid phone to <em>draw a line</em>.<br /><br />No shit. There literally is <em>no</em> graphics primitive for drawing a freaking <em>line</em> on the freaking <em>screen</em>. So when the first trick I wanted to do was take an image and kind of draw it slanted in a 3D-like-way, I had to do some serious experimentation to even get the ball rolling.<br /><br />Which is the point of the post, dear reader. I submit to you now two blobs of C# source code:<br /><ul><li><a href="http://www.randomly.com/richard/misc/PrimitiveRect.cs">PrimitiveRect.cs</a> - a class that lets you easily draw lines and filled rectangles on the WP7 device; and<br /></li><li><a href="http://www.randomly.com/richard/misc/TexturedQuad.cs">TexturedQuad.cs</a> - a more complex class that lets you take an offscreen bitmap and stretch it onto any four-pixel-defined-rectangle on the screen.</li></ul><p>Since I'm a mobile phone veteran, both of these classes are strong on the ability to precalculate early in order to keep the actual render cycle CPU-light. And since I'm a WP7 and C# newbie they probably look a little weird. But they're working great for me, so maybe they'll be useful to you too.</p>Richardhttp://www.blogger.com/profile/00190211511966499616noreply@blogger.com0tag:blogger.com,1999:blog-7406994635900175528.post-29127754418493270232010-06-21T21:12:00.000-07:002010-06-21T21:23:17.493-07:00Wizards of KaitronFirst post at the new web site, and just to keep everyone guessing, I'm not even going to talk about computer gaming for once. Instead, it's time to show off the new OTB game that my son and I put together.<br /><br /><a href="http://www.randomly.com/richard/misc/Kaitron.png"><img style="MARGIN: 0px 10px 10px 0px; WIDTH: 360px; FLOAT: left; HEIGHT: 480px; CURSOR: hand" border="0" alt="" src="http://www.randomly.com/richard/misc/Kaitron.png" /></a><em>Wizards of Kaitron</em> is a tile game that's at least vaguely like Magic-the-Gathering: you and your opponent both have a main character (a Wizard here), and your MCs each have some amount of HP, and your goal is to do damage to that guy until he dies. Poof, you win.<br /><br />The novel part is, Kaitron uses the topology of playing tiles. To attack the enemy wizard you have to work your way over there, with your tiles and his fighting as you go. Each tile has its own health and special abilities, like being able to rotate in place or heal neighbor tiles and so on.<br /><br />Each tile has different attributes, one for each side. There are four elemental attributes (earth, air, fire, water) and four ethereal attributes (light, dark, spirit, death). And there's a rock-paper-scissors-like system where this-beats-that to decide which tile wins in a given combat.<br /><br />The mechanics of playing a game are a little more cumbersome than I'd like, but it's definitely turned out to be an enjoyable game, with a lot of strategy and a little luck involved.<br /><br />My 13-year-old son and I plotted out the game a few days ago and play-tested using carboard tiles to see how it would work. That led to some rule tweaks, following which I ran out to Home Depot and a craft store. I picked up a set of 36 2"x2" kitchen tiles, some stick-on felt for backing, self-adhesive clear inkjet labels and a bunch of colored rhinestones. And poof, we've got some lovely playing tiles.<br /><br />Before moving to this site, my blog was "Game Programming 101"--but I've renamed it to "Game Development 101" since the "programming" part has been getting too much attention. Developing a game is more than just writing lines of code, even if you're working on a well-understood game like checkers. The rename is to help me remember that. :)Richardhttp://www.blogger.com/profile/00190211511966499616noreply@blogger.com2