<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-1986806</id><updated>2011-04-21T14:59:05.715-04:00</updated><title type='text'>Thoughts of a Flying Sheep</title><subtitle type='html'>No hidden agenda here. This is about FlyingSheep.com. Oh sure, some thoughts may seem to have nothing to do with Flying Sheep (the more mathematical thoughts in particular come to mind), but this will be an outward expression of the thoughts of the same entity that runs FlyingSheep.com.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://flyingsheep.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://flyingsheep.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default?start-index=101&amp;max-results=100'/><author><name>FlyingSheep</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_uk2q-bc5eAQ/SwW62Duw1nI/AAAAAAAAAAM/6CGYucwKJaA/S220/dsc_6061.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>387</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-1986806.post-1314457772724507895</id><published>2008-02-01T11:57:00.000-05:00</published><updated>2008-02-01T12:05:36.642-05:00</updated><title type='text'>Consumable Gifts</title><content type='html'>&lt;B&gt;Consumable Gifts&lt;/B&gt;  &lt;P&gt;Stuff takes up room. This is an important observation for someone living in  an apartment, especially as you move from one apartment to another. Even though  I've been living in the same house for over 5 years (has it been that long  already?), I still see the danger of having too much stuff. It's a sort of debt  that hangs over your head, really.  &lt;P&gt;Anyways, with that in mind, I decided that the best kind of gifts, for the  most part, are consumable. They're something that you enjoy for a certain amount  of time, and then *poof* they are gone. Ideally, this is different from  &lt;I&gt;disposable&lt;/I&gt; gifts, although &lt;I&gt;recyclable&lt;/I&gt; gifts are fine, too. In  fact, gifts like games or CDs that are easily transferable (or sellable) are  fine, too.  &lt;P&gt;So, for Christmas, I got a number of consumable gifts, including books and  Playstation 2 games. That's great!  &lt;P&gt;Except, of course, that I've consumed them by now.  &lt;P&gt;Well, except for Sly Cooper 3. I haven't started that yet, but it's next on  my list. I've read my books, drunk my tea (well, there's still more of that),  and played one of the Playstation 2 games. I should probably write a review -  look for that in an upcoming blog&lt;/P&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1986806-1314457772724507895?l=flyingsheep.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://flyingsheep.blogspot.com/feeds/1314457772724507895/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1986806&amp;postID=1314457772724507895&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/1314457772724507895'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/1314457772724507895'/><link rel='alternate' type='text/html' href='http://flyingsheep.blogspot.com/2008/02/consumable-gifts.html' title='Consumable Gifts'/><author><name>FlyingSheep</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_uk2q-bc5eAQ/SwW62Duw1nI/AAAAAAAAAAM/6CGYucwKJaA/S220/dsc_6061.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1986806.post-738334667698545272</id><published>2008-01-26T11:20:00.000-05:00</published><updated>2008-01-26T11:21:03.976-05:00</updated><title type='text'>No blog today - gone to UG</title><content type='html'>&lt;DIV&gt;&lt;FONT face=Arial size=2&gt;Maybe I'll see you there? &lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;A  href="http://www.unitygames.org/ugxiv/ugxiv.htm"&gt;http://www.unitygames.org/ugxiv/ugxiv.htm&lt;/A&gt;&lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1986806-738334667698545272?l=flyingsheep.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://flyingsheep.blogspot.com/feeds/738334667698545272/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1986806&amp;postID=738334667698545272&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/738334667698545272'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/738334667698545272'/><link rel='alternate' type='text/html' href='http://flyingsheep.blogspot.com/2008/01/no-blog-today-gone-to-ug.html' title='No blog today - gone to UG'/><author><name>FlyingSheep</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_uk2q-bc5eAQ/SwW62Duw1nI/AAAAAAAAAAM/6CGYucwKJaA/S220/dsc_6061.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1986806.post-4391769577793745073</id><published>2008-01-21T08:56:00.001-05:00</published><updated>2008-01-21T08:56:57.982-05:00</updated><title type='text'>Science Friction</title><content type='html'>&lt;P&gt;&lt;B&gt;Science&amp;nbsp;Friction&lt;/B&gt;&amp;nbsp; &lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; I'm reading a collection of science fiction novellas  (large short stories, I suppose). I like SF, although it's more of a passing  fancy than a dedication. There aren't many authors that I can name, and none  that I follow closely. I'm not including Fantasy, as there is an author of that  genre that I do follow closely (Terry Pratchett).  &lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; I've read two stories so far from the "Best of the Best  Vol. 2" collection that I got from the library. Each of them featured a male  protagonist that had a difficult relationship with a woman. I'm not sure what I  can generalize from this about SF authors... &lt;P&gt;&lt;STRONG&gt;Completion&lt;/STRONG&gt; &lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; In the first one, "Sailing to Byzantium", there are a few  different outcomes that the characters discuss, and, while the story ends before  you know which path the characters choose, there is an indication that they will  choose one of them.  &lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; However, in the second story, "Surfacing", the main  characters are set before an interesting challenge. They talk about different  options, bemoan their fate, and then the protaganist says, (I'm paraphrasing  here), "Wait! I've got an idea!", and then the story ends. Needless to say, this  is entirely unsatisfying. Perhaps readers that are more clever than I can see  what his great scheme is, but it's beyond me. I hope the other stories are  better.  &lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1986806-4391769577793745073?l=flyingsheep.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://flyingsheep.blogspot.com/feeds/4391769577793745073/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1986806&amp;postID=4391769577793745073&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/4391769577793745073'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/4391769577793745073'/><link rel='alternate' type='text/html' href='http://flyingsheep.blogspot.com/2008/01/science-friction.html' title='Science Friction'/><author><name>FlyingSheep</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_uk2q-bc5eAQ/SwW62Duw1nI/AAAAAAAAAAM/6CGYucwKJaA/S220/dsc_6061.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1986806.post-6679911586292707397</id><published>2008-01-11T20:39:00.001-05:00</published><updated>2008-01-11T20:39:59.619-05:00</updated><title type='text'>SheepSpace</title><content type='html'>&lt;P&gt;&lt;B&gt;My Sheep&lt;/B&gt;  &lt;P&gt;I've decided to create a MySpace account to play around with. I'm surprised  that they limit password length to about 10 characters, although they do force  you to include at least one number.  &lt;P&gt;Uploading a picture now. I see that it doesn't recognize the transparent GIF  format, so I'm going to fix that.  &lt;P&gt;I already have a friend! Tom. That name sounds familar. Perhaps he's the  founder. Talk about eating your own dog food. Maybe Tom created my space because  he was lonely?  &lt;P&gt;Verifying email address. You know, someday we'll teach kids in school these  basic life skills. How to get an email address, how to create a myspace account,  how to use PayPal, how to pass CAPTCHA tests, etc.  &lt;P&gt;Tom has 216588760 friends. That's a lot. I hope he's not lonely anymore.  &lt;P&gt;I'm filling out my profile information. Just using whatever answers come to  mind. I probably should have thought about this more.  &lt;P&gt;Whoops! My first Server too busy error (500). I had read about myspace's  performance issues. They care, but not too much. I mean, it's not a life or  death sort of application, is it?  &lt;P&gt;I hope Tom doesn't take it personally, but I've removed him as a friend. Now  I don't have any friends.  &lt;P&gt;There's a lot of information here. I doubt I'll fill it all in. Well,  schools, companies, and videos I can skip for now.  &lt;P&gt;I was really hoping for more mash-up like stuff. I've got videos on You-Tube,  I've got (well, should create) a facebook account, and I've got a board game  geek account, too. I'd prefer to link them all together rather than entering  everying again.  &lt;P&gt;Anyways, that's enough for now. We'll see where this goes. &lt;/P&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1986806-6679911586292707397?l=flyingsheep.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://flyingsheep.blogspot.com/feeds/6679911586292707397/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1986806&amp;postID=6679911586292707397&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/6679911586292707397'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/6679911586292707397'/><link rel='alternate' type='text/html' href='http://flyingsheep.blogspot.com/2008/01/sheepspace.html' title='SheepSpace'/><author><name>FlyingSheep</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_uk2q-bc5eAQ/SwW62Duw1nI/AAAAAAAAAAM/6CGYucwKJaA/S220/dsc_6061.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1986806.post-8434448821921197259</id><published>2008-01-06T20:18:00.000-05:00</published><updated>2008-01-06T20:19:00.159-05:00</updated><title type='text'>Sly and the Great Tree</title><content type='html'>&lt;B&gt;Sly 2&lt;/B&gt;  &lt;P&gt;Sly Cooper is what I wanted Thief (Looking Glass Studios) to be. Direct  combat is possible, but not very effective. The game encourages you to be sneaky  without restricting you to only being sneaky.  &lt;P&gt;&lt;B&gt;The Great Tree&lt;/B&gt;  &lt;P&gt;I can tell when a game is really good when I need to set a limit (ahead of  time) on how long I will play that game. For a number of Reflexive game demos,  this limit is built in (60 minutes, or for some generous games, 2 hours*).  &lt;UL&gt;   &lt;LI&gt;For bad games, I don't even get to the 60 minute mark before putting the    game aside, writing a quick review, and being done with it.    &lt;LI&gt;For mediocre games, I'll play until the 60 minutes are up, and then say,    "Well, I've wasted enough of my life on that game.    &lt;LI&gt;For good games, I'll go through the entire 60 minutes in a single setting.    Then, exhausted, I'll think, "Boy, that was fun, I should buy that game for    more." &lt;/LI&gt;&lt;/UL&gt; &lt;P&gt;Certain games, like Star Defender 4 and The Great Tree, are so good that that  fall out of this scale.  &lt;UL&gt;   &lt;LI&gt;For excellent games, I carefully dole out the fun in measured quantities.    I'll just play through this set of levels, or play until I lose all of my    ships. The disappointment when I stop playing is actually outweighed by my    anticipation of playing again. &lt;/LI&gt;&lt;/UL&gt; &lt;P&gt;This may be some new take on the "just one more turn" type of games. With a  time limit in place, there's a sort of artificial value inflation (when a  resource is limited, it becomes more valuable). How does one create a game where  the anticipation of playing is as good, or possibly better than the playing  itself?  &lt;P&gt;* Two hours is really too much. You're taking a risk that the player will get  bored of the game in that much time&lt;/P&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1986806-8434448821921197259?l=flyingsheep.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://flyingsheep.blogspot.com/feeds/8434448821921197259/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1986806&amp;postID=8434448821921197259&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/8434448821921197259'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/8434448821921197259'/><link rel='alternate' type='text/html' href='http://flyingsheep.blogspot.com/2008/01/sly-and-great-tree.html' title='Sly and the Great Tree'/><author><name>FlyingSheep</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_uk2q-bc5eAQ/SwW62Duw1nI/AAAAAAAAAAM/6CGYucwKJaA/S220/dsc_6061.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1986806.post-7788271453878359</id><published>2008-01-01T12:22:00.001-05:00</published><updated>2008-01-01T12:22:44.244-05:00</updated><title type='text'>Annual_Review</title><content type='html'>&lt;P&gt;&lt;B&gt;Annual Review&lt;/B&gt;  &lt;P&gt;I'm cleaning up my email folder. This should be part of my annual "prepare  for a new year" process. I'm mostly just making this up, so it's not really  annual yet (and may never be).  &lt;P&gt;Over the last few weeks, I've thought about what I want to do next year.  Writing my annual Christmas letter (which is an annual tradition, running on 6  years now, I think) has put me in an introspective sort of mind-frame. I suppose  you could look at this as research for my new year's resolutions.  &lt;P&gt;I'll start with something small. Actually, I have a few small recurring  resolutions. One is this blog - I want to post every 5 days or so, so if you  come back once a week, you should always have something new to read. I can't  promise this, of course, as I do occassionally go on vacation, but I'll do what  I can.  &lt;P&gt;Also, I want to clean up by selling something on eBay each week. I'd probably  do better if did a dedicated ebay push, just take a few weeks to sell  everything, but that would introduce the possible (likely) problem of sending  the wrong thing to the wrong person. So, instead, I'm going to try to post  something on Friday (each auction ending on Friday) and get it in the mail on  Saturday morning (presuming I get paid more or less when the auction ends). I'm  hoping this will be a maintainable pace.  &lt;P&gt;Heck, I hope that writing a new blog entry each 5 days is a sustainable pace,  too. I've got (I think I mentioned this earlier) a script that prompts me (I  refer to it as Nag-amation) every 5 days, looks in my unsent folder, and (if it  finds anything) formats it for me review and makes it easy for me to send it  along. Sweet.  &lt;P&gt;Well, after babbling for three paragraphs, I can finally get to what I want  to tell you. 2008 will be aboout 3 things for me. Music. Games. And Magic: the  Gathering. Ok, so technically, Magic is a game, but I dedicate enough time to it  that it merits its own category. I'll start there.  &lt;P&gt;&lt;B&gt;It's a kind of Magic&lt;/B&gt;  &lt;P&gt;I play at least two hours of Magic a week (and this doesn't include the  homework time of making and tweaking decks). Additionally, I'm blessed with a  wife and a housemate that also play Magic, so it's not hard to convince either  (or both) of them to crack open some boosters for a quick Winchester draft or  sealed deck.  &lt;P&gt;Then there's the tournaments (running them, not playing in them - which is a  rare treat). I'm on track to have at least one tournament a month - in January,  I'm teaching new players how to play, and in February, a new set it coming out,  and in March (being my birth-month), I can probably arrange to have a casual  tournament at my house. In April, another set will come out, and I'll probably  have the opportunity to work at a pre-release. Six months away, and I see a good  amount of Magic in my future.  &lt;P&gt;&lt;B&gt;Other Games&lt;/B&gt;  &lt;P&gt;"Well, Sheep, " you might say, "that sounds like a committment. What else do  you have time for?" While I've more or less stopped going to my local gaming  group on Mondays (which is sad, but they simply go too late for my schedule),  the Jedi Princess and our houseguest (who deserves some sort of FlyingSheep  name) have dinner and games with friends of ours once a week. We only usualy  play one game (or two short games), but it's something. Also, a little bird told  me that one of our friends is getting Race for the Galaxy for Christmas - I  can't wait for that.  &lt;P&gt;New paragraph - what I really want to do is spend more time designing,  developing, and testing my own game designs. There's another &lt;A  href='ttp://www.unitygames.org/ugxiv/ugxiv.htm"'&gt;Unity Games event&lt;/A&gt; at the  end of January that's providing a nice deadline, and with Sara's family  visiting, I've got a few people to try out my ideas on. I'd like to say I've got  both a carrot and a stick as incentive, but I have no idea whether the family is  the carrot and the deadline is the stick, or vice versa. Some metaphors are  better left unsaid, I suppose.  &lt;P&gt;I have some interest in creating a web app to either share these designs (and  encourage other budding game designers to share their ideas) or just to track  what games I play and when (although I expect board game geek has such a service  already written).  &lt;P&gt;&lt;B&gt;Sweet, sweet Music&lt;/B&gt;  &lt;P&gt;Music is the easiest of these three, as I'm more of a twig in a stream,  rather than the stream itself (my metaphors are getting worse, aren't they?).  I'm in two groups (three, if you distinguish between the Dance/March+Medley  community groups) that rehearse weekly or monthly and perform whenever the  opportunities arise.  &lt;P&gt;&lt;B&gt;Website?&lt;/B&gt;  &lt;P&gt;You may have noticed that, short of the blog resolution and some ideas for  potential web projects regarding gaming, I don't have many plans for  FlyingSheep.com. While I hope to continue to play with existing public tools  (like MySpace, and possibly FaceBook), and this site will continue to be a  playground for ideas that I want to try out, I don't have any plans to commit a  large amount of time to the website. I hope that doesn't come off as  disappointing to the two of you who still read this blog (: But one of my goals  with making this list of goals (a meta-goal, if you will) was to replace my  guilt over not getting more stuff done with a recognition of the stuff that I do  get done. I suppose I don't want to have a dozen half-finished projects, I'd  rather have 6 finished projects, without driving myself crazy (:  &lt;/P&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1986806-7788271453878359?l=flyingsheep.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://flyingsheep.blogspot.com/feeds/7788271453878359/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1986806&amp;postID=7788271453878359&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/7788271453878359'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/7788271453878359'/><link rel='alternate' type='text/html' href='http://flyingsheep.blogspot.com/2008/01/annualreview.html' title='Annual_Review'/><author><name>FlyingSheep</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_uk2q-bc5eAQ/SwW62Duw1nI/AAAAAAAAAAM/6CGYucwKJaA/S220/dsc_6061.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1986806.post-3009742434839805103</id><published>2007-12-27T10:58:00.001-05:00</published><updated>2007-12-27T10:58:44.075-05:00</updated><title type='text'>Chistmas Part I</title><content type='html'>&lt;B&gt;Christmas&lt;/B&gt; (part one)  &lt;P&gt;So, we went to my parent's house for Christmas Eve. I made lasagna, which is  a rare treat. I'm not allowed to make lasagna at home because, well, there's no  such thing as a "small lasagna", and we end up having leftovers all week.  &lt;BLOCKQUOTE&gt;&lt;EM&gt;Ironically, we ended up taking about half of the lasagna home,    so we've still got enough leftovers for a week.&lt;/EM&gt; &lt;/BLOCKQUOTE&gt; &lt;P&gt;&lt;B&gt;Sly Cooper 2&lt;/B&gt;  &lt;P&gt;Anyways, one of my gifts was Sly Cooper 2. I got the original for Christmas  two years ago, and was pleased that the opening sequence of Sly Cooper 2 starts,  "Two years ago, Sly Cooper defeated Clockwerk...". It's cool when game time =eal  time (at least in my life).  &lt;P&gt;It's a shame that it's taken me so long to get back into the Sly Cooper  games. I think that there's something wrong with way they select portions of the  game as demos. I played a demo of Sly 2 that was included in one of the Ratchet  and Clank games (which is brilliant cross-selling). In the demo, I had to follow  someone around without being caught. After a few feeble tries of the demo, I  gave up in disgust, convinced that the success of the first Sly Cooper must have  been a fluke.  &lt;P&gt;Now, having played the game - including the same mission that was used as a  demo, I think it's great. I'm remembering now the fun that I had with the  original. Each mini-mission is slightly challenging (I expect them to get  tougher as I go), and there's plenty of other things to do (like  pick-pocketting, finding all the clue bottles, exploring, etc.). It's not  completely free-range (like Grand Theft Auto), and not completely linear (like  Jak 2 and 3), and playing as three different characters in a multitude of game  types means a lot of variety.  &lt;P&gt;&lt;B&gt;Spice of life&lt;/B&gt;  &lt;P&gt;Different stuff in small amounts is sort of a theme in these post-Christmas  days. I spend a little time, maybe an hour or so, playing Sly 2, then I work on  a game design for about an hour, then watch a few episodes of Twilight Zone or  Simpsons (more Christmas loot), and then start the cycle over again. It's nice,  but I worry that I'm being too superficial and I shouldn't indulge my short  attention span so much. Eh, I'm not really worried.  &lt;P&gt;So, if this is Christmas part 1, when's Christmas part 2? Whenever my wife's  parents arrive to kick off another round of present opening. Possibly tonight.  &lt;P&gt;&lt;B&gt;How do you open presents?&lt;/B&gt;  &lt;P&gt;They open presents differently than my family does. In my family, everyone  gets a gift (or a stream of gifts) and opens them simultaniously, competing for  attention. This is similar to the way we do everything - we talk all at once,  and we're not all that good at listening. It's surprising how well we  communicate with each other, really.  &lt;P&gt;My wife's family, on the other hand, opens presents one at a time. Each  present opener has the full attention of everyone in the family. Additionally,  someone should (although we've failed at the this the last few years) keep track  of who got what from whom, as most of the gift-givers aren't present, and thank  you cards (or phone calls) are difficult if you can't remember who gave you  what.  &lt;P&gt;I like both approaches to gift opening. Frantically opening presents is  exciting and boisterous and celebratory, while leisurely opening presents is  enjoyable and stretches out the fun (open presents for a while, stop for a  snack, open more presents, stop for a nap, then finish opening presents).  &lt;/P&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1986806-3009742434839805103?l=flyingsheep.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://flyingsheep.blogspot.com/feeds/3009742434839805103/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1986806&amp;postID=3009742434839805103&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/3009742434839805103'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/3009742434839805103'/><link rel='alternate' type='text/html' href='http://flyingsheep.blogspot.com/2007/12/chistmas-part-i.html' title='Chistmas Part I'/><author><name>FlyingSheep</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_uk2q-bc5eAQ/SwW62Duw1nI/AAAAAAAAAAM/6CGYucwKJaA/S220/dsc_6061.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1986806.post-3002451974963516628</id><published>2007-12-22T09:01:00.001-05:00</published><updated>2007-12-22T09:01:13.810-05:00</updated><title type='text'>Database_Access</title><content type='html'>&lt;B&gt;My database&lt;/B&gt;  &lt;P&gt;Ok, goal for today is to get complete access to my local database. I think I  really have two options: (a) debug the current installation, or (b) uninstall  and re-install SQL Server Express (paying more attention to the Authentication  Details.  &lt;P&gt;&lt;B&gt;debug&lt;/B&gt;  &lt;P&gt;Let's try searching on Google. Ah, yes, great (: Searching for the error  message lead me to this &lt;A  href="ttp://forums.microsoft.com/MSDN/ShowPost.aspx?PostID&amp;#16;37473&amp;amp;SiteID="&gt;Microsoft  forum conversation&lt;/A&gt; on server-level rights vs. database-level rights.  Creating a database is a server-level right (which makes sense, but wasn't how I  was thinking about it), and that's not based on the connection properties, but  on the account used to start the services.  &lt;P&gt;I'll admit that I'm still not sure about the details here, but (as a shot in  the dark) I tried running the SQL Server Management Studio as Administrator, and  then was able to create a database.  &lt;P&gt;&lt;B&gt;DBSandbox&lt;/B&gt;  &lt;P&gt;Ok, now to populate the database with a test table, some test data, and start  playing.  &lt;P&gt;I'm creating a table called GAME with a game_id and game_name. Two entries  ("Race to the Galaxy", "San Juan"). My friend is getting RttG for Christmas (:  Now, to switch to Visual Studio Express.  &lt;P&gt;&lt;B&gt;Registration&lt;/B&gt;  &lt;P&gt;Ahck! I've only got 3 days left to register. Better do it now.  &lt;P&gt;Creating a Windows Live account. It's pretty amazing how dumb all users are  (including myself). I somehow managed to mis-type my password in the  confirmation area, and also failed the CAPTCHA.  &lt;P&gt;Do you read the agreements that you have agree to when you're registering  somewhere? I didn't.  &lt;P&gt;Personal information (I see it allows for an "Additional Last Name" - it's  more culturally aware then I am). I suppose some people go out of their way to  check the "please have your partners send me spam" box, but not me. It seems a  bit optimistic, really.  &lt;P&gt;Somehow, I am convinced that I do need to check the other box - inform me of  important security, product, and event information. I'm tempted to list my  primary role in my company as "Mayor".  &lt;P&gt;Ok, time to check email, click on the supplied link, and finish the  registration. Ah ha! There was a moment of confusion, as I actually had two  emails with links - one to confirm my new Windows Live account, and another  register the product. Now I've got my registration key. Entered, and done.  &lt;P&gt;&lt;B&gt;Where was I?&lt;/B&gt;  &lt;P&gt;Ah yes, adding a database connection, linking it up to a data table, and  seeing the results. Hurrah!  &lt;P&gt;That's it for today. &lt;/P&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1986806-3002451974963516628?l=flyingsheep.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://flyingsheep.blogspot.com/feeds/3002451974963516628/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1986806&amp;postID=3002451974963516628&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/3002451974963516628'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/3002451974963516628'/><link rel='alternate' type='text/html' href='http://flyingsheep.blogspot.com/2007/12/databaseaccess.html' title='Database_Access'/><author><name>FlyingSheep</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_uk2q-bc5eAQ/SwW62Duw1nI/AAAAAAAAAAM/6CGYucwKJaA/S220/dsc_6061.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1986806.post-8752367655423670269</id><published>2007-12-11T20:54:00.000-05:00</published><updated>2007-12-11T20:55:04.926-05:00</updated><title type='text'>iTunes</title><content type='html'>[SQL Server Express is downloading.]  &lt;P&gt;&lt;B&gt;ITunes&lt;/B&gt;  &lt;P&gt;My wife's the one with the iPod, but after playing with iTunes and podcasts,  I installed iTunes on my computer and started looking for some interesting stuff  to listen to. There are a few categories of podcasts, some of which work better  than others.  &lt;P&gt;&lt;B&gt;Spoken word&lt;/B&gt;  &lt;P&gt;I can see how this would be ideal for listening to in the car or while on the  move. In fact, my wife and I listen to &lt;A  href='ttp://boardgamestogo.com/"'&gt;Board Games To Go&lt;/A&gt; whenever we go on a car  trip. We also listen to Will Shortz's &lt;A  href='ttp://www.npr.org/templates/story/story.php?storyIdD73090"'&gt;Sunday  puzzle&lt;/A&gt;.  &lt;P&gt;On my desktop (things that probably only appeal to me), I've added A Praire  Home Companion, Getting things done, and WNYC's Radio Lab. All of these are  worth listening to, but I don't usually turn on my computer to listen passively.  Whenever my computer is on, I'm usually actively doing something that requires  verbal mind-space. Checking email, writing this blog, programming (hopefully  sometime soon, really), or even playing a game. Unfortunately, spoken word  programs don't mesh at all with these activities, and I don't usually get  through an entire podcast before silencing it.  &lt;P&gt;&lt;B&gt;Music&lt;/B&gt;  &lt;P&gt;Well, that leaves music, doesn't it? I've been experimenting with a few jazz  and big band podcasts. It's a lot more like listening to the radio, which mostly  leaves my brain free to do other things. Like waiting for SQL Server Express to  finish downloading.&lt;/P&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1986806-8752367655423670269?l=flyingsheep.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://flyingsheep.blogspot.com/feeds/8752367655423670269/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1986806&amp;postID=8752367655423670269&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/8752367655423670269'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/8752367655423670269'/><link rel='alternate' type='text/html' href='http://flyingsheep.blogspot.com/2007/12/itunes.html' title='iTunes'/><author><name>FlyingSheep</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_uk2q-bc5eAQ/SwW62Duw1nI/AAAAAAAAAAM/6CGYucwKJaA/S220/dsc_6061.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1986806.post-2023964545056068033</id><published>2007-12-05T17:55:00.000-05:00</published><updated>2007-12-05T17:58:28.188-05:00</updated><title type='text'>Games</title><content type='html'>&lt;B&gt;Games&lt;/B&gt;  &lt;P&gt;It's not really fair, is it? You're expecting some great observations about  software development, and I'm letting you down. Instead of exploring and  creating, I'm playing. Well, I may as well blog about it, right? Perhaps you're  a gamer too, and this will interest you.  &lt;P&gt;Currently, I've got two games on my physical desk - Age of Wonders II and  Neverwinter Nights 2.  &lt;P&gt;&lt;B&gt;AOW 2:The Wizard's Throne&lt;/B&gt;  &lt;P&gt;Very evocative title, that. And, it's appropriate, as one of the main changes  in the sequel is the increased importance of the player as a character (a  wizard) who controls gameplay across the landscape from his tower (or "throne").  There may also be a tie-in with the plot, but I don't pay a lot of attention to  the story.  &lt;P&gt;This game, as well as its ancestor, is one that I've picked up again after a  long (two year) hiatus. In fact, I had to transfer the last saved game file  (from 2006) from my previous computer.  &lt;P&gt;I'm on the verge of uninstalling the game. It's a bad combination of  addicting (last weekend, I awoke around 6 AM just to get in about 3 hours of  gaming) and frustrating. For that much time spent playing the game, I barely  feel any sense of accomplishment. In fact, at the end of that time, I was  probably worse off then when I started.  &lt;P&gt;I should submit, at this point, that my stunning incompotence at this game is  the main (if not the only) contributing factor to its frustratingness. I'm sure  there's a word for "frustratingness", but I can't come up with it.  &lt;P&gt;&lt;B&gt;NWN 2: the unsubtitled&lt;/B&gt;  &lt;P&gt;This game, a birthday gift from my brother, is one of the three factors that  caused me to purchase a new computer. Starting tomorrow (!) I'll be playing  online with him for an hour each week. I can't wait.  &lt;P&gt;Reflexive  &lt;P&gt;I'm testing out games from Reflexive. I started with Richochet Infinity (very  tempting), and just downloaded a Warcraft clone. See you next time!  &lt;/P&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1986806-2023964545056068033?l=flyingsheep.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://flyingsheep.blogspot.com/feeds/2023964545056068033/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1986806&amp;postID=2023964545056068033&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/2023964545056068033'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/2023964545056068033'/><link rel='alternate' type='text/html' href='http://flyingsheep.blogspot.com/2007/12/games.html' title='Games'/><author><name>FlyingSheep</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_uk2q-bc5eAQ/SwW62Duw1nI/AAAAAAAAAAM/6CGYucwKJaA/S220/dsc_6061.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1986806.post-348641467546300403</id><published>2007-11-30T15:59:00.001-05:00</published><updated>2007-11-30T15:59:52.113-05:00</updated><title type='text'>Tutorial Slow Start</title><content type='html'>&lt;B&gt;Visual Studio Express&lt;/B&gt; (Web Developer)  &lt;P&gt;Ok, let's give this a try. I won't spend a lot of time here, but a half hour  should show some progress.  &lt;P&gt;I'm not sure where to begin, so I'm going to start with the "Create Your  First Web Site" tutorial.  &lt;P&gt;Well, as expected, it's pretty slow going. Just drag, drop, set properties,  etc. Still, it's probably just as fast (or possibly faster) than stumbling along  on my own. Next Tutorial is for Basic Data Access. Let's see how far I can get  in the next 10 minutes.  &lt;P&gt;Stalled - looks like I have to install SQL Server express (although I thought  I already had done so. I'll install it (again?) and pick up there next time.  &lt;P&gt;Sorry it's so slow getting re-started.&lt;/P&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1986806-348641467546300403?l=flyingsheep.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://flyingsheep.blogspot.com/feeds/348641467546300403/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1986806&amp;postID=348641467546300403&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/348641467546300403'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/348641467546300403'/><link rel='alternate' type='text/html' href='http://flyingsheep.blogspot.com/2007/11/tutorial-slow-start.html' title='Tutorial Slow Start'/><author><name>FlyingSheep</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_uk2q-bc5eAQ/SwW62Duw1nI/AAAAAAAAAAM/6CGYucwKJaA/S220/dsc_6061.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1986806.post-91084486485057077</id><published>2007-11-25T19:47:00.001-05:00</published><updated>2007-11-25T19:47:30.079-05:00</updated><title type='text'>Starting Over</title><content type='html'>&lt;B&gt;Starting Over&lt;/B&gt;  &lt;P&gt;Well, not quite from scratch. But, I got a new computer (: I'm very excited,  and can't wait to get started.  &lt;P&gt;&lt;B&gt;Redo from start?&lt;/B&gt;  &lt;P&gt;I've got to re-write my auto-nag script to (a) remind me to update my blog  often, and (b) allow me to pre-write my blog entries (including this one). My  old script used an Excel macros and created an Outlook.Application object to do  its thing. No Excel on this computer (so far), and Outlook (Express) has been  replaced by Windows mail (which doesn't expose an API as far as my limited  research has revealed.  &lt;P&gt;So, a new script has to be written that will take text files (such as the one  I'm writing now), reformat them as .eml files, pop them up for approval, and  mark them as sent.  &lt;P&gt;As you can tell if you're reading this, that new script has been written.  &lt;/P&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1986806-91084486485057077?l=flyingsheep.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://flyingsheep.blogspot.com/feeds/91084486485057077/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1986806&amp;postID=91084486485057077&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/91084486485057077'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/91084486485057077'/><link rel='alternate' type='text/html' href='http://flyingsheep.blogspot.com/2007/11/starting-over.html' title='Starting Over'/><author><name>FlyingSheep</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_uk2q-bc5eAQ/SwW62Duw1nI/AAAAAAAAAAM/6CGYucwKJaA/S220/dsc_6061.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1986806.post-7497120240726510357</id><published>2007-11-11T14:55:00.000-05:00</published><updated>2007-11-11T14:12:54.179-05:00</updated><title type='text'>Refactoring for Statistics</title><content type='html'>&lt;DIV&gt;&lt;STRONG&gt;Code Squirrel&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;I realized today, during a training  session on SSIS, that I'm sort of a code squirrel. Whatever language I'm looking  at the time (SQL, VB, Java, C#), I'm struck by a strong desire to start coding  in that language. &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Statistic&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;Ok, let's wrap up  getting statistics into the database. I've decided to (for now) keep the  Canonical object, but I will replace hardcoded values with values loaded from a  database. I want to break this down into steps, after each of which, the tests  can be run. These steps should be as small as possible. &lt;BR&gt;&amp;nbsp;In general, I  want to replace the array of names (where the index defines the ID) with a  dictionary object. &lt;BR&gt;&lt;BR&gt;1. Add a Dictionary object, update Debug Print to  display Dictionary object (generalized)&lt;BR&gt;2. Update AddStatistic to write to  the dictionary object as well. &lt;BR&gt;3. Update Read function (FindStatisticByName)  to look in dictionary object instead. &lt;BR&gt;4. Update Read function  (FindStatisticByIndex) to look in dictionary object instead. &lt;BR&gt;5. Replace Read  Property (AllStatistics) with reference to dictionary object. &lt;BR&gt;6. Remove  array from AddStatistic, etc. &lt;BR&gt;7. Delete the array. &lt;BR&gt;&lt;BR&gt;8. Load  Statistics from the Database. &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Add  Dictionary&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;Hmm... all tests pass, but I'm expecting that the  debugPrint test would fail. Aha! There is no debug print test for this canonical  statistics object. I'll create one. Ok, it fails. Time to add this snapshot to  the database, and re-run. Excellent. Now I have a test to fail (:  &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Update AddStatistic&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;Partially done, but this  reveals another test that I'm missing - testAddSameStatisticsTwiceHasNoEffect.  Interestingly, though, this is a private function (and, I think should be), so I  can't test it. Ok, I'll update the function anyway, shrug, and move on. Done. No  new failures (NNF). &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Update  FindStatisticByName&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;Ok, reduced this function from 20 lines to  10. Tested, NNF. Good. &lt;BR&gt;&lt;BR&gt;Update FindStatisticByIndex&lt;BR&gt;&amp;nbsp;This is even  easier. 12 lines to 6. Tested, NNF. &lt;BR&gt;&lt;BR&gt;Missing step&lt;BR&gt;&amp;nbsp;Also updated  the destructor. &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Update AllStatistics  Property&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;This is a bit tricky, as the array object and  dictionary object are not interchangable. I could create an array from the  dictionary and return that, but instead, I think I'll expose the dictionary,  modify the calling code to use the dictionary instead and, when all the  references are switched, remove the reference to the array. &lt;BR&gt;&amp;nbsp;Failures.  Confusion. Time for a little traditional debugging. Odd, an extra level of  indirection solved the problem, but I don't see why. For now, it works, moving  on. &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Remove Array&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;I'll start with an  easy-to-revert test by making the property private. Done, NNF. Ok, now to  obliterate the references one by one. Ah, this is a little tricky, as the index  defined the key earlier. A little work to accept the index as a parameter  instead. Ok, that works. &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Delete Array&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;Some  additional simplification of DebugPrint (down two 5 verbose lines), and I  finally delete the array. Okay, now I'm ready to change to a database driven  approach, but that will have to wait for next session. Time for some Phantom  Brave. &lt;BR&gt;&lt;/DIV&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1986806-7497120240726510357?l=flyingsheep.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://flyingsheep.blogspot.com/feeds/7497120240726510357/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1986806&amp;postID=7497120240726510357&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/7497120240726510357'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/7497120240726510357'/><link rel='alternate' type='text/html' href='http://flyingsheep.blogspot.com/2007/11/refactoring-for-statistics.html' title='Refactoring for Statistics'/><author><name>FlyingSheep</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_uk2q-bc5eAQ/SwW62Duw1nI/AAAAAAAAAAM/6CGYucwKJaA/S220/dsc_6061.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1986806.post-8797114351497962353</id><published>2007-10-14T08:21:00.000-04:00</published><updated>2007-10-14T08:49:53.482-04:00</updated><title type='text'>Statistics DB</title><content type='html'>&lt;DIV&gt;[It's been a month since my last post. My apologies.]&lt;/DIV&gt; &lt;DIV&gt;&lt;STRONG&gt;Me Tube&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;While waiting for some videos to upload,  (and some video editing shareware to download), I'll do a little coding.  &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Canonical Items&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;In my last session, I got rid  of a few references to Canonical Items. I'm pretty sure that this object is no  longer necessary, so I'm going to scour all remaining references from the code.  First, I'll rename the object and run some tests. Excellent, nothing failed. Ok,  time to just delete it. Done. Tests? Still pass. &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;DB  Statistic&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;Ok, next object to databasify is Statistic. Pretty  simple, actually: &lt;BR&gt;&lt;BR&gt;STATISTIC&lt;BR&gt;statistic_id int&lt;BR&gt;name&amp;nbsp;  varchar(255) &amp;lt;-- unique&lt;BR&gt;abbreviation varchar(8)&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;Ok,  there will be a brief pause while I go through the 12 steps to set this table  and procs and code up. Well, you won't notice the pause, which is good - all the  uploading/downloading is taxing my system, so it's a bit slower than normal.  &lt;BR&gt;&amp;nbsp;Done. Now to run a test. Passed. That was surprisingly easy. Now to  scour the code and get rid of CCanonicalStatistics. &lt;BR&gt;&amp;nbsp;On second thought,  it may be useful to keep this object around as a collection of available  statistics. While I don't often have any reason to walk through all existing  items or effects, statistics are a different story. However, doing much more  work in this area at this point would be speculative future-proofing, which I'm  trying to avoid. &lt;BR&gt;&amp;nbsp;Instead, I'll go do some laundry. See you next time.  &lt;/DIV&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1986806-8797114351497962353?l=flyingsheep.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://flyingsheep.blogspot.com/feeds/8797114351497962353/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1986806&amp;postID=8797114351497962353&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/8797114351497962353'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/8797114351497962353'/><link rel='alternate' type='text/html' href='http://flyingsheep.blogspot.com/2007/10/statistics-db.html' title='Statistics DB'/><author><name>FlyingSheep</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_uk2q-bc5eAQ/SwW62Duw1nI/AAAAAAAAAAM/6CGYucwKJaA/S220/dsc_6061.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1986806.post-5529525087449488709</id><published>2007-09-16T10:37:00.000-04:00</published><updated>2007-09-16T10:52:21.785-04:00</updated><title type='text'>DB Relief</title><content type='html'>&lt;DIV&gt;&lt;STRONG&gt;Database again&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;This session starts off much more  smoothly. I've got a stored procedure to check for duplicate item names now, and  testFindOrCreateBookOfKnowledge is working fine. Next is to tie this into the  class itself. &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Data Entry&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;I add my three  existing items first (so that I'll have the IDs). I discover that Ukelele is  actually spelled Ukulele. Oops. Ok, I've replaced the hardcoded switch with a  database call, and a few tests are failing, but I think they just need new  snapshots (as I made up arbitrary IDs before). Excellent, new snapshots make  everyone happy. &lt;BR&gt;&amp;nbsp;Now I need to replace the individual setup functions  for each item with a "load by id" call. It takes 22 lines (including references  to the CanonicalItems object) to create the book of knowledge, for example. I  should be able to reduce that to just a few lines. &lt;BR&gt;&amp;nbsp;Almost - I still  don't have the item abilities in the database, so I need some custom code still.  Again, debug print doesn't match (ID changed), but it's easily remedied.  &lt;BR&gt;&amp;nbsp;Ukelele. Updated functions. Reviewed failures. Updated snapshots. All  tests pass. &lt;BR&gt;&amp;nbsp;Stage Pass. Updated functions. Reviewed failures. Updated  snapshots. All tests pass. &lt;BR&gt;&amp;nbsp;Refactoring - replace specific setup  functions for each item with one generic function. Even though I have to make  additional calls in some places to add abilities, I can do that in the main  setupTests function. This will help make the setup dependancies more clear.  &lt;BR&gt;&amp;nbsp;Actually, considering how easy it is to create an object now (and,  moreover, with the certainty that the object will always be the same), I might  be able to remove the object from the global parameters array eventually (and  just create it on demand). This would also take care of the dependancy problem,  as I'd be creating objects as I need them. &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Short  session&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;That's it for now, time to take a shower and get ready  for church. Although this session was shorter than last night's 2 hour marathon,  it was a lot less frustrating and (I feel) more productive.  &lt;BR&gt;&lt;/DIV&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1986806-5529525087449488709?l=flyingsheep.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://flyingsheep.blogspot.com/feeds/5529525087449488709/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1986806&amp;postID=5529525087449488709&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/5529525087449488709'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/5529525087449488709'/><link rel='alternate' type='text/html' href='http://flyingsheep.blogspot.com/2007/09/db-relief.html' title='DB Relief'/><author><name>FlyingSheep</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_uk2q-bc5eAQ/SwW62Duw1nI/AAAAAAAAAAM/6CGYucwKJaA/S220/dsc_6061.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1986806.post-1265900236843354618</id><published>2007-09-08T07:35:00.000-04:00</published><updated>2007-09-08T07:49:24.382-04:00</updated><title type='text'>DB Frustrations</title><content type='html'>&lt;DIV&gt;&lt;STRONG&gt;Back to the Database &lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;Ok, so, I'm going to hunker  down and set up database objects for Effects, Abilities, Items, and Characters  (in more or less that order). There's a bit of method to the mostly madness, as  I'm trying to do the leaf-node objects (effect) before their containers  (ability). I'll be creating a list of steps as I go (to follow for the next  object).&lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Effect DB Schema&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;Each effect has some  basic characteristics which will be reflected in the database design. An effect  has:&lt;BR&gt;&lt;BR&gt;Name (oddly enough this isn't reflected in the object  class)&lt;BR&gt;EffectID (ditto)&lt;BR&gt;&lt;BR&gt;Increment (clear enough)&lt;BR&gt;ResultMessage  (clear enough)&lt;BR&gt;&lt;BR&gt;AffectedStatisticID (whoops! Looks like I may need to do  Statistics first)&lt;BR&gt;AffectedItemID (uh oh. Maybe I should start with  Items?)&lt;BR&gt;EffectType (this should be extracted to a separate object/table, I  think)&lt;BR&gt;&lt;BR&gt;&amp;nbsp;Let's back up here, maybe I should do another object first.  &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Item DB Schema&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;Each item would have the  following characteristics:&lt;BR&gt;Name (which, unlike Effect, is reflected in the  object class)&lt;BR&gt;ItemID (and so is this)&lt;BR&gt;Abilities (this is a collection,  which would actually be in a different table. &lt;BR&gt;&lt;BR&gt;&amp;nbsp;Ok, so Item is much  easier. Let's start with that. &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;DB stuff&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;I'm  creating the table and stored procedures (no update required for items, yet).  This is quite a bit to do without any tests, but the web interface the database  might time out if I go back and forth. So, I'm taking slightly larger (although  fairly routine) steps.&lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;DB Files&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;I'm also going  to organize my files a little better (a database subdirectory with mutliple  files). That can be tested (and the tests run fine).  &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Phew!&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;Well, I haven't kept the running  commentary (like I usually do), but that might be good in this case, considering  that I've spent most of the session arguing unsuccessfully with the database.  It's been a little frustrating, but I've finally gotten my first two operations  (insert and retrieve) to work. While I'm not yet ahead, I have made some  progress, so this is a good time to call it a night. &lt;BR&gt;&lt;/DIV&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1986806-1265900236843354618?l=flyingsheep.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://flyingsheep.blogspot.com/feeds/1265900236843354618/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1986806&amp;postID=1265900236843354618&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/1265900236843354618'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/1265900236843354618'/><link rel='alternate' type='text/html' href='http://flyingsheep.blogspot.com/2007/09/db-frustrations.html' title='DB Frustrations'/><author><name>FlyingSheep</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_uk2q-bc5eAQ/SwW62Duw1nI/AAAAAAAAAAM/6CGYucwKJaA/S220/dsc_6061.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1986806.post-7082338442737875258</id><published>2007-08-28T21:34:00.000-04:00</published><updated>2007-08-28T21:48:03.942-04:00</updated><title type='text'>Some UI stuff Game working</title><content type='html'>&lt;DIV&gt;&lt;STRONG&gt;Upgrade&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;Soon it will be time for a new computer.  Actually, no, it was time for a new computer a while ago. But at some point,  I'll actually do something about it. In the meantime, I need to accept  occasional random shutdowns as a necessary evil. Well, as an evil anyway.  &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Game&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;I'm going to write (and test) a function  that displays all of the player's current options. This is in anticipation of  putting together a test game that someone (you, maybe) can actually play.  &lt;BR&gt;&amp;nbsp;I'm treading a bit carefully, as I'm not sure, in general, how much UI  stuff should be tested. My vague plan is to write functions like  DisplayCurrentOptions(...) and make sure that the output matches the expected  results (a DebugPrint, if you would). There's probably a more clever way, and I  hope I stumble upon it. &lt;BR&gt;&lt;BR&gt;DisplayCurrentOptions(objCharacter,  arrLocalNPCs)&lt;BR&gt;&amp;nbsp;We'll start with the parameters I know I'll need. Given a  character and the local NPCs available to talk to, show me my options.  &lt;BR&gt;&amp;nbsp;Shouldn't I start with the simplest version that makes sense? Yes,  I'll leave NPCs out of it for now. &lt;BR&gt;&amp;nbsp;Eek, a lot of syntax errors. I'm a  bit embarrassed to make so many simple mistakes. Ok, I've got my basic test  working - a character without any abilities. For now, I don't really care about  abilities, so I'll leave that untested for now. &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Adding  NPCs&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;So, now, I'll pass an NPC object. Eventually, I'll need  to update it to include an array of NPCs, but, for now, this will suffice.  &lt;BR&gt;&amp;nbsp;Ok, tests pass, but this function has unveiled a design flaw. I'd like  objNPC.Name to be something like "Mike", not the full response "My name's Mike",  as it is now. That's really objNPC.NameResponse. So, a little renaming is  required for Name, Job, and Health to NameResponse, JobResponse, HealthResponse.  A simple change that I can make fearlessly with my tests in place. &lt;BR&gt;&amp;nbsp;Ok,  two tests fail with the change. One was expected (I'll need to update  snapshots). The other one, testAskStageManagerAboutBasicInfo, is probably  accessing data directly that it shouldn't. Upon reflection, this second test is  a pale shadow of the DebugPrint test, so I'll just delete it. It was a stepping  stone to the other (better) test. &lt;BR&gt;&amp;nbsp;Now to try my re-generating  snapshots method. Excellent. Two clicks later, and the test is passing again.  Ah, I meant to create a name for my stage manager first, but *shrug* it's easy  enough to fix. In fact, first, I'll add a little loop to make regenerating  snapshots easier. &lt;BR&gt;&amp;nbsp;Wow. A bug in the setup routine makes all tests  fail. Interesting (and a little scary) to stare at a wall of red failure  notices. &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;UI&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;So, here's the question. Do I want  to display all of the people that you could talk to as a select list? Or as a  bunch of little graphics? I like the second idea. So, I'll need to add a  Thumbnail to the NPC class. I'll be doing that a lot as I start to be concerned  about not only what these objects do, but what they look like. &lt;BR&gt;&amp;nbsp;Now for  the fun part - searching google images for a good "generic NPC" image icon. If  I'm not careful, I can spend hours doing this. Spend = waste.  &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Next Steps&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;Ok, this has lead me in a few  directions. First, I need to break up my successful_Tests repository into actual  tests, and setup functions. Then, I need to replace my setup functions with Load  functions. Of course, to do this, I'm going to have to stuff each object into a  database, and write update, insert, and retrieve functions. I may write  something to generate the update/insert/retrieve code for me. That will depend  on how ambitious I get. &lt;BR&gt;&amp;nbsp;Baby steps - break up setup functions and  change file dependancies, so that the game.asp page has access to the global  parameters object (which, someday, I hope to eliminate completely). Done.  &lt;BR&gt;&amp;nbsp;Upon reflection, I wonder if more design up-front would have saved me  from creating these canonical objects and global parameter arrays? I tend to  doubt it. I'm also pretty happy with the amount of functionality I have at this  point, for relatively little effort. &lt;BR&gt;&amp;nbsp;Another thought is the fact that  every time I think I'm at a position where I can start writing the game  interface, I quickly find a slew of internal changes that drive me back to my  test page. &lt;/DIV&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1986806-7082338442737875258?l=flyingsheep.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://flyingsheep.blogspot.com/feeds/7082338442737875258/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1986806&amp;postID=7082338442737875258&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/7082338442737875258'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/7082338442737875258'/><link rel='alternate' type='text/html' href='http://flyingsheep.blogspot.com/2007/08/some-ui-stuff-game-working.html' title='Some UI stuff Game working'/><author><name>FlyingSheep</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_uk2q-bc5eAQ/SwW62Duw1nI/AAAAAAAAAAM/6CGYucwKJaA/S220/dsc_6061.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1986806.post-906500766206575856</id><published>2007-08-17T08:34:00.000-04:00</published><updated>2007-08-17T08:47:45.112-04:00</updated><title type='text'>Snapshots in Database</title><content type='html'>&lt;STRONG&gt;Next? &lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;Well, I'm not quite sure  what my next move should be. I'm curious about how my new idea about objective  objects will go, but I don't think it's well formed enough to proceed with just  yet. I've enjoyed my recent success with database objects, but they seem too  final - I'm not ready for that level of commitment yet. I'm still sort of  getting a feeling for how these objects will interact to form a "game", and the  objects I have now may not be the best suited for what I have in mind.  &lt;BR&gt;&amp;nbsp;With that said, I'd like to take advantage of my indecision and do  some clean-up work. Specifically, I'd like to get more of my "debugPrint"  comparisons in the database. Here's the list of comparisons that I have:  &lt;BR&gt;&lt;BR&gt;Item Book&lt;BR&gt;Item Ukelele&lt;BR&gt;Item Stage Pass&lt;BR&gt;Effect Increase  Intelligence&lt;BR&gt;Effect Give Stage Pass&lt;BR&gt;Ability Read Book&lt;BR&gt;NPC Stage  Manager&lt;BR&gt;Script Line Take Displayed Ukelele &lt;BR&gt;&lt;BR&gt;&amp;nbsp;Done. All of these  can now be generated with the hit of a single web page. But, they will only be  generated on demand. That way, I can update the Debug code, watch a bunch of  tests fail, re-generate the debug print results, and then see the tests pass  again. I will check in the database to make sure I haven't accidentally created  a thousand rows or anything. Nope, database checks out fine.  Excellent.&lt;BR&gt;&amp;nbsp;Note that I may want to (at some point) group these  snapshots by type, so that I can update all Items or Effects. But, I don't need  it yet. &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Paper time. &lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;The feeling of "what  next?" (that I described at the start of this session) persists. As such, I'm  going to design a small example game - you get a ukulele, learn how to play from  a video, show the stage manager that you can play, and get the stage pass to  win. My large scale plan is as follows: &lt;BR&gt;&lt;BR&gt;1) Design Ukelele Game&lt;BR&gt;2)  Implement Ukelele Game&lt;BR&gt;3) Create Tools to edit the Ukelele Game.  &lt;BR&gt;&lt;BR&gt;&amp;nbsp;Actually, once I'm at step 3, I'm pretty much done with  programming, right? Then I just need to solve the Content Problem again. But,  this is an oversimplification, of course. I'm not claiming victory just yet.  &lt;BR&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1986806-906500766206575856?l=flyingsheep.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://flyingsheep.blogspot.com/feeds/906500766206575856/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1986806&amp;postID=906500766206575856&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/906500766206575856'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/906500766206575856'/><link rel='alternate' type='text/html' href='http://flyingsheep.blogspot.com/2007/08/snapshots-in-database.html' title='Snapshots in Database'/><author><name>FlyingSheep</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_uk2q-bc5eAQ/SwW62Duw1nI/AAAAAAAAAAM/6CGYucwKJaA/S220/dsc_6061.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1986806.post-6275175257780077950</id><published>2007-08-11T10:34:00.000-04:00</published><updated>2007-08-11T11:01:37.592-04:00</updated><title type='text'>Fun with Databases</title><content type='html'>&lt;DIV&gt;&lt;STRONG&gt;Database day!&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;Ok, today's the day that I finally  start playing with my database. My previous database used Access, but I'm going  to start with SQL Server this time. My goal for today is: &lt;BR&gt;&lt;BR&gt;1) Create a  table to store DebugPrint snapshots for certain objects. &lt;BR&gt;2) Write a test  row. &lt;BR&gt;3) Write a test to read the test row. &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Table  Schema&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;Yes, I'm doing a little design up front. I'll try to  keep it to a minimum. I use uppercase table names (singular), and lowercase  field names.&amp;nbsp; &lt;BR&gt;&lt;BR&gt;Table DEBUG_SNAPSHOT&lt;BR&gt;int  snapshot_id&lt;BR&gt;varchar(80) alias (e.g "StageManager")&lt;BR&gt;text snapshot_text  (e.g. "I am a stage manager, I have these abilities...")&lt;BR&gt;&lt;BR&gt;&amp;nbsp;Some of  the steps require playing with my hosting company. These steps aren't very  interesting, but are a bit time consuming, so bear with me. It's a good thing  you aren't reading while I'm typing, otherwise, this would be very boring. I  feel like I should type hash marks every once in a while so that you know I'm  still processing. &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;File Refactoring&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;Actually,  while I'm waiting, I can do a little file clean-up. My holding area for  successful tests has gotten rather large (over 1500 lines), and I think it can  be broken up a bit. I'll start by organizing the file internally (just moving  functions around). One of the nice things about this change is that it's easily  interruptable. Ah ha! Looks like my database is ready. Let's see what the  managing interface is like. &lt;BR&gt;&amp;nbsp;So far, so good. I can create a constraint  to make alias unique. Nuts, I have to find the SQL for it first. Ah, I wanted an  index, not a constraint. Ok, done. &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Break&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;A  short break to play half a game of Syzygy. In the meantime, I've been timed out  of my database session. But, I think I have enough information to proceed.  &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Stored procedure&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;I've created my first stored  procedure, and entered a test row into my new table. Now to try to connect to  the database and execute the stored procedure.  &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;testDatabaseConnection&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;Ok, first issue is an  invalid dsn. FTP to the rescue (: Using an FP browser, I'm able to make a little  more sense out of the example, and proceed to the next step (getting an error  for undefined ado constants. Excellent, a single meta reference in global.asa  fixes that problem. Now I have a problem calling the stored procedure. Got it -  appending parameters. Test passes. &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Refactoring a  bit&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;I'm going to extract the "go to the database and get a  snapshot for this alias" bit of the test, and then re-run the test. I'm starting  a naming convention for functions (e.g. this is DBGetSnapshot) as an experiment.  Really, I should probably create a database object that encapsulates creating  the connection, but I'll wait until I need it. Excellent - test still passes.  &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Benefits&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;Interestingly, in addition to helping  to ease the maintenance pain of snapshot comparison tests (and thus, remove the  barrier to updating the DebugPrint function when necessary), this exercise  increases my comfort level with dealing with the database. It's somehow less  stressful to handle the learning curve with this example than it would be if I  was implementing something that I couldn't wait for. &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Snapshot  Generation&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;Ok, now to write a function that saves snapshots to  the database. I have multiple options for how to approach this - write ad-hoc  SQL and test it first, and then refactor to stored procedures, or write the  stored procedure first and then write the tests to get it to work. Additionally,  I have the choice of &lt;BR&gt;(a) trying to insert, and if it fails, try to  update&lt;BR&gt;(b) trying to update, and if it fails, try to insert&lt;BR&gt;(c) read  first, then determine whether to update (if different) or insert.  &lt;BR&gt;&lt;BR&gt;&amp;nbsp;Given that insert will only happen once (per alias), and updates  will be the norm, and considering that updating with the same text doesn't have  any ill side effects (although it is wasteful), option (b) is tempting. However,  I dislike exception-driven logic, so I'll go with (c) - even at the expense of  generating two db calls occassionally. Caching is the real solution there.  &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;DBSetSnapshot&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;This breaks down into two other  new functions = DBUpdateSnapshot and DBInsertSnapshot.  &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Duplication&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;The first time I copy/paste the  connection string, I feel a little dirty. I'm going to be proactive and  short-circuit the "three times, then refactor" rule, as I know I'll need the  connstring in both of these new functions. Time to put it in the Application  cache. Done, all tests pass.  &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;DBUpdateSnapshot&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;Written, but it's not called  yet, until I update the snapshot text. Fortunately, I had enough foresight to  include a typo in my initial version (; so I can fix that now.  testDatabaseConnection (not quite an accurate name anymore) will now compare the  snapshot text, update it (as it's different), and then validate that the update  took. Excellent! It worked. However, now that the database has been updated, the  next time I run this test, it will take a different path (the text is not  different any more). I think that tests that execute different functionality  like this are a bad idea, but I'm not going to fix it just yet.  &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;DBInsertSnapshot&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;Ok, now to do the insert  version. Just a copy/paste/change SQL on the UpdateSnapshot function. To test  it, I'll delete the existing row from the database. Again, I'm using the same  test to test different functionality. Sweet, it works. &lt;BR&gt;&amp;nbsp;One thing to  note is that I probably don't want to run the drop/insert test automatically  every time. I'm concerned about using up by identity field needlessly. Is this a  valid concern? Of course, this doesn't apply to the update case.  &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Stored procedures&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;Ok, now to refactor each  function to use stored procedures. DBInsertSnapshot first. Hmm... I need to find  a SQL reference, guessing by trial and error is a pain. Excellent, it worked.  &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;DBUpdateSnapshot&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;Last one... Done. Tests pass.  &lt;/DIV&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1986806-6275175257780077950?l=flyingsheep.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://flyingsheep.blogspot.com/feeds/6275175257780077950/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1986806&amp;postID=6275175257780077950&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/6275175257780077950'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/6275175257780077950'/><link rel='alternate' type='text/html' href='http://flyingsheep.blogspot.com/2007/08/fun-with-databases.html' title='Fun with Databases'/><author><name>FlyingSheep</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_uk2q-bc5eAQ/SwW62Duw1nI/AAAAAAAAAAM/6CGYucwKJaA/S220/dsc_6061.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1986806.post-3594181751873963882</id><published>2007-08-03T14:17:00.000-04:00</published><updated>2007-08-03T14:30:31.413-04:00</updated><title type='text'>Give Lisa a Stage Pass</title><content type='html'>&lt;DIV&gt;&lt;STRONG&gt;Last step&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;Make Homer play the Ukulele to the  stage manager, and confirm that he gets the stage pass. Actually, on second  thought, Homer probably isn't smart enough to play the Ukulele successfully.  I'll have Lisa do it instead (although Homer would make a good test).  &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;NPC.ShowAbility&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;Implementing it now (the test  fails already). Actually, thanks to my previous work  (FindResponseByItemOrAbility), it's pretty straightforward. &lt;BR&gt;&amp;nbsp;Ok, now it  appears that the NPC isn't set up to respond to the Ukelele playing. I'll fix  that in the NPC creation script. Done. Let's see what happens now. Ah, a few  syntax errors. Easily fixed... Ah yes, order dependancy in my setup script.  There's got to be a good solution to that, I'm sure I'll stumble across it  later. &lt;BR&gt;&amp;nbsp;My current test is trying to do to many things at once. I'll  start smaller, with a debugPrint test for the StageManager. &lt;BR&gt;&amp;nbsp;Ok, now I  can see clearly that the second script line isn't being added. Now to find out  why. Ah! When I check for duplicates, I don't compare the ability. Changing that  now. Excellent, now that DebugPrint looks like what I expect.  &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;DebugPrint tests&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;Okay, it's past time to fix  the snapshot comparison test problem. My plan is to write the output to a text  file and use that text file for comparison. I can start with the second. First  step - create a directory to hold the files. &lt;BR&gt;&amp;nbsp;Naturally, I'll write a  test function for this. Ah, first bug= handling double quotes. Another syntax  error. Fixed, and the test passes. Unfortunately, the test data is an HTML  header, so it doesn't show up. Fixing that now... That took distressingly long,  but it's over now. &lt;BR&gt;&amp;nbsp;Next step, of course, is writing the data to these  files. Ah. Wrote a bunch of code, and now I get a permission denied error.  Hrm... Looks like it's back to the drawing board. I'll need to store these  snapshots in the database instead.  &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;testCreateReactionToUkelelePlaying&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;Ok, let's  get this test passing (finally! It's been weeks), and then I'm off to make  chicken soup. Excellent. All tests pass.&lt;/DIV&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1986806-3594181751873963882?l=flyingsheep.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://flyingsheep.blogspot.com/feeds/3594181751873963882/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1986806&amp;postID=3594181751873963882&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/3594181751873963882'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/3594181751873963882'/><link rel='alternate' type='text/html' href='http://flyingsheep.blogspot.com/2007/08/give-lisa-stage-pass.html' title='Give Lisa a Stage Pass'/><author><name>FlyingSheep</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_uk2q-bc5eAQ/SwW62Duw1nI/AAAAAAAAAAM/6CGYucwKJaA/S220/dsc_6061.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1986806.post-6132974134452690678</id><published>2007-07-20T15:33:00.000-04:00</published><updated>2007-07-20T15:46:18.724-04:00</updated><title type='text'>Past ID vs Object hurdle</title><content type='html'>&lt;DIV&gt;NNF = No New Failures. &lt;BR&gt;Relative Time&lt;BR&gt;&amp;nbsp;It's only been a week  ...&lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Interruption&lt;/STRONG&gt;&lt;BR&gt;&amp;nbsp;Sometimes I'm glad that my  last name is difficult to pronounce. It makes telemarketers easy to identify.  &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;As I was saying&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;It's only been a week, but it  was a long and fun-filled week. A good friend from out of town stopped by to  visit for a few days, I celebrated my birthday, and I got a lot of cool new  games. I also figured out how I want to proceed with my Object or ID problem.  &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;objCharacter.CreateAndAddItem&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;This new  function will create a new Item, load it with the given ItemID, and then  delegate to the existing AddItem function. I'm not sure it belongs in the  objCharacter class, but it can start off there and move later. I'll take this in  small steps. &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;objItem.LoadByID&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;This will  eventually use the database, but for now, it'll be hardcoded to set certain  properties with a select/case switch. I've created a failing test for it.  testLoadStagePass (bringing my total up to 3 failing tests, which may be the  most at one time). Interestingly, perhaps instead of creating a new test, I can  use testCreateStagePass instead? Let me try that. &lt;BR&gt;&amp;nbsp;Ok, now the old test  is still passing, but I know that the ID is not being saved correctly. This is a  fault of the test - I'll update the Item.DebugPrint to expose its ItemID, and  then the test will no longer pass.  &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Codependance&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;One of the theoretical  (philosophical?) objections I had to test-driven development is that it seems to  only be one layer deep. That is, you write tests that verify your code, but what  verifies the tests? Who watches the watchers? Should you write tests for your  tests first? If so, where do you begin? &lt;BR&gt;&amp;nbsp;As it was explained to me (and  I'm now beginning to understand with experience), tests are not on a different  level than code - they are both on the same level, and depend on each other. The  code validates the tests, and the tests verify the code. &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Back to  Items&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;All three of my item tests (Ukelele, Stage Pass, and  Book of Knowledge) are now failing. My "automatically update snapshots" task  raises in priority on my todo list. Starting with Stage Pass, the test now have  the right value (including the ID of 100). This test still fails, of course,  because my Load function isn't complete. Completed Load function... 1/4 failing  tests fixed. NNF&lt;BR&gt;&amp;nbsp;Next is testCreateUkelele. 2/4 fixed NNF.  testCreateBook. Fixed NNF. Back to original 2 failing tests. &lt;BR&gt;&amp;nbsp;Note that  Item.LoadByID does not do everything necessary to load the Book of Knowledge.  But, for now, that's okay as this function isn't used for the Book of Knowledge.  It's not used for Ukelele yet either, but by the time it is used, it will  probably be a real database function.  &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;objCharacter.CreateAndAddItem&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;Next step is to  create and test this function. As before, I can simply re-write an existing test  function (such as testGiveHomerStagePass). Done... NNF. Now, I've really got two  different tests here - one which is give Homer a stage pass directly, and the  other is give him a stage pass by way of an effect. At this point, I'll  copy/paste the existing function (which does not use the effect), and rename it.  &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;testGiveHomerStagePassViaEffect&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;Ok, now when  this test fails (but the other one passes), I know that something is wrong with  the effect. And right now, the effect doesn't do anything, but that will be  fixed shortly...10 keystrokes later - nuts, the test still doesn't pass.  Although, and this is nice, I know that the objCharacter.CreateAndAddItem  function works, so I can narrow down my debugging. Ah ha! A single Debug.Print  call reveals that I'm applying the wrong effect (Take Ukelele, not Give Stage  Pass). Easily fixed and  now...Success!&lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;testCreateReactionToUkelelePlaying&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;Ok,  here's the last step - let's make Homer play the Ukelele to the stage manager,  and confirm that he gets the stage pass. It'll have to wait for next time,  though. In the meantime, only one failing test.&lt;/DIV&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1986806-6132974134452690678?l=flyingsheep.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://flyingsheep.blogspot.com/feeds/6132974134452690678/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1986806&amp;postID=6132974134452690678&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/6132974134452690678'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/6132974134452690678'/><link rel='alternate' type='text/html' href='http://flyingsheep.blogspot.com/2007/07/past-id-vs-object-hurdle.html' title='Past ID vs Object hurdle'/><author><name>FlyingSheep</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_uk2q-bc5eAQ/SwW62Duw1nI/AAAAAAAAAAM/6CGYucwKJaA/S220/dsc_6061.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1986806.post-4723118646630236692</id><published>2007-07-14T07:00:00.000-04:00</published><updated>2007-07-14T07:13:15.636-04:00</updated><title type='text'>GiveItemEffect</title><content type='html'>&lt;DIV&gt;&lt;STRONG&gt;NNF = No New Failures.  &lt;BR&gt;&lt;/STRONG&gt;&lt;BR&gt;&lt;STRONG&gt;Distractions&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;Could Bookworm  Adventures (from Pop-Cap) be any more addictive? The last two times I've sat  down to code, I've found myself fighting ancient greek villains instead.  Fortunately, I've got good notes from my last session, so I can start right in.  &lt;BR&gt;&amp;nbsp;&lt;BR&gt;&lt;STRONG&gt;Create Stage Pass Item&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;I feel like this  should be easy. Let's see. Creating test, done. Creating setup function to pass  test. Done. Now snapshotting debug text. Done. Test passes. &lt;BR&gt;&amp;nbsp;I note  along the way that my other objects use the Canonical Items collection. I'll  need to fix that later. &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Implement Give Item  effect&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;Ok, let's create a "compare to snapshot" test for the  Give_Stage_Pass effect. Pretty easy copy/paste three lines of code. Test fails  as expected Good. Note that this test only checks to make sure the object talks  the talk. I need another test to prove that it walks the walk.  &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;test GiveStagePass Effect&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;Ok, so I've written  testGiveHomerStagePass and it's failing. Now to implement it so that it passes.  Ah, hmm... Here one part of my design collides with another. One the one hand,  the effect only knows about the itemID (not the item object). But, the Character  wants to get an actual item object (not just the ID). I'll have to consider how  to resolve this. &lt;BR&gt;&lt;BR&gt;More next time. &lt;BR&gt;&lt;/DIV&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1986806-4723118646630236692?l=flyingsheep.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://flyingsheep.blogspot.com/feeds/4723118646630236692/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1986806&amp;postID=4723118646630236692&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/4723118646630236692'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/4723118646630236692'/><link rel='alternate' type='text/html' href='http://flyingsheep.blogspot.com/2007/07/giveitemeffect.html' title='GiveItemEffect'/><author><name>FlyingSheep</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_uk2q-bc5eAQ/SwW62Duw1nI/AAAAAAAAAAM/6CGYucwKJaA/S220/dsc_6061.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1986806.post-5426107018479941189</id><published>2007-07-08T13:22:00.000-04:00</published><updated>2007-07-08T13:44:02.188-04:00</updated><title type='text'>Removing Canonical Abilities III</title><content type='html'>&lt;DIV&gt;&lt;STRONG&gt;On our continuing quest to get rid of all Canonical  objects...&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;I removed it from CCharacter. Currently all tests  pass. Looks like I can get rid of the class definition now. Let me try a rename  first. &lt;BR&gt;&amp;nbsp;Nope, testItemAbilityUnicity still needs it. I'll take a look.  Interestingly, CItems has an instance of it, but doesn't seem to use it.  Deleting from there. NNF (No New Failures). Now doing some actual deletions  (instead of renames). Done. &lt;BR&gt;&amp;nbsp;Looking back on the list of things I  thought I'd have to do in order to get rid of this class, it turned out that  most of them were unnecessary. &lt;BR&gt;&amp;nbsp;Next step: do the same for  CanonicalStatistics? I'm torn between additional refactorings and adding  functionality. Variety is the spice of life, so let's go back to adding  functionality (until I find another necessary refactoring.  &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;testCreateReactionToUkelelePlaying&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;Ok, back to  my last failing test. First, I'll need to create the ability "Play", and  associate it with the Ukelele. I'm going to say that it takes an Int of 8 to  play. Hmmm, this should be tied to the Item, not the ability. For example, it  may take an Int of 8 to play the Ukelele, but an Charisma of 9 to play the  Kazoo. This is something I'll struggle with later. &lt;BR&gt;&amp;nbsp;Ok, I've created  the Play ability and included a reference to it in my test. Now I need to add  SetPromptAbilityID to the ScriptLine object. Done. I'm able to set the ability  to be responded to, but now I need to create and test prompting for an ability.  I'm also updating the DebugPrint as I go along, so I may need to re-snapshot.  Yup, testAddResponseEffectToScriptLine needs to be updated. Updating ... Fixed.  &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Item, no ability&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;Looking at it now, I'll need  to distinguish between my old prompt (just for item) and my new prompt (for a  specific Item's Ability). While I am initially tempted to copy  FindResponseByItem and replace it with multiple variations (e.g.  FindResponseByItemAndAbility,&amp;nbsp; FindResponseByAbility), I'd like to write  FindResponseByItemAndOrAbility (perhaps that's too wordy?). There may be a  better way to express it, without getting too vague (FindResponseByParameters).  I'm going to go with FindResponseByItemOrAbility, with the excuse that it's an  inclusive OR. &lt;BR&gt;&amp;nbsp;This is actually a pretty straightforward change. Rename  everything, add a parameter. I'll do the rename first. Test - NNF. Now adding a  parameter (which will be NO_ABILITY in all existing cases). So far, so good. Ah,  now that I'm trying to match on (what should be the default value), I'm no  longer able to find reponses to just the item (Ukelele in this case).  &lt;BR&gt;&amp;nbsp;This error actually uncovered an older bug and a missing test case. I  didn't have any test cases for asking about an item that the NPC did not know  about. While I need to fix this to make my other tests pass, I'm also going to  take advantage of (and I'll quote) Michael Fowler's Refactoring sound bite on  page 97: &lt;BR&gt;&lt;BR&gt;When you get a bug report, start by writing a unit test that  exposes the bug.  &lt;BR&gt;&lt;BR&gt;testStageManagerDoesNotRespondToBook&lt;BR&gt;&amp;nbsp;Writing...Done. And it  passes, as I already fixed the bug. Well, I guess I don't follow directions in  order all the time (: Now to continue my diagnosis.  &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;testAskStageManagerAboutUkelele&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;It's odd that  this is failing, as I know that the stage manager knows about the ukelele. I'll  throw in a debugprint just to make sure I didn't mess up the object somewhere  along the way. Shocking! My NPC class doesn't expose a DebugPrint. Time to fix  that. &lt;BR&gt;&amp;nbsp;Ok. I've implemented DebugPrint, and confirmed that the  StageManager is as I expect him to be. Must be a problem with finding the  object. ah! Found it. I was comparing an ItemID to an AbilityID, which may match  in some cases, but only by accident. Another insidious bug that would have taken  a lot more time to find without these tests. Fixed, which fixes those two broken  tests. &lt;BR&gt;&amp;nbsp;Ok, now to make the Stage Manager respond to the Ukelele  playing (doesn't it seem like we've been trying to do that for weeks now?).  Actually, no, sorry, that was a lie. I've got two more refactorings to do first.  &lt;BR&gt;&lt;BR&gt;* Get rid of Initilize2 from ScriptLine&lt;BR&gt;&amp;nbsp;I don't even know why  this is still here. Removed..NNF. Good.  &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Add&amp;lt;object&amp;gt;(&amp;lt;object&amp;gt;)&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;This is  similar to the change I made around canonical objects. I'm currently passing a  list of parameters to the container object (NPC), which makes an instance of the  containee&amp;nbsp; (ScriptLine), and then adds it. The problem, of course, is that  if I want to change ScriptLine, I also need to change NPC. So, I'm going to fix  this by: &lt;BR&gt;&lt;BR&gt;* Adding the object as a parameter&lt;BR&gt;* Overriding the object  with the parameters passed in (if the object is nothing). &lt;BR&gt;* Changing the  calling functions to use the object parameter. &lt;BR&gt;* Removing the passed in  parameters.&lt;BR&gt;&lt;BR&gt;Adding the object as a parameter&lt;BR&gt;&amp;nbsp;All callers will  initially pass Nothing as the object. Let me try this first, and then I've found  some additional changes (already). Finding all the callers - good, there's only  one function that uses it. I've moved the function to my working area  (shared.asp). NNF. &lt;BR&gt;&amp;nbsp;Ok, the additional changes I'll need to make are to  UpdateScriptLine (which should also take an object). I'll add that to the end of  my todo list. &lt;BR&gt;&amp;nbsp;Replacing references to the parameters...NNF&lt;BR&gt;&lt;BR&gt;*  Overriding the object with the parameters passed in (if the object is nothing).  &lt;BR&gt;&amp;nbsp;Done. &lt;BR&gt;&lt;BR&gt;* Changing the calling functions to use the object  parameter. &lt;BR&gt;&amp;nbsp;Should this ScriptLine object be part of the global  parameters array? No, for now, as it seems pretty specific to this scenario  (although having a general ScriptLine object to pass around would be useful).  &lt;BR&gt;* Removing the passed in parameters.&lt;BR&gt;&amp;nbsp;Ok, I made a bunch of changes,  now time to test. Ok, so far, so good. &lt;BR&gt;&lt;BR&gt;* UpdateScriptLine (which should  also take an object)&lt;BR&gt;&amp;nbsp;Perhaps I shouldn't update at all, but just reject  it as a duplicate (if the item/Ability combo match). I like this better.  Changing code... Done, but this really calls for another test. For this test I  will need a script Line object, so I'm going to create one and add it to my  global array. I'll use the one I need elsewhere -  SCRIPT_LINE_TAKE_DISPLAYED_UKELELE (hard to get a short description for "If you  show my the Ukelele, I will take it away from you"). &lt;BR&gt;&amp;nbsp;You'll be proud  of me, I'm starting with a failing test testCreateScriptLineTakeDisplayedUkelele  (yes, it will be a debugprint comparison test, so don't be too proud of me). Ok,  good. Now to (a) make sure this ScriptLine is created before the Stage Manager,  and (b) use it in the creation of the stage manager. &lt;BR&gt;&amp;nbsp;Unexpected error  when I did both. I backed out, and will try again. First, moving the ScriptLine  creation to before the Stage Manager creation. No error. Good. Now doing a  debugPrint before using it in the stage manager creation. TypeName first,  matches expectation, now a full debugPrint. That looks good as well. Hmm...  okay, now trying to pass it. Very odd, something is clearing out the object  underneath me. Investigating. . . Ah ha! My initial (full parameter list)  version of AddScriptLine created its own objScriptLine, and diligently cleared  it out at the end of the function. I was doing the same, but to the object that  was passed in. Fixed, testing...NNF (now to clean up my debug code). Also  cleaning up some local object creation in SetupCreateStageManager that is no  longer necessary. &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;testScriptLineUnicity&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;All  that to write a test to prove that I can remove the UpdateScriptLine function.  Creating new testScriptLineUnicity, adding to test suite, testing... failure -  Illegal Assignment (don't see those very often). Ah, my AddScriptLine function  wasn't set up to return any values. Easily fixed. (oops, syntax error, also  easily fixed) - darn it, another syntax error. Fixed...Phew. Ok, NNF. I'm up to  48 tests (: &lt;BR&gt;&amp;nbsp;I've finally removed the Update function. It was a good  idea at the time, but isn't really maintainable, and isn't consistent with my  design choices elsewhere. &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Look to the future.  &lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;I've created more scaffolding this session, and I've added an  ability to the ReactionToUkelelePlaying function. I still need to add an effect.  But I'm not sure what the effect should be - give a stage pass, or finish an  objective? While I'm excited about the opportunities to create a new Objective  class (Items are yesterday's news), I think I should implement the "Give Item"  type of effects first. Short todo list:&lt;BR&gt;&lt;BR&gt;* Create Stage Pass Item&lt;BR&gt;*  Implement Give Item effect&lt;BR&gt;* Create GiveStagePass Effect&lt;BR&gt;&lt;BR&gt;&amp;nbsp;Also,  soon I'll need to hook these objects up to a database. I'm a little worried  about that step, but I think it will soon become painful to maintain this  growing arrParameters list. Plus, my setup functions will become "load from  database" functions. Then I'll need to write a bunch of write to database  functions. Then I can finally start creating objects via the UI instead of  hardcoded setup functions. Of course, the downside is that any object design  changes may require database changes. &lt;BR&gt;&amp;nbsp;I should write up some common  database refactorings (migrate data to a new schema, point to the new database  table, drop the old table). &lt;BR&gt;&amp;nbsp;See you next time.  &lt;BR&gt;&lt;BR&gt;&lt;/DIV&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1986806-5426107018479941189?l=flyingsheep.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://flyingsheep.blogspot.com/feeds/5426107018479941189/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1986806&amp;postID=5426107018479941189&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/5426107018479941189'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/5426107018479941189'/><link rel='alternate' type='text/html' href='http://flyingsheep.blogspot.com/2007/07/removing-canonical-abilities-iii.html' title='Removing Canonical Abilities III'/><author><name>FlyingSheep</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_uk2q-bc5eAQ/SwW62Duw1nI/AAAAAAAAAAM/6CGYucwKJaA/S220/dsc_6061.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1986806.post-2664566980050391991</id><published>2007-07-07T14:10:00.000-04:00</published><updated>2007-07-07T14:23:11.112-04:00</updated><title type='text'>Removing Canonical Abilities II</title><content type='html'>&lt;DIV&gt;&lt;FONT face=Arial size=2&gt;So, after a nice little afternoon gaming break  (Drakon and Hick Hack in Gacklewack), and a little email, time to get back to  work. Well, "work" in quotes, really. &lt;BR&gt;&amp;nbsp;Oh, one more thing. I'm going to  get into the habit of zipping my local files every so often (aka quick &amp;amp;  dirty source control). Nothing fancy. We'll see if I remember. &lt;BR&gt;&amp;nbsp;TNNF =  Tested, no new failures. &lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;STRONG&gt;* Update UseAbility to take AbilityID  instead of name. &lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;This should be easy, right? Changes made,  let's see...One error (I think if all the tests passed, I wouldn't have believed  it anyway) with the oddball "Hit Thumb" ability. Ah - the object I wanted to  reuse wasn't available. Moving some lines of code around, and No New Failures.  &lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&amp;nbsp;At this point, I think I can take a different  tact. If I remove all of the objects from CCanonicalAbilities, then I can prove  that it is no longer used. Let's try the "full steam ahead" approach and comment  them all out. If any tests fail, I can re-introduce the abilities to see where  the failure was introduced. &lt;BR&gt;&amp;nbsp;Is this a shortcut? You bet! But if it  works, it'll save me some time, and it doesn't take a lot of time to see if it  works. &lt;BR&gt;&amp;nbsp;Well, nuts, I can see that isn't going to work. I have one  outstanding reference to CCanonicalAbilities, as used by items. Let's see if I  can fix the AddAbility function in Items the same way I fixed it for Characters.  &lt;BR&gt;&amp;nbsp;Knowing what I know now (and knowing that there's only one test),  perhaps I can take a few shortcuts, and fix all of the parameters at the same  time. Coding...&lt;BR&gt;&amp;nbsp;Hmm... Item doesn't have the same non-duplicating logic  as character. I'll fix that later (and introduce a test for unicity). Cross  fingers and test. Errors - ah ha, another undocumented time dependancy in the  setup functions. Fixed. NNF.&lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;STRONG&gt;* Test Item Ability  Unicity&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;Ok, so new test called testItemAbilityUnicity. I'll  try to add two abilities of the same name to the Ukelele. Well, I wrote that  test, but didn't run it, because the ability I choose to add was (the only  ability available to me) Read Book. Which, for a Ukelele, doesn't make much  sense. While I was torn between, "It doesn't matter, it's just a test" and "If  the test makes sense logically, it'll be easier to maintain", the latter won  out. So, now to add it to the test suite. Checking...Excellent. One more passing  test. I'm almost at two rows (45 tests and counting). &lt;BR&gt;&amp;nbsp;Uh oh. That test  passed, but I know that it doesn't work, because I didn't implement the  duplicate check. The duplicate bug and the "debugPrint isn't a complete  description" bug&amp;nbsp; conspired against me. I'll need to make debugPrint  complete, which will make this test fail, and then I can make it pass.  &lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;STRONG&gt;Beefing up DebugPrint for Items.  &lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;Done, now the test is failing (accurately). What's nice is  that I was able to call the Item's ability's debugPrint function (which, in  turn, called the Effect's DebugPrint). All of which use the &amp;lt;ol&amp;gt; html  tags, so I get automatic indentation. Hmm.. Now I'm beginning to wish that each  of them had its own color (: Maybe I could use some css style tags. That's  probably overkill for debug functions, right? &lt;BR&gt;&amp;nbsp;Now to make it pass. I'm  adding a new constant to the class (ABILITY_ALREADY_PRESENT), which should be on  other classes as well, but I'll fix them as I find them. Ok, this test passes.  &lt;BR&gt;&amp;nbsp;But wait - there are two other tests that fail now. Probably because  I'm comparing debugPrint to strings that need to be updated. Yup. These  particular tests are becoming a pain to test. I'd like an "update snapshots"  function. I'll add that to my todo list.&amp;nbsp; &lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;STRONG&gt;testCreateUkelele&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;So,  first test to fix. Ok, that wasn't so bad. &lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;STRONG&gt;testCreateBook&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;A little  redundant no? I may rethink them later. Actually, the book should have an  ability. Let me update the setup function. Ah ha! The book already has an  ability added, but it's not working. Let me dig in to see  why....&lt;BR&gt;&amp;nbsp;Hmm... It's being flagged as a duplicate. So much for that test  working. Ah, logic, my old enemy. Fixed...NNF. &lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;It doesn't  pay to plan too far ahead. All of my remaining tasks can be replaced by "Remove  each reference to CCanonicalAbilities and test after each one.". Let's start, a  hash mark for each reference removed without affecting any tests - # Well, I got  an error on my second one. testHittingThumbMakesHomerSayDoh needs the canonical  object for some reason. &lt;BR&gt;&amp;nbsp;Actually, in trying to fix it, I've come to  the conclusion that this test has too more customization (custom ability, custom  effect) than it is worth. I was strugging to find a way to test abilities that  were not related to objects, but I don't think I need that right now. As much as  it pains me to do so, I'm going to remove the test. Ok, now all remaining tests  pass. &lt;BR&gt;&amp;nbsp;Back to removing references to CCanonicalAbilities. Let's see if  CCharacter uses it anymore. Three failing tests, let's make them pass.  &lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial  size=2&gt;&lt;STRONG&gt;TestJoeReadingABookMakesHimSmarter&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;It looks  like the UseAbility function still relies on this canonical object. Actually, I  was wrong - the FindAbilityByName function used it. However, I've removed all  references to this function (replaced by FindAbilityByID), so we're all set. In  fact, I'll rename the function now, and if no tests fail, I'll delete it. All  tests say "Go". Delete. Retest because I'm paranoid. Excellent. &lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;Back for more gaming!  Byebye&lt;BR&gt;&lt;/FONT&gt;&lt;/DIV&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1986806-2664566980050391991?l=flyingsheep.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://flyingsheep.blogspot.com/feeds/2664566980050391991/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1986806&amp;postID=2664566980050391991&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/2664566980050391991'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/2664566980050391991'/><link rel='alternate' type='text/html' href='http://flyingsheep.blogspot.com/2007/07/removing-canonical-abilities-ii.html' title='Removing Canonical Abilities II'/><author><name>FlyingSheep</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_uk2q-bc5eAQ/SwW62Duw1nI/AAAAAAAAAAM/6CGYucwKJaA/S220/dsc_6061.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1986806.post-2676003232125794661</id><published>2007-06-25T12:45:00.000-04:00</published><updated>2007-06-25T12:56:52.073-04:00</updated><title type='text'>Removing Canonical Abilities I</title><content type='html'>&lt;DIV&gt;I've got a long todo list from last time. Remember, we're trying to remove  CCanonicalAbilities. DATP = Done, all tests pass (except for the one outstanding  test that has motivated all this refactoring). &lt;BR&gt;&lt;BR&gt;* Add  CCharacter.FindAbilityByID. DATP. &lt;BR&gt;* Update AddAbility to use this instead of  FindAbilityByName. Interesting - testAbilityUnicity failed unexpectedly. Hmm..  my one incomplete oustanding test is interfering with my debugging, I'll remove  it for now. Commenting it out, as a reminder to re-add it later. Ah, I fixed a  variable name, but left a dangling reference. Fixed...DATP&lt;BR&gt;&lt;BR&gt;* Replace  objNewAbility with the objAbility passed in. First pass removes about 10 lines.  Oh dear! Two tests fail unexpectedly. Hmmm. I see, it turns out that multiple  parameters are now unnecessary, but I can't just ignore them yet. Made a few  minor changes, which will spawn an additional task to get rid of these excess  parameters. DATP. Let's clean up some unused variables for now. 7 lines gone.  DATP - Nice. &lt;BR&gt;&lt;BR&gt;* Remove lngStatisticID, lngSuccessThreshold from  AddAbility in CCharacter. &lt;BR&gt;&amp;nbsp;This will clean up the function even more,  but first I need to make the clients pass more intelligent ability objects. As  such, I should make the abilities canonical first. So, I'll get back to this.  &lt;BR&gt;&lt;BR&gt;* Create canonical Ability objects as part of arrParameters().  &lt;BR&gt;&amp;nbsp;Let's see which ones I use... ReadBook, which is based on  Intelligence, and has a threshold of 11. Creating setupCreateAbilityReadBoook...  actually, I can just use a generic setupCreateAbility function, passing whatever  I need. It's pretty straightforward, although I wonder if I'm missing something.  I feel a little dirty accessing all the properties of CAbility directly, but  it's just a data holder for now. At some point, I'll need to push down more  responsibility (currently in CCharacter) to CAbility, but not yet.  &lt;BR&gt;&amp;nbsp;SetupAbility Coded...typo...DATP. Now to test it with a debugPrint  comparison. I'm going to take a moment to remove the purple text (seemed like a  good idea at the time). So, this feels a little like cheating - I take a  snapshot of the object's debugPrint results, and then hardcode that in the test  for comparison purposes. *Shrug* It works for now. &lt;BR&gt;&amp;nbsp;Ok, so I've created  a "ReadBook" Ability. I should be able to replace the one I get from Canonical  abilities with the one from  arrParameters(PARAMETER_ARRAY_INDEX_ABILITY_READ_BOOK). Doing so now...  Actually, I can do one replacement at a time. Let's at least test my first two.  Ah, one passed, but the other failed. Let's see why. &lt;BR&gt;&amp;nbsp;Ah, I know why -  the AbilityID has changed, and I'm not using the same objects consistently. Some  of the old references are looking for AbilityID = 0, not 101. Changing my  manually created Ability to match IDs with the canonical version. Ah! That makes  my hard-coded test fail, of course. It's like playing whack-a-mole. Easily  fixed...DATP. &lt;BR&gt;&amp;nbsp;Ok, so now I can go back to doing the rest of the  replacements. Done, but two more tests fail. What could be wrong this time...Ah,  that's right, reading the book is supposed to have an effect when successful.  I'll add that to my Setup script. In fact, that effect can be added to my  growing list of arrParameters. &lt;BR&gt;&amp;nbsp;setupCreateStatisticModifierEffect  written, added to setupTests. Test, no new failures (TNNF is probably a better  acronym. ). Added new test to confirm, and realized that my "Check that this  object's debugPrint result matches the expected value" test doesn't need to be  15 lines long. It can be 7 lines instead. Ok, it passes, now to add it to the  ReadBook ability (which introduces additional dependencies in the setup  function). One line change, did it work? No, new failure in a outdated debug  string comparison. Updating... TNNF. (No new failures). &lt;BR&gt;&amp;nbsp;In fact, all  my tests are passing now. Phew, that step was more involved than I anticipated.  But I got some additional tests and reusable effects and setup functions, so it  was worthwhile. It's probably accurate to say that I misjudged the amount of  effort required. &lt;BR&gt;&lt;BR&gt;* Remove lngStatisticID, lngSuccessThreshold from  AddAbility in CCharacter. &lt;BR&gt;&amp;nbsp;Ok, now this should be a breeze. First,  let's prove my theory that this are no longer needed. Yup, I made the variables  "do nothing" and all tests pass. Now to clean them up. Oh no, I needed to repeat  the previous step for all other canonical abilities (such as Hit Thumb). Well, I  don't think Hit Thumb is a very valuable (or re-usable) ability, so I'll just  make it inline to this function (presuming no other tests use it). &lt;BR&gt;&amp;nbsp;As  a side note from reading Refactoring by Martin Fowler, I think an automated tool  to help with these refactorings (in fact, to check all the references and then  implement it if the coast is clear) would be awesome. Of course, I don't think  there will ever be one for ASP, it's simply not worthwhile (: &lt;BR&gt;&amp;nbsp;Ok, I've  successfully simplified the signature of this one method. In the process, I've  removed one of the dependencies on the canonical ability collection in the  character object. &lt;BR&gt;&amp;nbsp;My todo list is still quite long, but it's well  structured. For now, time to take a shower and prepare for an afternoon of  gaming with Helga's Heroes.&lt;/DIV&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1986806-2676003232125794661?l=flyingsheep.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://flyingsheep.blogspot.com/feeds/2676003232125794661/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1986806&amp;postID=2676003232125794661&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/2676003232125794661'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/2676003232125794661'/><link rel='alternate' type='text/html' href='http://flyingsheep.blogspot.com/2007/06/removing-canonical-abilities-i.html' title='Removing Canonical Abilities I'/><author><name>FlyingSheep</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_uk2q-bc5eAQ/SwW62Duw1nI/AAAAAAAAAAM/6CGYucwKJaA/S220/dsc_6061.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1986806.post-742279333792100046</id><published>2007-06-15T05:57:00.000-04:00</published><updated>2007-06-15T06:08:28.878-04:00</updated><title type='text'>Housecleaning</title><content type='html'>&lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;STRONG&gt;Next steps? &lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;Now I need  to enhance the Stage manager so that he can react to Abilities, not just items.  Then I can show the stage manager that I can play the Ukulele, and he'll reward  me with a Stage Pass. &lt;BR&gt;&amp;nbsp;Let's take a look at CScriptLine. So far, it  assumes that there's only one type of response - an item goes in, and a string  (and, optionally, an effect) come out. I want to make another type of  scriptLine, where an ability (optionally with an item) goes in, and a string  (and optional effect) come out.&amp;nbsp; I'd like to establish some valid  combinations of input, mostly items and abilities: &lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;Prompt&amp;nbsp;&amp;nbsp; Example&lt;BR&gt;---------&amp;nbsp;  -----------&lt;BR&gt;Item &amp;amp; Ability:&amp;nbsp; "playing a ukulele"&lt;BR&gt;Item &amp;amp; No  ability:&amp;nbsp; "showing a Stage Pass"&lt;BR&gt;No Item &amp;amp; Ability:&amp;nbsp;  "Wink"&lt;BR&gt;no Item &amp;amp; No Ability:&amp;nbsp; &amp;lt;invalid&amp;gt;&lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&amp;nbsp;Ok, so I can set Item and Ability separately,  and not have to worry about invalid options (as long as I set one of them). So  instead of a adding parameters to the current Initialize function (in half of  these cases, one of the parameters would be null), I should expose setItemID and  setAbilityID functions. &lt;BR&gt;&amp;nbsp;A series of copies, pastes, and tests. Then  some find/replace to eliminate the Initialize function (and replace it with the  better named functions). The result has less odor: &lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;OLD CODE&lt;BR&gt;Call  objScriptLine.Initialize(lngItemID, strResponse)&lt;BR&gt;Call  objScriptLine.SetEffect(objEffect)&lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;NEW CODE&lt;BR&gt;Call  objScriptLine.SetPromptItem(lngItemID)&lt;BR&gt;Call  objScriptLine.SetResponseText(strResponse)&lt;BR&gt;Call  objScriptLine.SetEffect(objEffect)&lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&amp;nbsp;I think I've got all the references, so I  rename the function to Initialize2 and test. testAddResponseEffectToScriptLine  failed - now to look in other files (I'm not usually this lazy). Last reference  fixed, tests all pass. Sweet. &lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&amp;nbsp;Now I need a new setPromptAbilityID. I feel a  little bit of trepidation here, as I'm still not sure of the relationship  between Abilities with Items and Abilities without. But I do feel confident that  I could change course later with the testing safety net. I also feel like I  should rename SetPromptItem to SetPromptItemID at some point (added to rainy day  refactoring list). So, first, test. &lt;BR&gt;&amp;nbsp;What should the story be here? I  want the StageManager to react to the Character's ability to play the Ukulele  (as opposed to reacting to the Character's Ukulele, which is already done).  &lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial  size=2&gt;&lt;STRONG&gt;testCreateReactionToUkelelePlaying&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;This sounds  like a test of a setupCreateReactionToUkelelePlaying, doesn't it? Should I put  ScriptLines into the parameters array (to join items, characters, effects, and  so on)?&amp;nbsp; I don't see much future re-use of this particular script-line  object, it's more leaf-nodey. So I'll create it and test it in the same  function. If I need to share it later, I'll extract the creation. &lt;BR&gt;&amp;nbsp;I've  written a failing test, but I've also made some unsettling observations about  flaws in my previous design choices. I'll add the failing test to my test cases  (so that I don't lose track of where I was going), but I think there might be  some house cleaning to do shortly. &lt;BR&gt;&amp;nbsp;The first housecleaning task is to  fix up abilities a bit. They currently include a objSuccessfulResultingEffect. I  suppose it makes a little sense to think "I play a Ukelele, and it makes music -  that's an effect". But, in light of the newly create NonPlayerCharacter object,  the result of playing a Ukelele is determined by who you play it at - some  people may get annoyed at you, others might want to be your friend, and if you  play it in the vacuum of space, well, it has no effect whatsoever. &lt;BR&gt;&amp;nbsp;I  suppose I can leave it in place for now, and let the NonPlayerCharacter override  the default behaviour when necessary. After all, At some point an item such as  Healing Potion will need to have an effect without a NonPlayerCharacter around.  Some verbs are intransitive. &lt;BR&gt;&amp;nbsp;The second housecleaning task may be the  abolition of the Canonical classes. Despite by (considerable) affinity for the  word "Canonical", I think these abilities and statistics would be better kept in  the global arrParameters (which didn't exist when I came up with the canonical  idea originally). Of course, their final home is in a database, which I am  mocking up (with little pain so far). &lt;BR&gt;&amp;nbsp;Let's take a closer look at one  of these canonical classes and what it does:&lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;STRONG&gt;CCanonicalAbilities.AllAbilities  collection&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;Not sure if this is used. Let's try making it  private and see what blows up. No additional tests fail. Cool, leaving as  private, I don't have to consider this when deciding the fate of this class.  &lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;STRONG&gt;Speakers&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;As a side note  on the continuing deterioration of my tool, my speakers are not occassionally  cutting out. I'm 90% sure that the problem is with one of the connecting wires,  and not the speakers themselves (although they are rather old). &lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial  size=2&gt;&lt;STRONG&gt;CCanonicalAbilities.FindAbilityByName&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;I think  that there are only a few places that I look abilities by name, and I can  replace those places with either AbilityID (for the lower levels) or a named  constant index into the arrParameters array (for the test functions themselves).  I'd much rather use arrParameters(PARAMETER_INDEX_ABILITIY_READ_BOOK) than use  .FindAbilityByName("Read Book") and hope that there's a space between the words.  &lt;BR&gt;&amp;nbsp;So, this is replacable (and, in fact, provides most of the motivation  for making this change). &lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial  size=2&gt;CCanonicalAbilities.ReturnAbilityObjectByName&lt;BR&gt;&amp;nbsp;Ditto.  &lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial  size=2&gt;CCanonicalAbilities.FindAbilityByIndex&lt;BR&gt;&amp;nbsp;This is just ugly, I  think. If I have an AbilityID, I can just get the Ability Object and use its  Name property. &lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;CCanonicalAbilities.DebugPrint()&lt;BR&gt;&amp;nbsp;Nothing  to see here. &lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&amp;nbsp;Note that, earlier, I was considering  generalizing these Canonical classes. I think it's worth kicking duplicate  classes around a bit before investing too much time in their future. Otherwise  that earlier work would have been sort of wasted. &lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;STRONG&gt;How to proceed&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;I think  the first step is to create some new Abilities outside of the CanonicalAbilities  framework, and, one by one, replace references to the current abilities with  these new free-range ability objects. I'll use IDs that start with 100, just to  avoid any collision (which is what the Canonical structure was originally  designed to prevent). &lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial  size=2&gt;&lt;STRONG&gt;Unravelling&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;FindAbilityByName is used by  AddAbility (which exists both in the canonical class as private and in the  Character class). I find the first call I want to replace: &lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;Call objCharacter.AddAbility("ReadBook",  ...)&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;Instead, I  want:&lt;BR&gt;objCharacter.AddAbility(arrParameters(PARAMETER_INDEX_ABILITY_READ_BOOK),  ...)&lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&amp;nbsp;So, I need to create the parameter, and add  the function. I'll create the function first. Hmmm... what to do about the name  of the function? AddAbility just seems so right. Ok, I'll try replacing the  function in place, by adding and then removing parameters. &lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;STRONG&gt;Adding objAbility as a  parameter&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;There are really two parts to the AddAbility  function: (a) make sure the ability doesn't already exist, and (b) actually  adding the ability. While the second part will be made easier (instead of  retrieving an ability object, I get one passed to me), the first one requires a  teensy bit of work. Actually, I can shortcut the work by simply using the name  in the object passed to me. &lt;BR&gt;&amp;nbsp;Oh, that's an idea. In this case, I can  just replace the strName parameter with the whole objAbility object in one go. I  just need to replace the text name with a call to get it (that is,  CanonicalAbilities.ReturnAbilityObjectByName("ReadBook")). Ironic that the first  step in getting rid of this object is to increase the number of references to  it. &lt;BR&gt;&amp;nbsp;This is a pretty straightforward replacement, but it'll make the  next steps easier. I suppose I should take a minute to lay out exactly what  those steps are. After I do this first step, and make sure everthing passes.  &lt;BR&gt;&amp;nbsp;A moment of panic before I run the tests. Are my changes back-outable?  Or have I gone too far? Hmm... first few tests run into some problems, but I get  by them. Now I'm getting an odd "Object doesn't support this property or method"  error. Ah, somewhere I'm passing a CAbility object where I'm expecting a string.  I'll start by making the function more defensive (and removing some debug  Response.Writes). &lt;BR&gt;&amp;nbsp;Ah ha! I replaced a AddAbility of an Item instead of  character. Easily remedied (although this change will need to affect Items as  well at some point in future). Found it. Undid the replace, and now all tests  pass. &lt;BR&gt;&amp;nbsp;Ok, almost time to quit for tonight. But first I'll make a list  for tomorrow. &lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;* Add CCharacter.FindAbilityByID and update  AddAbility to use this instead of FindAbilityByName. Test.&lt;BR&gt;* Replace  objNewAbility with the objAbility passed in. Test.&lt;BR&gt;* Create canonical Ability  objects as part of arrParameters(). &lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;* Replace the rest of the calls to the Canonical  Abilities object. Test&lt;BR&gt;* Get rid of CCanonicalAbilities. &lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;* Repeat all of that for CCanonicalStatistics.  &lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;* Replace member arrays with  "Scripting.Dictionary"s - (actually LookupTables are better for web use). No  need to write my own, really. &lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&amp;nbsp;Ok, see you then. &lt;/FONT&gt;&lt;/DIV&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1986806-742279333792100046?l=flyingsheep.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://flyingsheep.blogspot.com/feeds/742279333792100046/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1986806&amp;postID=742279333792100046&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/742279333792100046'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/742279333792100046'/><link rel='alternate' type='text/html' href='http://flyingsheep.blogspot.com/2007/06/housecleaning.html' title='Housecleaning'/><author><name>FlyingSheep</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_uk2q-bc5eAQ/SwW62Duw1nI/AAAAAAAAAAM/6CGYucwKJaA/S220/dsc_6061.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1986806.post-5148351682234407412</id><published>2007-06-09T09:45:00.000-04:00</published><updated>2007-06-09T09:55:59.078-04:00</updated><title type='text'>Finally Taking stuff away</title><content type='html'>&lt;DIV&gt;&lt;STRONG&gt;Distractions&lt;/STRONG&gt;&lt;BR&gt;&amp;nbsp;Well, I had to downgrade my system  just now. My monitor (after at least seven years of faithful service) died.  Fortunately, I had a spare in the basement. Unfortunately, the spare is tiny in  comparison. Good enough for a little while, but it's pushing me towards getting  a new system altogether. A moment to check email and put on a CD (Dinah  Washington), and we're ready to start.  &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;testStageManagerTakesUkelele&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;One more layer of  indirection. Showing the Ukulele to the stage manager makes him take it. Third  time's the charm. &lt;BR&gt;&amp;nbsp;I'll need to add an output of effects to  AskAboutItem(). That causes a previous test to fail (signatures don't match).  Pass a null object in that test, and it passes. Now to check to make sure that  the Effect is being returned properly. Error, hmm.. Ah, I didn't swapped the  Ukulele item with the "Take Ukulele" effect. Fixed. Ok, progress, but the  StageManager doesn't have the correct response yet. Time to tweak  SetupCreateStageManager. I made a few changes to make everything flow correctly,  let's see if it works. Nope - object expected error. Tracking...Well, I can't  see any place that should call this function without an object, so I'll put in  some defensive code. At least I can still expect the test that's causing this  behavior to error. &lt;BR&gt;&amp;nbsp;Hmm... the only test that is failing is  testStageManagerTakesUkelele, so I know that&amp;nbsp; the problem is there  somewhere - ah ha! I'm trying to use the effect in a setup routine, but I  haven't created the effect yet. More temporal dependencies in my setup routine.  &lt;BR&gt;&amp;nbsp;I'm beating a dead horse here, but without these tests, how would I  know that I can do the required re-ordering (specifically, creating the Ukulele  effect before the Stage Manager) without breaking something else? This way, I  will know if my tests pass immediately. Of course, this does rely on my creating  the correct tests, but it's better than the alternatives (i.e. scanning all the  code, just crossing my fingers, or coding around the dependency). &lt;BR&gt;&amp;nbsp;Ok,  no more runtime error (and I haven't broken anything else). Time to apply the  effect to poor homer. Ok. all tests pass, but I'm not looking too closely. To do  that, I need to expose a method from the Character object that will prove that  the character doesn't have the item.  &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;testCreateTakeUkeleleEffect&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;Instead of  creating a new test, I can bolster this existing test. Actually, there's also a  test to show that a character successfully got an item. Let's revisit  testGiveHomerABook. Ok, updated. Now I've also updated  testStageManagerTakesUkelele, and it finally passes.  &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Success&lt;/STRONG&gt;&lt;BR&gt;&amp;nbsp;Well, it took three sessions, but I  finally managed to enrage the Stage manager by showing him my ukulele, at which  point he grabs it away from me, and I'm left ukeleleless. &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Next  steps? &lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;Now I need to enhance the Stage manager so that he can  react to Abilities, not just items. Then I can show the stage manager that I can  play the Ukelele, and he'll reward me with a Stage Pass. That's for next time.  For now, I'm off to bake a lasagna. &lt;BR&gt;&lt;/DIV&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1986806-5148351682234407412?l=flyingsheep.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://flyingsheep.blogspot.com/feeds/5148351682234407412/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1986806&amp;postID=5148351682234407412&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/5148351682234407412'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/5148351682234407412'/><link rel='alternate' type='text/html' href='http://flyingsheep.blogspot.com/2007/06/finally-taking-stuff-away.html' title='Finally Taking stuff away'/><author><name>FlyingSheep</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_uk2q-bc5eAQ/SwW62Duw1nI/AAAAAAAAAAM/6CGYucwKJaA/S220/dsc_6061.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1986806.post-3797301298777256892</id><published>2007-05-29T20:26:00.000-04:00</published><updated>2007-05-29T20:40:27.570-04:00</updated><title type='text'>progress?</title><content type='html'>&lt;DIV&gt;Let's get right to it.  &lt;STRONG&gt;testStageManagerTakesUkelele&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;One more layer of  indirection. Showing the Ukelele to the stage manager makes him take it. I'll  start there. &lt;BR&gt;&amp;nbsp;Ok, now I need to back up a bit.  &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;testAddResponseEffectToScriptLine&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;This is the  lowest level, first I need to create a script Line object that includes a  response that is an effect. I should rename Response to ResponseText (so that I  can also create a ResponseEffect). Copy/Paste/Test for internal member, no  problem. Copy/paste/Test for property - got an error (reference in another  file). Tracked down, fixed. &lt;BR&gt;&amp;nbsp;Now adding ResponseEffect. Test, passes.  Now to create the test that will use this feature  (testAddResponseEffectToScriptLine). Ok, empty test, set to fail. &lt;BR&gt;&amp;nbsp;It  occurs to me that I don't have an example effect to use in arrParameters. I'll  add one first (I will be three failing tests "deep"). I could write failing  tests all day (:  &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;testCreateTakeUkeleleEffect&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;This one first.  Creating setup function...Done. Added to main setup rountine. Updated  testCreateTakeUkeleleEffect, done. Excellent. Next  test...&lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;testAddResponseEffectToScriptLine&lt;/STRONG&gt;&lt;BR&gt;&amp;nbsp;With  the effect already created, this should be easy. Well, it would have been if I  had created a debugPrint method for verification. Doing so now... It's not too  bad, just describe each of the memeber fields. I'm getting a really odd error,  though, so Let's just cut out the debug print function for now. . .Nope, that  wasn't it. &lt;BR&gt;&amp;nbsp;I finally tracked it down to an error in the test. I simply  wasn't looking in the right place. That took longer than expected, but I'm  finally back to only one failing test -  &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;testStageManagerTakesUkelele&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;Which is the one  I started with, and will start with next time. &lt;BR&gt;&lt;/DIV&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1986806-3797301298777256892?l=flyingsheep.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://flyingsheep.blogspot.com/feeds/3797301298777256892/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1986806&amp;postID=3797301298777256892&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/3797301298777256892'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/3797301298777256892'/><link rel='alternate' type='text/html' href='http://flyingsheep.blogspot.com/2007/05/progress.html' title='progress?'/><author><name>FlyingSheep</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_uk2q-bc5eAQ/SwW62Duw1nI/AAAAAAAAAAM/6CGYucwKJaA/S220/dsc_6061.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1986806.post-3296998901872712088</id><published>2007-05-26T08:02:00.000-04:00</published><updated>2007-05-26T08:13:06.536-04:00</updated><title type='text'>tests</title><content type='html'>&lt;DIV&gt;&lt;STRONG&gt;New Effect&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;Ok, I'm going to try to create all the  intermediate tests this time. My goal is to eventually test showing the stage  manager my ukulele and having the stage manager take the ukulele away. I'll  start with a new effect that removes an item from the character.  &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;testTakeItemEffect&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;I'm going along pretty  well, but I've found two refactorings that I'd like to do. While neither of them  are worth getting distracted for, I'll list them here and do them next. Along  the way, I've also implemented objCharacter.RemoveItem(). &lt;BR&gt;&amp;nbsp;Hmm... Not  working yet. I'll need to make the DebugPrint method on objCharacter aware of  the items the character has, to help show what's going wrong. &lt;BR&gt;&amp;nbsp;Ah, I  didn't do my tests incrementally enough. I simplify this test to call  objCharacter.RemoveItem(...) directly. That works. So that narrows it down  significantly. Ok, this test (like most tests, really) is worth keeping. I'll  rename it to "testTakeUkeleleFromHomer". &lt;BR&gt;&amp;nbsp;Ok, this is telling me that  the values aren't being set correctly. In fact, "This effect modifies the  statistic () by an increment of ." shows me that it's being set as a Statistic  Modifying effect, not an Item Removing effect. Easily fixed... and easily  proven. Now, to the refactorings. &lt;BR&gt;&lt;BR&gt;Rename SetAsIncreaseStatisticEffect to  SetAsStatisticModifierEffect&lt;BR&gt;&amp;nbsp;I want this effect to be used both for  increasing and decreasing statistics. With test driven development, I can copy,  paste, and test. Without, I'd have to resort to copy, paste, and pray.  &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Rename &amp;lt;foo&amp;gt;IDEffected&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;Another pet peeve  - (a) I like the ID to be at then end of the variable name, and (b) I'm dismayed  that I lost track of the difference between the verb affect, the noun effect,  and the gerund affected. Copy, paste, test. All Tests Pass (:  &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;testStageManagerTakesUkelele&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;One more layer of  indirection. Showing the Ukulele to the stage manager makes him take it. I'll  start there next time.&lt;/DIV&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1986806-3296998901872712088?l=flyingsheep.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://flyingsheep.blogspot.com/feeds/3296998901872712088/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1986806&amp;postID=3296998901872712088&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/3296998901872712088'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/3296998901872712088'/><link rel='alternate' type='text/html' href='http://flyingsheep.blogspot.com/2007/05/tests.html' title='tests'/><author><name>FlyingSheep</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_uk2q-bc5eAQ/SwW62Duw1nI/AAAAAAAAAAM/6CGYucwKJaA/S220/dsc_6061.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1986806.post-646810365760394011</id><published>2007-05-17T07:56:00.000-04:00</published><updated>2007-05-17T08:06:18.389-04:00</updated><title type='text'>Conversations about Ukeleles</title><content type='html'>&lt;DIV&gt;&lt;STRONG&gt;Paper session&lt;/STRONG&gt;&lt;BR&gt;&amp;nbsp;Well, that was a useful design  session. I've got all sorts of new ideas for things I want to implement. The  only downside is that there's a lot of work yet to be done. Things like NPCs  (non-player characters), conversations, Objectives, Rooms, etc. etc.  &lt;BR&gt;&amp;nbsp;I've got a simple story that I'm going to work on for these examples.  Over the next few (or, more likely, many) sessions, I'll work towards completing  this mini-game. This example was inspired by my father-in-law's fondness of  Hawaiian instruments. &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Story&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;You're at a  Ukulele Noir concert and you have to convince the Stage Manager (named "Mike")  to let you play. &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Acronyms and Abbreviations&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;I  want to create a new class called NPC. I dislike using abbreviations in my code,  as it's too small a gain (less typing) at two high a cost (confusion between  "GetStats" or "GetStatistics" or other variations). I think CNonPlayerCharacter  seems like a better option. &lt;BR&gt;&amp;nbsp;Each NPC will have standard responses to  three queries (from the Ultima series): "Name?", "Job?", and "Health?". They  will also have an array of options for responses to Items and Abilities. I'll  implement the standard three first, and then work on the more complex responses.  &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Test First!&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;Ok, for the simple case, I need  just one test: testAskStageManagerAboutBasicInfo. I've created the (empty) test  and it passes. Now to make the test actually do something.  &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Shared Stage Manager&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;By the way, I'm pretty  sure that I'm going to want to add this stage manager NPC to the global  parameters array. But I don't need it yet, so I'll code it inline for this first  test and then extract it later. &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Basic  Info&lt;/STRONG&gt;&lt;BR&gt;&amp;nbsp;Test fails as CNonPlayerCharacter is not defined.  Defining it now... passes. Adding Name... fails, as the name isn't set yet. I  need an Initialize(strName) function. I'm going to be a little forward-looking  and define it as Initialize(strName, strJob, strHealth). I'll just ignore the  other parameters until I've implemented them. &lt;BR&gt;&amp;nbsp;I also need a  constructor to populate default values. &lt;BR&gt;&amp;nbsp;Ah good - now the test is  failing because the default value for Name doesn't match the expected value.  &lt;BR&gt;&amp;nbsp;Excellent, now the basic test for Name passes. I'll do the same for  Job and Health. Unless anything interesting happens, I'll just say  "Done"...Syntax error - nuts. &lt;BR&gt;&amp;nbsp;Now, this is bizzare. The same test  appears as passed in the detail view, but failed in the summary view. Ah, my  logic for doing all three AssertStringsMatch test is to concatenate them instead  of using a logic And. So the value is actually "truetruetrue". Clearly the  detail view is looking for "not false", and the summary view is looking for  "true". I'm torn between making both views consistent (which they should be),  and leaving them as is (which would help to triangulate odd return values like  "truetruetrue"). Laziness wins, I'll leave them as they are, and fix the test so  that it really passes for real. &lt;BR&gt;&amp;nbsp;Test passes, but it just tests Name  three times - changing it to test each of the basic information fields. And it  still passes. Excellent. &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Conversation&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;Now I  want to make the stage manager respond to various prompts. Each prompt can  either be an item, an "inherent" (e.g. not item-based) ability, or an item-based  ability. It might also be cool to prompt the NPC with a statistic (e.g. "Look at  how strong I am!"), but that's going on to the to-do list. &lt;BR&gt;&amp;nbsp;Simple test  first: testAskStageManagerAboutUkelele, but before I can do that, there's a  problem I need to solve.&lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;ItemID&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;Interestingly  enough, items do not have IDs yet (just Names). As I don't want to compare  strings for identification, I'll have to add this first. Which means creating an  ItemFactory (or, in my nomenclature, a CanonicalItems object). Let's see if I  can make this change without breaking any tests. &lt;BR&gt;&amp;nbsp; &lt;BR&gt;&lt;STRONG&gt;Create  CanonicalItems&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;This is mostly a copy/paste of  CanonicalAbilities. I may need to generalize CanonicalContainer. Again, added to  the ToDo list. &lt;BR&gt;&amp;nbsp;Ok, I've created CanonicalItems, but I haven't put any  references to it anywhere yet. Let's just make sure it compiles. Ok, no obvious  errors. &lt;BR&gt;&amp;nbsp;Now, for each item, I want to put the item in the Canonical  list, and then delegate any creation of that item to the new CanonicalItems  object. Odd - I only find one. &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Item: "Book of  Knowledge"&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;First thing to note (feel like we're going down  into a rat's nest?) is that I create this book in two places -  SetupCreateBookOfKnowledge and testCreateBook. I need to first finish  SetupCreateBookOfKnowledge (adding the book to the arrParameters list) and then  make testCreateBook use the object from arrParameters. Then I'll only have one  object creation to change. This is a sub-refactoring (: &lt;BR&gt;&amp;nbsp;Oh, hey,  SetupCreateBookOfKnowledge already does the right thing. No changes there for  this step, it's finished already. Just remains to repoint testCreateBook to use  the passed-in book. Two paragraphs of description for two lines of code  changes... and tests pass. (: Back up a level to moving the item creation to the  CanonicalItems object. &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Create Canonical Book of  Knowledge&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;Ok, I've updated the setup function, which should  now fail (as the book isn't initialized). It fails a little harder than I would  have liked (with Runtime error), but I'll ignore that for now, and make it pass.  &lt;BR&gt;&amp;nbsp;Boundary error...fixed... Didn't add ItemID to CItem (which is, after  all, the entire point of this exercise). I would, if I could, make Set ItemID a  package-level property, as I only want the canonical container to set it, but I  don't have that option in this language (which is a recurring theme,  unfortunately). Anyways, that's fixed, and all tests pass. Phew, now I can use  ItemID when setting up conversational responses for the StageManager.  &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Ukelele&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;First, let's create a Ukelele for us  to discuss. I'll create a test for it, which is simply a slightly modified copy  of testCreateBook. &lt;BR&gt;&amp;nbsp;I made a bunch of changes. Let's see if they  work...Nope, found another boundary error (which only occurs when there is more  than 1 item). Fixed...Oops, copy/paste error. Fixed... All tests pass, but I  didn't include the new testCreateUkelele. Adding...All tests pass.  &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;More subrefactorings&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;Now I can actually start  writing testAskStageManagerAboutUkelele, right? No. The first thing I'm going  this test to do is create another stage manager. But I've already done that in  testAskStageManagerAboutBasicInfo. So I've got to extract that into  SetupCreateStageManager() and add it to arrParameters. &lt;BR&gt;&amp;nbsp;Step One:  extract to SetupCreateStageManager. Done... tests pass (except for  testAskStageManagerAboutUkelele, which isn't written yet). &lt;BR&gt;&amp;nbsp;Step Two:  make testAskStageManagerAboutBasicInfo use the StageManager in arrParameters().  Done. There's some duplication of values between the setup (which needs to set  the values) and the test (which needs to check for them), but that's okay for  now. &lt;BR&gt;&amp;nbsp;Step Three: Make testAskStageManagerAboutUkelele use the new  StageManager. &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;testAskStageManagerAboutUkelele  &lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;The test is currently failing. I need to decide on a name for  the object that contains the PromptItemID and the NPC's response. I think this  collection in the NPC class can be called Script[], but what should the  individual lines be? ScriptLine? ScriptDialogue? I'll go with ScriptLine for  now, but may want to rename it later. (Ah, the freedom of refactoring).  &lt;BR&gt;&amp;nbsp;Ok, I've created a ScriptLine object, and now I need to create the  collection inside the NPC, and add a response for Ukelele. Phew! I bet I'm  missing some intermediate tests. &lt;BR&gt;&amp;nbsp;Well, let's see what breaks... OK, no  new errors. Great. &lt;BR&gt;&amp;nbsp;Now I need to give the stage manager a script line  for the Ukelele. I'll have to pass the Ukelele's ItemID to the setup function. I  could pass the entire arrParameters, but I want to make this dependancy  explicit. &lt;BR&gt;&amp;nbsp;Ok, test should pass now - I didn't make a method public.  Fixed... test fails, ah yes, I need to implement AskAboutItem.  Implemented..Switched Index for Response..All tests pass. &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Phew!  &lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;That's a lot for today. Next steps include beefing up  CScriptLine to suppose inquiries by AbilityID combined with ItemID, and then  flushing those changes through all the functions I added  today.&lt;/DIV&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1986806-646810365760394011?l=flyingsheep.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://flyingsheep.blogspot.com/feeds/646810365760394011/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1986806&amp;postID=646810365760394011&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/646810365760394011'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/646810365760394011'/><link rel='alternate' type='text/html' href='http://flyingsheep.blogspot.com/2007/05/conversations-about-ukeleles.html' title='Conversations about Ukeleles'/><author><name>FlyingSheep</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_uk2q-bc5eAQ/SwW62Duw1nI/AAAAAAAAAAM/6CGYucwKJaA/S220/dsc_6061.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1986806.post-4336618454786389276</id><published>2007-05-05T07:44:00.000-04:00</published><updated>2007-05-05T07:53:48.657-04:00</updated><title type='text'>Paper design</title><content type='html'>&lt;DIV&gt;&lt;STRONG&gt;UI stuff&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;More UI stuff today. Might not be worth  blogging about. &lt;BR&gt;&lt;BR&gt;&amp;nbsp;I had to change the statistic class to include a  name field. I'm making the same change the Ability class. I'm surprised that  there are only two places to change.  &lt;BR&gt;&lt;BR&gt;testCanonicalAbilitiesReturnsTestAbility&lt;BR&gt;&amp;nbsp;This function is  failing again. I don't think it's still useful, and I don't like the way it does  its test (comparing against a hardcoded string), so I'm going to delete it.  &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Game design&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;I actually need to do a little  game design before I can progress further. I'm going to write a simple game that  requires getting an item and using it to win the game. This should point me in  the right direction for example abilities, items, rooms, and obstacles that I  need to progress. &lt;BR&gt;&amp;nbsp;&lt;BR&gt;Sorry for the short blog.&amp;nbsp; If it helps, the  next one will be considerably longer.&lt;/DIV&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1986806-4336618454786389276?l=flyingsheep.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://flyingsheep.blogspot.com/feeds/4336618454786389276/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1986806&amp;postID=4336618454786389276&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/4336618454786389276'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/4336618454786389276'/><link rel='alternate' type='text/html' href='http://flyingsheep.blogspot.com/2007/05/paper-design.html' title='Paper design'/><author><name>FlyingSheep</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_uk2q-bc5eAQ/SwW62Duw1nI/AAAAAAAAAAM/6CGYucwKJaA/S220/dsc_6061.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1986806.post-1568237765413408217</id><published>2007-04-29T20:31:00.000-04:00</published><updated>2007-04-29T20:41:31.397-04:00</updated><title type='text'>Game On!</title><content type='html'>&lt;DIV&gt;&lt;STRONG&gt;Game On. &lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;Now to create the game page. I'll  sketch it out on paper first, see where I want to lay things out. Hmm... the  page is basically broken into three parts - one specific to the character (and  the actions available), one section shows the current obstacle (usually a  creature), and the third section underneath shows the results of the last  action. &lt;BR&gt;&amp;nbsp;I have most of the left side implemented, but not Obstacles or  Rooms yet. It's reasonable to suggest that I might be better server implementing  those before worrying about the presentation layer. However, I feel like  tinkering with UI, so here I go.  &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;DisplayCharaterStats&lt;/STRONG&gt;&lt;BR&gt;&amp;nbsp;I'm having a little  difficulty with this function, so I'm going to create a test for it. There  that's better. &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;UI stuff&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;Sorry, not a lot of  code today, mostly just struggling with CSS and various other trivial tasks. Not  very interesting to read about, I'm afraid. &lt;BR&gt;&lt;/DIV&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1986806-1568237765413408217?l=flyingsheep.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://flyingsheep.blogspot.com/feeds/1568237765413408217/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1986806&amp;postID=1568237765413408217&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/1568237765413408217'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/1568237765413408217'/><link rel='alternate' type='text/html' href='http://flyingsheep.blogspot.com/2007/04/game-on.html' title='Game On!'/><author><name>FlyingSheep</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_uk2q-bc5eAQ/SwW62Duw1nI/AAAAAAAAAAM/6CGYucwKJaA/S220/dsc_6061.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1986806.post-2732013534976283884</id><published>2007-04-21T10:29:00.000-04:00</published><updated>2007-04-21T10:38:46.724-04:00</updated><title type='text'>Better tests</title><content type='html'>&lt;DIV&gt;&lt;STRONG&gt;Fixing tests&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;As mentioned earlier, many of my  tests aren't as specific as they could be. The tests check to make sure that  something has changed, but not necessarily what. I'm going to fix that now.  &lt;BR&gt;&amp;nbsp;First, I need an easier way to get the value of a Character's  statistic, as that's what I want to compare most of the time. I've added a  member function FindStatisticValueByName(strName) to the Character class. I can  make use of this function in the sibling method UseAbility. &lt;BR&gt;&amp;nbsp;Ah good.  All the passing tests prove that I've made this change without breaking  anything. &lt;BR&gt;&amp;nbsp;Note that the functions that test to ensure that the object  hasn't changed don't need to be fixed yet. However, comparing the output of  DebugPrint isn't quite ideal. It would be better to add an  Equals(objOtherObject). But that's for another refactoring session.  &lt;BR&gt;&amp;nbsp;The comments below are the results that each test displays. The "12 is  the same as 12" is the output from the call to assert (observed value ==  expected value). &lt;BR&gt;&lt;BR&gt;TestJoeReadingABookMakesHimSmarter&lt;BR&gt;&amp;nbsp;Joe read  the book. Good. His intelligence was 11 and should now be 12. 12 is the same as  12. Done.&lt;BR&gt;&lt;BR&gt;testIndirectlyMakingHomerSmarter&lt;BR&gt;&amp;nbsp;Homer's intelligence  was 3. 4 is the same as 4.&lt;BR&gt;&lt;BR&gt;testIndirectlyMakingLisaDumber&lt;BR&gt;&amp;nbsp;Whoops  - failed the first time, I was copying and pasting the "smarter" code, not the  "dumber" code. Easy fix. Lisa's starting Intelligence is 18. 17 is the same as  17.&lt;BR&gt;&lt;BR&gt;testMakingHomerSmarter&lt;BR&gt;&amp;nbsp;Homer's starting intelligence is 3. 4  is the same as 4. One more to go. &lt;BR&gt;&lt;BR&gt;testMakingLisaDumber&lt;BR&gt;&amp;nbsp;Syntax  error. Then, with simple elegance, 17 is the same as 17.&lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;ToDo  list--&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;I get to take that off of my todo list as a reward.  What next? Well, I think the big question is: Do I have enough scaffolding to  start to create game logic? And, if so, how do I organize my files to make  things as easy as possible? &lt;BR&gt;&amp;nbsp;I know that, eventually, I want to take  all of my objects and put them into their own files. But, it's really convienent  (read: Intellisense works) when the object definitions are inline. I think I'd  like to have a shared file (include\shared.asp?) that I can use for both the  test page, and the final game page. Then I can add two "dumb" presentation  pages, one for test.asp, and the other for game.asp. &lt;BR&gt;&amp;nbsp;Essentially, I'm  doing an Extract File refactoring (: &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Moving  Code&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;I'm moving one block at a time and resting. Constants...  done. Test Functions...done. Classes .... done. Great. &lt;BR&gt;&amp;nbsp;What about  include files? Not needed by game.asp, so it stays in test.asp.  &lt;BR&gt;&amp;nbsp;TestAll? Not needed by game.asp, so it stays in test.asp.  &lt;BR&gt;&amp;nbsp;So, I'll have a temporary area at the top of shared.asp for whatever  I'm currently working on. Once I'm happy with that code, it gets moved (usually  to successful_tests.asp). Game-specific code (or test-specific code) should get  relegated to separate files. &lt;BR&gt;&amp;nbsp;One concern, of course, is how do I test  the stuff that's only in game.asp? Or, is it acceptible to have presentation  code that is not under test? For now, I think it's okay to keep "dumb"  presentation logic untested. I hope I don't have to eat those words later.  &lt;/DIV&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1986806-2732013534976283884?l=flyingsheep.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://flyingsheep.blogspot.com/feeds/2732013534976283884/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1986806&amp;postID=2732013534976283884&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/2732013534976283884'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/2732013534976283884'/><link rel='alternate' type='text/html' href='http://flyingsheep.blogspot.com/2007/04/better-tests.html' title='Better tests'/><author><name>FlyingSheep</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_uk2q-bc5eAQ/SwW62Duw1nI/AAAAAAAAAAM/6CGYucwKJaA/S220/dsc_6061.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1986806.post-805143620905513942</id><published>2007-04-15T13:38:00.000-04:00</published><updated>2007-04-15T13:47:04.077-04:00</updated><title type='text'>Confessions</title><content type='html'>&lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;STRONG&gt;Last Three Weeks&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;I have a  confession to make. I haven't done any coding on this project for the last three  weeks. It all started with the Magic Grand Prix weekend last month. I decided to  take a (somewhat scary) risk and offer to judge for the event. It was a large  step up from any event I had judged in the last few years. Needless to say, I  was terrified, but it went well. &lt;BR&gt;&amp;nbsp;However, it was also exhausting. I  worked the equivalent of a 40 hour week in three days, and then went right back  to my regular job. The following week was Easter which entailed visiting (and  being visited by) various relatives. Of course, this was very enjoyable  (including getting to see Commander Cody live), but didn't leave me any time to  recover. &lt;BR&gt;&amp;nbsp;Finally, this week, it caught up with me. I slept almost all  of Thursday, which helped, but I also needed to work on Saturday (which set me  back again). It's Sunday now, and I'm preparing to entertain a friend from out  of state tonight. Madness, I tell you (: Of course, other than being ill, I  wouldn't have it any other way. &lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;STRONG&gt;Confused? &lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;You might be,  as through these last weeks, you've seen occasional updates and other signs of  progress. Well, I have another confession - this project (WikiDungeon) is not  quite being blogged in real-time. I'm a few sessions ahead (about 20 - even with  this three week slip), so I can parcel out updates even when life gets in the  way. Part of my solution to the content problem, you see. &lt;BR&gt;&lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;Nothing else to confess so far. Stay tuned (:  &lt;/DIV&gt;&lt;/FONT&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1986806-805143620905513942?l=flyingsheep.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://flyingsheep.blogspot.com/feeds/805143620905513942/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1986806&amp;postID=805143620905513942&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/805143620905513942'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/805143620905513942'/><link rel='alternate' type='text/html' href='http://flyingsheep.blogspot.com/2007/04/confessions.html' title='Confessions'/><author><name>FlyingSheep</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_uk2q-bc5eAQ/SwW62Duw1nI/AAAAAAAAAAM/6CGYucwKJaA/S220/dsc_6061.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1986806.post-7451802361548815385</id><published>2007-04-10T07:09:00.000-04:00</published><updated>2007-04-10T07:18:17.909-04:00</updated><title type='text'>Books</title><content type='html'>&lt;DIV&gt;&lt;STRONG&gt;Two failing  tests&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;testCanonicalAbilitiesReturnsTestAbility and  TestLisaReadingABookHasNoEffect. In each case, I have a choice, either to remove  the test or fix it.  &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;testCanonicalAbilitiesReturnsTestAbility&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;This  can probably be removed, but for now, it's easy enough to fix it. I was using a  variable for two different purposes, which is easily remedied. A few tweaks, and  it's passing.  &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;TestLisaReadingABookHasNoEffect&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;Ok, the  problem here was the test only checked to see if any effects were returned. In  this case, we want the effect to be returned, but we don't want it to do  anything to Lisa (who is already at max intelligence). Fixed the test (to really  test for what we wanted), and it passes. Joe's test (was named  TestJoeReadingABookHasNoEffect, which I've fixed to be  TestJoeReadingABookMakesHimSmarter) also passes. &lt;BR&gt;&amp;nbsp;I'm being a little  lazy in how I test. I'm checking to make sure that a character has changed, but  not looking too deeply into what has changed (in this case, it should be  intelligence). I'll add this to my refactorings (along with a general test audit  for relevance). &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;All tests pass, now what? &lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;The  fork in the road ahead is refactoring or adding functionality. No significant  smells (not completely oderless, of course), so I'm leaning towards  functionality. &lt;BR&gt;&amp;nbsp;So far, I have Charcters (Homer, Lisa, Joe), Statistics  (Strength, Intelligence), Abilities (Read Book), and Effects(Increase  Statistic). The next thing I want to add is Items (Book). The general idea is  that you can't read a book without actually having the book in your hands. There  are a few ways to implement this. &lt;BR&gt;&amp;nbsp;One way: When a character gets an  item, they also get the associated Abilities. When the item is removed, those  abilities should also be removed. Hmm... well, only if there aren't any other  items that also use those same abilities. That's a lot of synchronization.  &lt;BR&gt;&amp;nbsp;Another way: Make the abilities part of the item. That is, the  character may have some intrinsic abilities (e.g. "Smile") that do not require  any items. Additionally, each item may have some abilities (e.g. Book."Read")  that they grant to the user. I like this way better. &lt;BR&gt;&amp;nbsp;I'll start with a  simple test, testGiveHomerABook. Hmm... Actually, I'll start with a simpler test  - testCreateBook. Ok, both tests fail, time to starting writing.  &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;CItem&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;First, create a new class of Item. Ok,  that makes this test pass. I feel like I'm going to want to use this book quite  a bit, so I'm going to add it to my global list of parameters. Not really  global, just passed to each function. Done.  &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Character.GiveItem&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;Now to implement this  function. It's another array of objects, should be straightforward. Done, and  tests pass. &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Adding Abilities to Book. &lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;My  setup function should add an ability (and the associated effect) to the book.  This is going to be a little complicated, so first I'm going to extract  SetupCreateBookOfKnowledge() as a sub-method of SetupTests.  &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Comments&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;One of the (many) things that  resonated with me from Fowler's Refactoring book is his opinion on code  comments. Comments smell nice, but they are usualy used as a deoderant to cover  up some other smell. Instead of adding a comment, remove the smell. &lt;BR&gt;&amp;nbsp;My  setupTest functions has a few comments for blocks of code that create Homer,  Lisa, and Joe. Each of those can be extracted into a single function  SetupCreateGenericCharacter(strName, lngSetAllStatisticsToThisNumber). This also  will allow me to get rid of a temporary variable. It's smelling a bit better  now. &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Joe First&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;Refactoring Joe first, and  testing...Bug(Undeclared Variable). Fixed, retesting...Everything passes. Now  for Homer...Passes. Finally Lisa...Whoa! about ten tests fail, Danger, Will  Robinson! Oh, I accidentally created another Homer. Fixed. Phew, all tests pass.  Final step, cleaning up unused variables (and redundant comments). Excellent,  tests pass. &lt;BR&gt;&amp;nbsp;That was a nice little bit of refactoring that will allow  me to add more test characters as needed. Cool. And it flowed naturally from  functionality I was adding. &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Back to Books&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;Ok,  now I'm moving this SetupCreateBookOfKnowledge function to my main test page to  take advantage of Intellisense. I've improved the book by adding an ability.  However, I don't have any tests that reflect that, so I don't really know if  it's working (even though all tests are written). I, once again, failed to write  tests first. &lt;/DIV&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1986806-7451802361548815385?l=flyingsheep.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://flyingsheep.blogspot.com/feeds/7451802361548815385/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1986806&amp;postID=7451802361548815385&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/7451802361548815385'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/7451802361548815385'/><link rel='alternate' type='text/html' href='http://flyingsheep.blogspot.com/2007/04/books.html' title='Books'/><author><name>FlyingSheep</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_uk2q-bc5eAQ/SwW62Duw1nI/AAAAAAAAAAM/6CGYucwKJaA/S220/dsc_6061.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1986806.post-8610598003800176689</id><published>2007-04-04T17:00:00.000-04:00</published><updated>2007-04-04T17:09:33.221-04:00</updated><title type='text'>Gaming</title><content type='html'>&lt;DIV&gt;&lt;STRONG&gt;Tie together&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;So, last time I starting with  affecting the Character directly, then proceeded to affecting the Character  through an Effect. Now I'm going to make the effect a result of an ability  (success or failure). I need a story help me figure out the  abilities.&lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Story &lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;Actually, I've got the story  I need. Reading a book (useAbility("ReadBook")) makes people smarter  (IncreaseStatistic("Intelligence", 1)). Homer can't read, so this doesn't affect  him. Lisa can't get any smarter, so it doesn't affect her, either. I need a new  character - someone averge. I'll call him Average Joe. &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Add  Joe&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;Adding Joe to setup. Oops - I accidentally deleted a line  that Lisa needed. Fortunately, I was able to find it immediately, as all of my  Lisa-related tests failed. &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Gaming&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;There's a  saying that if you want to improve how you play a game, you should keep track of  your mistakes (say, by incrementing on a 20-sided die) each time you realize you  made a mistake. If I kept track of my little mistakes, I might be able to  prevent them. But, more importantly, I would be a little less cavalier about  testing. These tests help to instill humility (: &lt;/DIV&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1986806-8610598003800176689?l=flyingsheep.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://flyingsheep.blogspot.com/feeds/8610598003800176689/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1986806&amp;postID=8610598003800176689&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/8610598003800176689'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/8610598003800176689'/><link rel='alternate' type='text/html' href='http://flyingsheep.blogspot.com/2007/04/gaming.html' title='Gaming'/><author><name>FlyingSheep</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_uk2q-bc5eAQ/SwW62Duw1nI/AAAAAAAAAAM/6CGYucwKJaA/S220/dsc_6061.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1986806.post-524434761664360091</id><published>2007-04-02T21:36:00.000-04:00</published><updated>2007-04-02T20:45:05.586-04:00</updated><title type='text'>Layers of Indirection</title><content type='html'>&lt;DIV&gt;&lt;STRONG&gt;Real Effect&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;Ok, time to create my first  non-trivial effect. I want to change the statistic on one of the characters.  First, I'll write a few tests for boundary conditions.  &lt;BR&gt;&lt;BR&gt;testMakingLisaSmarterHasNoEffect&lt;BR&gt;testMakingHomerDumberHasNoEffect&lt;BR&gt;&lt;BR&gt;testMakingLisaDumber&lt;BR&gt;testMakingHomerSmarter&lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Can't  Make Lisa Smarter&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;This fails because the method  IncreaseStatistic doesn't exist yet. Writing an empty version now. Great, it  passes. &lt;BR&gt;&amp;nbsp;&lt;BR&gt;&lt;STRONG&gt;Can't Make Homer Dumber&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;This  test should run as soon as I create it. Interestingly enough, I make a few  mistakes in creating the test, so the result isn't what I expect, but they are  easily fixed (when detected at this point). &lt;BR&gt;&amp;nbsp;Context switching is  difficult. Catching errors early means that you don't have to context switch.  With these tests, I'm catching bugs when it's cheapest to fix them.  &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Making Lisa Dumber&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;Creating failing test  first. Now making it pass.  &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Whoops&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;Interestingly, I decide to make this  test AND the other tests that I have in mind pass. I bit off more than I could  chew, however, and now I have to debug. Which I do.&lt;BR&gt;&amp;nbsp;Oh, now I've found  another problem - the tests are not independant. That is, if I make Lisa dumber  in one test, she stays a little dumber in the next test. This is a big problem,  which I thought I had solved by passing a copy of the array of parameters (not  the array itself). Let me try a few simple things to fix this. First, moving  SetupTest and TearDownTest into RunGenericTest. &lt;BR&gt;&amp;nbsp;Ok, I've fixed that,  but now I need to remove a parameter from RunGenericTests, which has been copied  many times. I think I should take advantage of this opporunity to reduce some  copy/paste smell. &lt;BR&gt;&amp;nbsp;Ok, I've refactored a bit, so now I can remove the  parameter from one call of RunGenericTest (instead of many). Excellent. Simple  change. Now to clean up a bit, and not create the parameters array (or call  SetupTest/TearDownTest) in the TestAll main function. &lt;BR&gt;&amp;nbsp;Easily  accomplished. &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;testMakingHomerSmarter&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;Ok, one  more test. I'm pretty sure that it will pass now, but this will help me make  sure that it always works. &lt;BR&gt;&amp;nbsp;Quickly and easily done.  &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Indirection&lt;/STRONG&gt;&lt;BR&gt;&amp;nbsp;These tests all work because they  affect the character directly. My next tests will use an Effect object (with a  new type) to change (or not change) the character's intelligence. That is,  replace&lt;BR&gt;&amp;nbsp;OLD CODE&lt;BR&gt;Call objLisa.IncreaseStatistic(lngIntelligenceID,  1)&lt;BR&gt;&lt;BR&gt;&amp;nbsp;with NEW CODE&lt;BR&gt;Set objEffect = new CEffect&lt;BR&gt;Call  objEffect.SetAsIncreaseStatisticEffect(lngIntelligenceID, 1)&lt;BR&gt;Call  objEffect.ApplyToCharacter(objLisa)&lt;BR&gt;Set objEffect = Nothing&lt;BR&gt;&lt;BR&gt;&amp;nbsp;I  see four more tests:  &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;testIndirectlyMakingLisaSmarterHasNoEffect&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;Written,  fails because I haven't written the supporting methods yet. I'll write them now  as empty. Passed. I'm done with this test.  &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;testIndirectlyMakingHomerDumberHasNoEffect&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;Written,  should have passed first time, but didn't (I didn't update the function name.  Should have passed second time, but didn't (I neglected to declare a variable).  Interesting, as running the tests felt like a waste of time (see Devil) because  I logically knew that the test would pass. I didn't account for my tremendous  ability to make simple mistakes.  &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;testIndirectlyMakingLisaDumber&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;This one should  fail and make me do some work. Writing failing version now (simply copy and do  the replace listed above). Failing, now to make it work. &lt;BR&gt;&amp;nbsp;Not too bad,  just about 10 lines of code. Let's see if it works. Excellent! It does. And I  know (from my tests) that it also doesn't do anything "impossible" such as  making Homer dumber or Lisa smarter.  &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;testIndirectlyMakingHomerSmarter&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;This should  be an easy one. Whoo-hoo! It works, AND I've reached a significant milestone -  more than 25 tests, so I can see the "paging" for my results summary works. An  unexpected bonus. &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Next Step? &lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;Next step is to  add another layer of indirection. Instead of creating the Effect directly, I'll  make the effect be returned by a successful UseAbility. &lt;BR&gt;&lt;/DIV&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1986806-524434761664360091?l=flyingsheep.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://flyingsheep.blogspot.com/feeds/524434761664360091/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1986806&amp;postID=524434761664360091&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/524434761664360091'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/524434761664360091'/><link rel='alternate' type='text/html' href='http://flyingsheep.blogspot.com/2007/04/layers-of-indirection.html' title='Layers of Indirection'/><author><name>FlyingSheep</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_uk2q-bc5eAQ/SwW62Duw1nI/AAAAAAAAAAM/6CGYucwKJaA/S220/dsc_6061.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1986806.post-500476355424199127</id><published>2007-03-29T07:50:00.000-04:00</published><updated>2007-03-29T06:59:02.107-04:00</updated><title type='text'>Special Effects</title><content type='html'>&lt;DIV&gt;&lt;STRONG&gt;Heroes&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;That is, the symphony by Philip Glass  (from Bowie and Eno) that I am currently listening to. &lt;BR&gt;&amp;nbsp;Where was I? Ah  yes, the one failing test - testHittingThumbMakesHomerSayDoh. I'm going to load  success and failure effects into the test ability "Hit Thumb" and check to make  sure that the canonical Abilities object can return them.  &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Testing&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;This is much better - the tests are  leading me to small steps. I take a small failing step (such as finding the  ability), get it to pass, and then improve my test until it fails again (ok,  I've found the ability, but does it have any success effects?). &lt;BR&gt;&amp;nbsp;I'm  building a safety net as I go. &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Waste of time?  &lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;It's curious, and I think I'll be better able to express this  later, but I'm alternating between two thoughts. I suppose I have a devil on one  shoulder: &lt;BR&gt;&amp;nbsp;"Running tests at this point is a waste of time. I haven't  changed any of the tests yet because I'm not done coding. I run the tests  anyways, and feel disappointed to see that the same tests are failing (or  passing) as last time. I feel like I haven't made any pogress." &lt;BR&gt;&amp;nbsp;But,  if I ignore the little devil and run the tests anyways, and I see something that  failed, an angel appears and hark: &lt;BR&gt;&amp;nbsp;"Ye cats! I didn't realize I  introduced an error there. I just made a few simple changes - oh, I've lost the  AbilityID along the way, so now Homer can read books (e.g. that test is  failing). Let's see, ctrl-z a few dozen times, ah ha! That's it. Easily fixed.  Done."&lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Functional tests&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;Ok, I think I'm ready  to start on a functional test. I want Lisa to attempt to read a book, and I want  it to give her a new ability as a result. &lt;BR&gt;&amp;nbsp;Actually, I should finish up  the failure effects, shouldn't I? More tests...&lt;/DIV&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1986806-500476355424199127?l=flyingsheep.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://flyingsheep.blogspot.com/feeds/500476355424199127/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1986806&amp;postID=500476355424199127&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/500476355424199127'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/500476355424199127'/><link rel='alternate' type='text/html' href='http://flyingsheep.blogspot.com/2007/03/special-effects.html' title='Special Effects'/><author><name>FlyingSheep</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_uk2q-bc5eAQ/SwW62Duw1nI/AAAAAAAAAAM/6CGYucwKJaA/S220/dsc_6061.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1986806.post-739285579734384926</id><published>2007-03-27T21:12:00.000-04:00</published><updated>2007-03-27T20:20:42.743-04:00</updated><title type='text'>Effects</title><content type='html'>&lt;DIV&gt;&lt;STRONG&gt;Functionality Testing&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;I seem to be stuck,  functionality speaking. I have a few things to clean up, but no major smells.  This means I need to start making some messes. But I'm not sure how to proceed.  Which means I need to create a new test.  &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Test&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;Now that I have abilities that characters  can use (with success or failure), I need effects. One basic effect is to  increase a character's statistic. Something like  TestReadingABookMakesLisaSmarter.  &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Responsibility&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;Do I want  objCharacter.UseAbility to implement the effects of that ablity? Or do I just  want it to indicate whether it was successful (and then have another call to  implement the effects)? For now, I'll have the method return a set of effects,  and then call effect.Occur() or something. &lt;BR&gt;&amp;nbsp;This vagueness is what got  me stuck, and writing this test is helping me to proceed.  &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Ability&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;Ok, so the ability object should have  two collections - successEffects and failureEffects. I've written a bunch of  code without and tests yet, so I'll implement this in steps:&lt;BR&gt;&lt;BR&gt;1.  Successful, no effects&lt;BR&gt;3. Failure, no effects&lt;BR&gt;2. Successful, 1  effect&lt;BR&gt;4. Failure, 1 effect.&lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;No effect&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;So,  My first test should be testReadingABookDoesNOTMakeLisaSmarter. Ok, I wrote the  test, but also implemented it at the same time. I'm not letting the tests drive  yet (as I know they are going to fail, so I skip that step). I've got to improve  my habits here. &lt;BR&gt;&amp;nbsp;New test - testReadingABookDoesNOTMakeHomerSmarter.  Well, this one passes vacuously. Not so interesting. &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Another  effect&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;Now, to implement my first effect. It should be as  simple as possible - let's say returning a message to be displayed. Most effects  will do this. &lt;BR&gt;&amp;nbsp;I need to write a test first, and I need another effect.  Something like testHittingThumbMakesHomerSayDoh. Writing test now.  &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Failure Unexpected&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;Well, okay, I expected the  test to fail, but I wasn't expecting a runtime error. Checking... Ah, I wrote  the test wrong. Trying again. Ok, the test is failing for the expected reason  now. &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;More Responsibility&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;Who should set the  success or failure effect? Should it be part of the canonical ablity? I think  that's a good place to start. The canonical ability object (Ability Factory? )  should be able to produce ability objects (that, perhaps can be modified or  tweaked). That seems like a good intermediate test. I could have the  CanonicalAbility object return a test ability and make sure that it's debugPrint  matches an expected value. This would also be a good place for  AssertStringsMatch function. Ok, one thing at a time. &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Little  Detour&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;Two additional sub-tests to prove that my  AssertStringsMatch function works (it does). Yet again, tests written after code  (I've got to stop doing that). Next, test the CanonicalAbility object returning  function. &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;DebugPrint everywhere&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;To do this,  I've added debugPrint functions to abilities and effects. Along the way, I'm  making some notes indicating where I need to shuffle things around. I still  think that not using a database is making things more difficult at this point,  so I may need to add that next.&lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Cleaning up&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;At  this point, I have one non-passing test. It will have to wait, as my time is up  for now.&lt;/DIV&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1986806-739285579734384926?l=flyingsheep.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://flyingsheep.blogspot.com/feeds/739285579734384926/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1986806&amp;postID=739285579734384926&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/739285579734384926'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/739285579734384926'/><link rel='alternate' type='text/html' href='http://flyingsheep.blogspot.com/2007/03/effects.html' title='Effects'/><author><name>FlyingSheep</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_uk2q-bc5eAQ/SwW62Duw1nI/AAAAAAAAAAM/6CGYucwKJaA/S220/dsc_6061.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1986806.post-5745472865057689036</id><published>2007-03-27T20:34:00.000-04:00</published><updated>2007-03-27T20:36:02.919-04:00</updated><title type='text'></title><content type='html'>Uploaded some videos. Check them out.&lt;br /&gt;&lt;a href="http://www.youtube.com/watch?v=LS66Qxl7fVY"&gt;http://www.youtube.com/watch?v=LS66Qxl7fVY&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.youtube.com/watch?v=u8MboGAoNNI"&gt;http://www.youtube.com/watch?v=u8MboGAoNNI&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.youtube.com/watch?v=ZRpfYOJ0hpw"&gt;http://www.youtube.com/watch?v=ZRpfYOJ0hpw&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Enjoy!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1986806-5745472865057689036?l=flyingsheep.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://flyingsheep.blogspot.com/feeds/5745472865057689036/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1986806&amp;postID=5745472865057689036&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/5745472865057689036'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/5745472865057689036'/><link rel='alternate' type='text/html' href='http://flyingsheep.blogspot.com/2007/03/uploaded-some-videos.html' title=''/><author><name>FlyingSheep</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_uk2q-bc5eAQ/SwW62Duw1nI/AAAAAAAAAAM/6CGYucwKJaA/S220/dsc_6061.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1986806.post-4129184272952654372</id><published>2007-03-25T09:18:00.000-04:00</published><updated>2007-03-25T08:26:15.093-04:00</updated><title type='text'>Three hats</title><content type='html'>&lt;DIV&gt;&lt;STRONG&gt;Refactoring, Functionality, and UI? &lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;Last time, I  distinguished between the hats that a developer wears (one for adding  functionality, and another for refactoring). There's a third, in this case,  which is UI work. My first goal for today is in this third case - cleaning up  the UI so it's more clear how many, and which tests are passing. &lt;BR&gt;&amp;nbsp;In  addition to listing all of the test results, I'll add a summary section with  little green/red boxes, each linking to that test result, with mouse over text  of the name of the test (and the result). To accomplish this, I will be doing a  bit of refactoring, putting all of the results in an array to be displayed  later. &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;UI - Done&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;Ok, this enhancement is  complete, although I did see some good areas for future refactoring (such as  many copy/pasted calls to RunGenericTest function). But all my tests are passing  now (and the UI work will really shine once I get more than 25 additional  tests), so it's time to put on my functionality hat.  &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Functionality&lt;/STRONG&gt;&lt;BR&gt;&amp;nbsp;I have distressingly little on  my Functionality todo list. I'm worried that I don't know where this program is  headed. Well, let's forge ahead - I want to make a canonical list of Abilities,  just as there is a list of statistics. I should be able to copy, paste, and go  from there. &lt;BR&gt;&amp;nbsp;Beatles Revolver has finished playing - started Clapton's  From the Cradle. &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Refactoring again&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;Ah I see  the problem, I mix calling/storing Statistic by name and by ID. I'd better clear  up the confusion before copying statistics to Abilities, or I'll have to fix it  in multiple places. &lt;BR&gt;&amp;nbsp;Ok, I've added StatisticID to the Statistic class  (with the idea of replacing the Name member, to force all comparisons to be done  by ID). The Name should only be retrieved for display purposes, and should only  be known by the CanonicalStatistics object. Run tests - they pass. &lt;BR&gt;&amp;nbsp;Now  to remove the Name member from the Statistic class. Two missed references,  fixed, run tests- they pass. &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Copying&lt;/STRONG&gt;&lt;BR&gt;&lt;FONT  face=Arial size=2&gt;&amp;nbsp;Okay, now I'm relatively happy with the Statistics  Class. Time to copy &amp;amp; rename. Done. Added SuccessThreshold. Now, I need to  remove the references to Ability.Name (for the same reasons I removed references  to Statistic.Name). I'll also need to add a CanonicalAbilities class to the  global arrParameters. &lt;BR&gt;&amp;nbsp;Make changes, Run tests - I suppose it would  help if I instantiated the object when the Character class is created (:  &lt;BR&gt;&amp;nbsp;Interesting - that turned out to be easier than expected, as no tests  required any changes. &lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;STRONG&gt;Relationship between abilities and  Statistics&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;It's clear to me that an instance of an ability  (e.g. this character's success threshold for reading books) may differ from one  character to the next. Especially as the characters gain levels. It's not clear  to me, however, if the statistic that an ability relies on (such as Reading  Books relies on Intelligence and Lift Heavy Object relies on Strength) can vary  from character to character. Could a wizard lift heavy objects based on  Intelligence, or a fighter read books by strength? While it's tempting (and  slightly amusing) to consider these fringe cases, I believe it would severely  impact the intuitiveness of the game. &lt;BR&gt;&amp;nbsp;Thus, the canonical list of  abilities should include more than just the name of the ability, but also the ID  of the relevant statistic. This is my next goal. &lt;BR&gt;&amp;nbsp;So, should  CCanonicalAbilities have a local copy of CCanonicalStatistics? I think so. Does  this mean that the CCharacter class should use the CCanonicalAbilities's copy of  CCanonicalStatistics instead of its own? That, I'm not so sure of. For now, no.  The CCharacter will include two copies of the object, one for itself, and one  its copy of CCanonicalAbilities. &lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;STRONG&gt;Patience, please...&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;I'm  fighting with arrays. I've just a moment to update you on my progress, as  Interdev has decided to unexpected quit. Phew, finally found the error  (programmer error, of course, trying to use a zero-based index when a 1-based  index is more appropriate). &lt;BR&gt;&amp;nbsp;Ok, now I can make CanonicalAbilities  include both name and relevant statistic. But I've run out of music. I'll be  right back. &lt;BR&gt;&amp;nbsp;Dinner in 5 minutes - let's see if I can whip this  together. Whoops! All tests failed! Oh I need to create the CCanonicalStatistics  before trying to add Abilities. Ok, all tests pass now. &lt;BR&gt;&amp;nbsp;Next time I  need to add some functional tests. But for now, it's time for lamb chops. See  you next time. &lt;/FONT&gt;&lt;/DIV&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1986806-4129184272952654372?l=flyingsheep.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://flyingsheep.blogspot.com/feeds/4129184272952654372/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1986806&amp;postID=4129184272952654372&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/4129184272952654372'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/4129184272952654372'/><link rel='alternate' type='text/html' href='http://flyingsheep.blogspot.com/2007/03/three-hats.html' title='Three hats'/><author><name>FlyingSheep</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_uk2q-bc5eAQ/SwW62Duw1nI/AAAAAAAAAAM/6CGYucwKJaA/S220/dsc_6061.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1986806.post-7764312543064954040</id><published>2007-03-23T16:10:00.000-04:00</published><updated>2007-03-23T15:18:29.784-04:00</updated><title type='text'>Meet the Simpsons</title><content type='html'>&lt;DIV&gt;&lt;STRONG&gt;Recap&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;Last time, we ended with:&lt;BR&gt;&amp;nbsp;"Any  object that needs to know about statistics will include a local  objCanonicalStatistics, which will be loaded when the object is created. It can  then use that object to resolve references by name or by ID. As part of this,  the objCanonicalStatistics will no longer expose a public AddStatistic method.  Instead, it will load all the statistics it knows about when it's constructed.  "&lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Steps&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;There are a bunch of steps in this  process: &lt;BR&gt;1. CanonicalStatistics object changes (make AddStatistic method  private, load on start-up)&lt;BR&gt;2. Character object changes (give it its own  CanonicalStatistics object)&lt;BR&gt;3. SetupTest changes (CreateCanonicalStatistics  no longer necessary. Just New Class)&lt;BR&gt;4. Test and clean up&lt;BR&gt;&lt;BR&gt;&amp;nbsp;I'm  worried that these are a lot changes to make before any tests will pass, and I'm  worried about the vagueness of step 4. I also feel like making changes that are  not easily reverted or rolled back. There's probably a safer way to do this, but  I'm going to proceed recklessly. Wish me luck. &lt;BR&gt;&lt;BR&gt;1. CanonicalStatistics  object changes (make AddStatistic method private, load on start-up)&lt;BR&gt;&amp;nbsp;Ok,  changes made, and (from habit), I run my tests. First failure (clearly) is a  call to the now private AddStatistic method. I have three choices: &lt;BR&gt;&amp;nbsp;(a)  make the function public again (to avoid runtime errors)&lt;BR&gt;&amp;nbsp;(b) set the  tests to treat runtime errors as failing tests. &lt;BR&gt;&amp;nbsp;(c) use the errors to  local and eliminate the errors. &lt;BR&gt;&lt;BR&gt;&amp;nbsp;I could use a combination of (b)  and (c), but I'll just do (c), as it gives me line numbers (: I will admit  temptation for doing (a), but, to my credit, that temptation dissipated quickly.  &lt;BR&gt;&amp;nbsp;Actually, ConfirmCanonicalStatisticUnicity test is no longer required.  I'll nuke it. Interesting - it was the only one to use the AddStatistic method.  Cool. &lt;BR&gt;&lt;BR&gt;3. SetupTest changes (CreateCanonicalStatistics no longer  necessary. Just New Class)&lt;BR&gt;&amp;nbsp;Did these as part of 1, to allow me to test.  I will, however, remove the unnecessary function. &lt;BR&gt;&lt;BR&gt;2. Character object  changes (give it its own CanonicalStatistics object)&lt;BR&gt;&amp;nbsp;Phew! As it turns  out, my character object already had a function named FindStatisticByName, so  trying to make it call a global function of the same name would have been a  disaster. &lt;BR&gt;&lt;BR&gt;4. Test and clean up &lt;BR&gt;&amp;nbsp;My gosh! Other than a single  copy/paste error, all my tests are passing now! A change that I approach with  (justified) apprehension seems to be working. &lt;BR&gt;&amp;nbsp;Consider what would  happen in a world without tests: I'd make the changes, but be convinced that  there was a bug lurking somewhere. Now I know that, even if there is a bug left  in the code, it doesn't affect anything I care about (e.g. anything that I've  written a test for). Instead of worrying, or re-reading the code, or even  proceeding with unfounded confidence, I can simply resume coding - knowing that  my tests all pass. &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Mission  Accomplished&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;Indeed, I could even stop here and pick up again  on another day (: I'm going to review my todo list and see what appeals to me.  At least my code no longer smells of Global variables and test dependencies.  Although, to close the loop, I should add a tear-down function. &lt;BR&gt;&amp;nbsp;Done.  This reminds me, though, that I also need to add Deconstructors to my classes to  free up arrays that are created. I've added that to my todo list, but near the  bottom. &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Additional parameters&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;Note that I've  just fixed some of the tests that were named CreateFoo, but were really  CreateAndTestFoo. I've done this by separating the two functions, adding Foo to  the parameter list, and passing it to the testing function. I should do this for  each of my basic test Characters. So far, I have: &lt;BR&gt;&lt;BR&gt;Character without  Statistics or Abilities&lt;BR&gt;Character with Statistics, but no  Abilities&lt;BR&gt;Character with Statistics and Abilities, but low  intelligence&lt;BR&gt;Character with Statistics and Abilities, and high  intelligence&lt;BR&gt;&lt;BR&gt;&amp;nbsp;The first two, honestly, aren't interesting. They are  really edge cases, and I don't think those tests add a lot of value, so I'm  going to delete them. &lt;BR&gt;&amp;nbsp;Actually, not having an ability but trying to  use it might be a useful case. I'll leave that one for now. &lt;BR&gt;&amp;nbsp;So, what  I'd like to do is create two characters to use as parameters. One will be  minimal (low statistics in everything), and the other will have maximal  statistics. I need names for these characters - how about Homer (min) and Lisa  (max)? Perfect. &lt;BR&gt;&amp;nbsp;I'll add these characters to the setup function and  then make the test functions use them (instead of creating their own  characters). &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Creating Homer&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;Now that I have  this CanonicalStatistics object, I should use it to loop through all statistics  to create (and test) these characters. I'll have it expose its AllStatistics  array (for read only). &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Function Names&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;One nice  thing about this is that I can replace testCharacterWithLowIntCanNotReadBook  with the more readable testHomerCanNotReadBook.  &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Simpsons&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;Ok, both characters are in place, and  are being used by the test functions. All tests pass, the code is much less  stinky now, and I think this is a good place to stop for  today.&lt;/DIV&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1986806-7764312543064954040?l=flyingsheep.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://flyingsheep.blogspot.com/feeds/7764312543064954040/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1986806&amp;postID=7764312543064954040&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/7764312543064954040'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/7764312543064954040'/><link rel='alternate' type='text/html' href='http://flyingsheep.blogspot.com/2007/03/meet-simpsons.html' title='Meet the Simpsons'/><author><name>FlyingSheep</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_uk2q-bc5eAQ/SwW62Duw1nI/AAAAAAAAAAM/6CGYucwKJaA/S220/dsc_6061.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1986806.post-5789861830503006475</id><published>2007-03-18T09:29:00.000-04:00</published><updated>2007-03-18T08:37:18.833-04:00</updated><title type='text'>Cleaning and Course Correction</title><content type='html'>&lt;DIV&gt;&lt;STRONG&gt;Clean Working Environment&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;At some point, I'm  going to need to clean off my (physical) desktop. There's barely room for my  cereal and tea. The real "clean environment" that I have to work with is my set  of tests, all of which pass. It's a lot easier to motivate myself to extend  something that's working (rather than fix something that's not working).  &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Hats&lt;/STRONG&gt;&lt;BR&gt;&amp;nbsp;The last session results in a lot of  additions to my todo list, as well as a number of things I'd like to do  differently. Martin Fowler's book (Refactoring) discusses a programmer "wearing  different hats" - one for extending functionality, and another for refactoring.  It simplifies things to think of them as separate: you refactor so that you can  add functionality easily, but you're not changing functionality as you refactor.  I hope that's clear. &lt;BR&gt;&amp;nbsp;So yesterday was Add functionality (and refactor  when necessary), and, as a result, the code has that awful "Global Variable"  smell, as well as "Tests have undocumented dependencies" smell. Both of which  I'm going to try to fix today. In other words, today will be Refactor away  Smells (and possibly add some functionality when finished). &lt;BR&gt;&amp;nbsp;But first  - catch up on emails and blogs. No music this morning, as my wife and visiting  father-in-law are still asleep.  &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Setup/Teardown&lt;/STRONG&gt;&lt;BR&gt;&amp;nbsp;The first thing is to create  setup and tear down functions, which remove the dependency on the  CreateCanonicalStatistics function. &lt;BR&gt;&amp;nbsp;That was easier than expected. But  I'm not done yet. The problem is that CreateCanonicalStatistics is really  CreateAndTestCanonicalStatistics, which is too much for it to do. I'm going to  break some of these functions (also CreateBasicCharacter) down, and pass the  parameters as an array instead. So, setup functions will create the array, and  then all functions will get the array (even if they choose not to use it).  Actually, strike that - only the functions that choose to get the array will get  it. I don't think it's too difficult for a function to opt-in. &lt;BR&gt;&amp;nbsp;Of  course, in a real programming language, I'd just make the array optional.  &lt;BR&gt;&amp;nbsp;Additionally, I will pass a copy of the array (not the array itself).  If one of these functions tries to modify the array, it will still be in its  original shape for the next test. &lt;BR&gt;&amp;nbsp;So, I'm going to copy the existing  CreateCanonicalStatistics function, rip out the testing bits, and add it to the  setup routine. Also renamed the existing function to TestCanonicalStatistics,  and updated it to add a parameter. &lt;BR&gt;&amp;nbsp;The SetupTests function will be the  only function allowed to modify the array of parameters. &lt;BR&gt;&amp;nbsp;Another  unexpected failure! Great! (: It's nice to know that these tests are not a waste  of time (: Error was easily fixed. &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Extraction  success&lt;/STRONG&gt;&lt;BR&gt;&amp;nbsp;Ah ha! I did it. I removed the global variable from  the Create function, moved it into a setup function, and passed it to the test  function, which worked like a charm. &lt;BR&gt;&amp;nbsp;Of course, the tests that were  using the global variable are now failing, but they will be easy to clean up  (same process as cleaning the TestCanonicalStatistics function).  &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Snag!&lt;/STRONG&gt;&lt;BR&gt;&amp;nbsp;Uh oh. Character.UseAbility also relies  on this global variable. At this point, I'm beginning to think that I might be  spending too much time on an object whose sole purpose is to be a stand in for  an actual database table. It's time to think about alternatives. &lt;BR&gt;&amp;nbsp;The  one that appeals the most to me at the moment is to stuff the statistics (and  their IDs) in the Application object (which has global scope). I can then expose  global functions for adding/finding the statistics by ID or by name. Ultimately,  I won't need the CanonicalStatistics class at all. &lt;BR&gt;&amp;nbsp;Well, I've got my  failing test, so I can start by replacing  objCanonicalStatistics.FindStatisticByIndex with a global function  FindStatisticByIndex that returns "Strength". This will at least make the tests  fail without throwing runtime errors. &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Runtime  Errors&lt;/STRONG&gt;&lt;BR&gt;&amp;nbsp;Somehow, runtime errors strike me as worse than failing  tests. Is that a reasonable preference on my part? &lt;BR&gt;&amp;nbsp;Anyways, I've  sorted all the runtime errors, but I haven't finished implementing the real  versions of the functions to store and retrieve values from the application  object. I think that the syntax should be something like:  &lt;BR&gt;&lt;BR&gt;Application("Statistic_1") = "Strength". &lt;BR&gt;&lt;BR&gt;&amp;nbsp;In this case,  retrieving the name from the ID is easy, but retrieving the ID from the name is  difficult. Perhaps I should also include:  &lt;BR&gt;&lt;BR&gt;Application("Statistic_Strength") = 1. &lt;BR&gt;&lt;BR&gt;&amp;nbsp;Of course, I hate  having data in two places, as I fear it may get out of sync. Perhaps I should  simply store the array that used to be in the CanonicalStatistics object, and  use the same logic as I was using before. Or, possibly, I should just give my  Character object a local copy of the CanonicalStatistics object.  &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Changing Course&lt;/STRONG&gt;&lt;BR&gt;&amp;nbsp;Ok, I think I'll take that  route - Any object that needs to know about statistics will include a local  objCanonicalStatistics, which will be loaded when the object is created. It can  then use that object to resolve references by name or by ID. At least, we'll  give that approach a try for now, and see where it goes. &lt;BR&gt;&amp;nbsp;As part of  this, the objCanonicalStatistics will no longer expose a public AddStatistic  method. Instead, it will load all the statistics it knows about when it's  constructed. &lt;BR&gt;&lt;BR&gt;To be continued...&lt;/DIV&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1986806-5789861830503006475?l=flyingsheep.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://flyingsheep.blogspot.com/feeds/5789861830503006475/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1986806&amp;postID=5789861830503006475&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/5789861830503006475'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/5789861830503006475'/><link rel='alternate' type='text/html' href='http://flyingsheep.blogspot.com/2007/03/cleaning-and-course-correction.html' title='Cleaning and Course Correction'/><author><name>FlyingSheep</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_uk2q-bc5eAQ/SwW62Duw1nI/AAAAAAAAAAM/6CGYucwKJaA/S220/dsc_6061.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1986806.post-3567803164042359357</id><published>2007-03-16T17:02:00.000-04:00</published><updated>2007-03-16T16:12:08.027-04:00</updated><title type='text'>UseAbility</title><content type='html'>&lt;DIV&gt;&lt;STRONG&gt;Light Reading&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;There are some books which inspire  me to write code. Reading them makes me want to run to the nearest keyboard and  try out some ideas. The first book that had this affect on me was Code Complete  by Steve McConnell. The second book, which I'm reading now, is Refactoring by  Martin Fowler. &lt;BR&gt;&amp;nbsp;One of the things that I read recently is that the  automated tests for refactoring focus on Unit tests, not Functional tests. The  test that I've written so far are, I think Unit tests, but I haven't focused on  the distinction between the two. Perhaps that one of the reasons I've been  struggling with things like CreateBasicCharacter - I may be trying to implement  a Functional test instead of a Unit test. &lt;BR&gt;&amp;nbsp;Not to imply that I  shouldn't have any Functional tests, but perhaps the acknowledging the  difference will help me approach those tests more clearly. &lt;BR&gt;&amp;nbsp;Checked  email. Adjusted keyboard height. Symphony Fantastique (Berlioz) is playing. I'm  ready to code ... something. &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Abilities&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;I'd  like to implement Character abilities. Each ability should have a name, a way of  determining if the attempted action was successful, and a set of  successful/unsuccessful effects. We'll leave the last part for later.  &lt;BR&gt;&amp;nbsp;A simple example ability to start with is "Read scroll." This will  require a successful check against Intelligence, say the character must have an  Intelligence attribute of at least 11. My first test will be to generate a  character at random, and have the character attempt this action. Based on the  character's intelligence, the test should be able to predict (and check for) the  result. &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Premature Generalization?&lt;/STRONG&gt; &lt;BR&gt;&amp;nbsp;Easiest  thing to do would be to call objCharacter.ReadBoook(). Well, calling  objCharacter.UseAbility("ReadBook") is pretty close. This function should return  success or failure. Of course, just like the chrematistics, they will have a  strName as well as a lngID. &lt;BR&gt;&amp;nbsp;I think that the function should return an  output parameter for success or failure, and return a status code for "did you  encounter any errors along the way". This is a poor man's try/catch in a  language that doesn't support that syntax.  &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Stats&lt;/STRONG&gt;&lt;BR&gt;&amp;nbsp;Incidentally, the server statistics show  a massive amount of activity as I debug (mostly because I'm going back to test  so often). This is slighly annoying (as it obscures the other data I'm trying to  gather like real visits), but it's also a good sign. &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Test  First&lt;/STRONG&gt;&lt;BR&gt;&amp;nbsp;I did it. I remember to write a failing test. Of course,  the failure is because I haven't implemented UseAbility yet. Actually, I'll also  need "AddAbility". My first test, though should have the character fail because  the ability wasn't found. &lt;BR&gt;&amp;nbsp;I'm copying/pasting some code for the array  handling. No smell there, though. &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Exciting  Failure!&lt;/STRONG&gt;&lt;BR&gt;&amp;nbsp;Hey! For the first time, a test other than the one I  was working on failed. I got an unexpected failure that, without the help of  these tests, would have usually been an undetected bug. &lt;BR&gt;&amp;nbsp;I'm sold on  test-driven development. &lt;BR&gt;&amp;nbsp;In fact, this bug shows that I missed a test  - I should have tested a character without any statistics. Now, as it happens,  that's not a very likely case. But a chacter without any abilities (e.g. just  starting out) is much more likely. I can fix the code for both to work smoothly.  &lt;BR&gt;&amp;nbsp;Now, back to implementing the "UseAbility" function. For which, first,  I'll need a FindAbility function. &lt;BR&gt;&amp;nbsp;Copying/Pasting again. Now it's  beginning to get a little whiffy. I think that the solution may be to extract a  subclass of Abilities, and delegate the addition/finding/testing to that class.  The main warning sign is that ABILITY_NOT_FOUND doesn't feel right as part of  the Character class. But it's not necessary just yet. Or, I'm just postponing  the inevitable. &lt;BR&gt;&amp;nbsp;In fact, I may want to generalize the add/find  functions of the collection. Or, possibly, use a Scripting.Dictionary or similar  object. Not yet, though. &lt;BR&gt;&amp;nbsp;&lt;BR&gt;&lt;STRONG&gt;Test Order&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;I'll  also need a test to ensure that two abilities with the same name can't be added.  Actually, that test would pass now (even before the UseAbility one I was trying  to implement). I'll back up and add the test now. &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Ability as  object&lt;/STRONG&gt;&lt;BR&gt;&amp;nbsp;Well, that didn't take long. I need to create an  Ability object (just like a statistic object) in order to include the relevant  Statistic that needs to be tested. So, I'll be undoing some of the changes I  made to the code I copied and pasted to support objects (instead of strings).  &lt;BR&gt;&amp;nbsp;While I'm at it, I suppose I really do want to have a  CanonicalAbilities collection, too. Perhaps these Canonical objects will no  longer be necessary, once I hook up to a database. &lt;BR&gt;&amp;nbsp;File level  copy/paste, find/replace, and I've got a CanonicalAbilities object. Quick test -  everything looks okay. &lt;BR&gt;&amp;nbsp;First thing, though, is to tie this new ability  class to the Character class (which is still using "disconnected" strings  instead of objects). &lt;BR&gt;&amp;nbsp;New music - Phish - nah, Clapton.  &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Ability attributes&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;Ok, so each ability has a  name (I feel like I'm not writing enough tests), but it also needs a StatisticID  to go along with it. It does seem a little odd that a Statistic wouldn't know  its own StatisticID. Hmm... I may want to do database stuff next to see if that  clears up some confusion. &lt;BR&gt;&amp;nbsp;&lt;BR&gt;&lt;STRONG&gt;Set up/Tear  Down&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;This is no good. I've changed one of my tests to use a  global variable, moved that test to the top of the line with comment  "set-up/test", and added a "tear down" comment where I free up that global  object. Phew. I'll add creating real methods to my list of things to do.  &lt;BR&gt;&amp;nbsp;I need a test to prove that I can't add the same statistic twice to  the same character. &lt;BR&gt;&amp;nbsp;Ok, while doing that test, I found a more basic  problem - I can't find a statistic once I've added it. I create a more simple  test to isolate just this problem. Now that this test is failing, I can  investigate. &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Found it&lt;/STRONG&gt;&lt;BR&gt;&amp;nbsp;I found the problem.  VBScript Classes don't support (amoung other things) class members that are also  constants. In this case the STATISTIC_NOT_FOUND was using the default 0 (which  is also the position of the first object in the array) instead of -1.  &lt;BR&gt;&amp;nbsp;I get around this by exposing a public member, and setting the value  once in the initialize statement. I should make the member private and then just  expose an accessor, but I like the intellisense that the first approach  provides. I can always clean it up later...&lt;BR&gt;&amp;nbsp;As part of this debugging,  I had to disable other tests. I should incorporate that into the program and  expose it in the UI (something like a checkbox for each test or something). This  would go nicely with putting all my separate test calls into a loop.  &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Finally ...&lt;/STRONG&gt;&lt;BR&gt;&amp;nbsp;I'm ready to implement the  UseAbility Function. &lt;BR&gt;&amp;nbsp;Yuck. That was much more difficult than it should  have been. I could, if I didn't want to check for any errors, simply code it in  3 lines: &lt;BR&gt;UseAbility(strAbilityName)&lt;BR&gt;&amp;nbsp;Set objAbility =  m_Abilities(FindAbilityByName(strAbilityName))&lt;BR&gt;&amp;nbsp;Set objStatistic =  m_Statistics( FindStatisticByName( FindStatisticByIndex( objAbility.StatisticID  ) ) )&lt;BR&gt;&amp;nbsp;blnSuccess = (objAbility.SuccessThreshold &amp;lt;=  objStatistic.Value)&lt;BR&gt;&lt;BR&gt;&amp;nbsp;But I'm not comfortable with that. I want to  make sure that each intermediate function returns a valid answer. Perhaps I'm  too defensive. Well, let's see if it works. &lt;BR&gt;&amp;nbsp;Yup, I ended up adding  some tests for intermediate functions, which end up producing different return  codes for failure: &lt;BR&gt;Const RETURN_CODE_ABILITY_NOT_FOUND = -3&lt;BR&gt;Const  RETURN_CODE_ABILITY_STATISTIC_NOT_FOUND = -2&lt;BR&gt;Const  RETURN_CODE_ABILITY_STATISTIC_NAME_NOT_FOUND = -1&lt;BR&gt;&amp;nbsp;I've also added 4  tests:  &lt;BR&gt;"testCharacterWithoutStatsCanNotReadBook"&lt;BR&gt;"testCharacterWithoutAbilitiesCanNotReadBook"&lt;BR&gt;"testCharacterWithLowIntCanNotReadBook"&lt;BR&gt;"testCharacterWithHighIntCanReadBook"&lt;BR&gt;&lt;BR&gt;&amp;nbsp;Well,  that took longer than expected, but I'm pretty happy with the results. I've got  a long list of things to start on next time, to, including: &lt;BR&gt;Create  setup/teardown functions&lt;BR&gt;SaveTo/LoadFrom database&lt;BR&gt;&lt;BR&gt;See you next  time.&lt;/DIV&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1986806-3567803164042359357?l=flyingsheep.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://flyingsheep.blogspot.com/feeds/3567803164042359357/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1986806&amp;postID=3567803164042359357&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/3567803164042359357'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/3567803164042359357'/><link rel='alternate' type='text/html' href='http://flyingsheep.blogspot.com/2007/03/useability.html' title='UseAbility'/><author><name>FlyingSheep</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_uk2q-bc5eAQ/SwW62Duw1nI/AAAAAAAAAAM/6CGYucwKJaA/S220/dsc_6061.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1986806.post-4643475350850434137</id><published>2007-03-12T07:48:00.000-04:00</published><updated>2007-03-12T07:56:27.272-04:00</updated><title type='text'>Internal Tweaks</title><content type='html'>&lt;DIV&gt;&lt;STRONG&gt;Some Internal Tweaks tonight.&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;Update  RunGenericTest to offer the option of not using On Error Resume  Next&lt;BR&gt;&amp;nbsp;Update RunGenericTest to allow for parameters to be passed  (arrParameters array?)&lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;You Eye&lt;/STRONG&gt;&lt;BR&gt;&amp;nbsp;For the first  time, I'm going to add a little logic to the test page itself. First, I'll  update the GenericTest function to allow for errors to be treated as fatal. Then  I'll update the page to expose this option (link, I suppose). This is akin to  turning off "Show Friendly Errors" in IE. &lt;BR&gt;&amp;nbsp;Tonight's coding is  accompanied by Tears for Fears: the hurting. &lt;BR&gt;&amp;nbsp;Hmm... First time that I  can recall actually trying to introduce runtime errors into my code. If I fail  at producing buggy code what have I really done? (: &lt;BR&gt;&amp;nbsp;Ok, I can now  toggle easily between error-catching and error-ignoring. I also didn't really  need to use the Execute command. &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Update RunGenericTest to allow  for parameters to be passed&lt;/STRONG&gt; &lt;BR&gt;&amp;nbsp;This will be another UI feature -  allow the user to enter parameters for the tests. Am I breaking some sort of  natural law here? It seems I might get carried away and no longer use the tests  as they were intended. Oh well, full steam ahead. &lt;BR&gt;&amp;nbsp;Of course, I'll need  to spend some code to validate the inputs, which might not be code under test.  &lt;BR&gt;&amp;nbsp;Good, good, all is working. I should have included some more ambitious  goals, but I knew I only had a short amount of time. I'll play around a bit with  the output, maybe in a table format. &lt;BR&gt;&amp;nbsp;Ok, it looks pretty good now.  That's enough for tonight.&lt;/DIV&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1986806-4643475350850434137?l=flyingsheep.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://flyingsheep.blogspot.com/feeds/4643475350850434137/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1986806&amp;postID=4643475350850434137&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/4643475350850434137'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/4643475350850434137'/><link rel='alternate' type='text/html' href='http://flyingsheep.blogspot.com/2007/03/internal-tweaks.html' title='Internal Tweaks'/><author><name>FlyingSheep</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_uk2q-bc5eAQ/SwW62Duw1nI/AAAAAAAAAAM/6CGYucwKJaA/S220/dsc_6061.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1986806.post-5016873732914024126</id><published>2007-03-09T14:38:00.000-05:00</published><updated>2007-03-09T14:46:37.358-05:00</updated><title type='text'>General Statistics 101</title><content type='html'>&lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;A  href="http://flyingsheep.com/dicetest/test.asp"&gt;http://flyingsheep.com/dicetest/test.asp&lt;/A&gt;&lt;/FONT&gt;&lt;/DIV&gt;&lt;STRONG&gt;Goals  for today&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;I'd eventually like to be able to roll a complete  character and have the computer tell me which archetype those statistic would  best fit (e.g. what type of character I should create, unless I choose to  re-roll). &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Task List&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;1 Add a second statistic  to my character. &lt;BR&gt;&amp;nbsp;2 Generalize the statistic class. &lt;BR&gt;&amp;nbsp;3 Add the  remaining statistic to my character. &lt;BR&gt;&amp;nbsp;4 Define Archetype minimum  statistics&lt;BR&gt;&amp;nbsp;5 Write and test comparison program.  &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Ritual&lt;/STRONG&gt;&lt;BR&gt;&amp;nbsp;First, I'll move my passing tests (that  I don't plan on modifying today) into the successful tests page. I'll eventually  need multiple categorized pages of successful tests, but not today.  &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;1 Second Statistic&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;That was easy. A little  copy/paste in the validation function, but I'll clean it up later (Copy/Paste  once is acceptable, I think. Copy/Paste seven times indicates the time to  generalize). &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;2 Generalize Statistic. &lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;I'm a  bit worried about my dependence on Intellisense, and stuff I've been reading  suggests that it doesn't work with multiple nested classes. Still, I think that  multiple nested classes is, in this case, the way to go. A Character should  contain multiple Statistics. &lt;BR&gt;&amp;nbsp;The reason for generalizing at this point  is in anticipation of multiple different objects (Characters, Archetypes,  Abilities) using the same Statistic objects. &lt;BR&gt;&amp;nbsp;I'm a bit confused about  how to proceed. Then I realize I don't have a failing test.&amp;nbsp; Ah, I write a  test to walk through the statistics collection (which doesn't exist yet), and it  fails. &lt;BR&gt;&amp;nbsp;For the first, I need to disable error ignoring in  RunGenericTest, because I need the additional diagnostic information. I  re-enable it afterwards. I'm also reduced to throwing in some "Response.Write"s  to help debug, although that smells a bit. &lt;BR&gt;&amp;nbsp;Ok, So Strength is using  the new Statistic class (which I simplified as a public Name/Value pair,  although I expect it to get more complex soon). I'll finish converting Agility,  and clean up unused references to the hardcoded names in the class.  &lt;BR&gt;&amp;nbsp;Getting "Object doesn't support this property or method " error. Need  to beef up my objCharacter.DebugPrint function. &lt;BR&gt;&amp;nbsp;Disabled Error  Ignoring again. I may want to add that as a switch (now that I've find my new  friend Execute). Something like blnTreatErrorsAsFatal.&lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;3 Add the  remaining statistic to my character. &lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;Found this &lt;A  href="http://www.thehaws.org/add_quiz.shtml"&gt;http://www.thehaws.org/add_quiz.shtml&lt;/A&gt;  cute little quiz to determine your real life Dungeons and Dragons Stats. The  author was nice enough to leave in some default values for impatient people like  me. &lt;BR&gt;&amp;nbsp;I'm slightly annoyed that Strength has a different format (e.g.  3d6 + d100), but I'm going to ignore that. Game Designer's prerogative. Also  turns out that there's no statistic for Agility. Hmm...&lt;BR&gt;&amp;nbsp;Ah, the powers  of generalization. Just adding one line per statistic should handle all the  programming and testing. Six lines of code later, and my character is feeling  much more multi-dimensional. Oh, I suppose I should test it. &lt;BR&gt;&lt;BR&gt;&lt;FONT  color=#800080&gt;This character is named Gunthar and is a Barbarian.&lt;BR&gt;This  character has 6 statistics.&lt;BR&gt;Gunthar has a Strength of 11.&lt;BR&gt;Gunthar has a  Intelligence of 12.&lt;BR&gt;Gunthar has a Wisdom of 6.&lt;BR&gt;Gunthar has a Dexterity  of&amp;nbsp; 9.&lt;BR&gt;Gunthar has a Constitution of 14.&lt;BR&gt;Gunthar has a Charisma of  11.&lt;BR&gt;&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;Sweet. &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;4 Define Archetype minimum  statistics&lt;/STRONG&gt;&lt;BR&gt;&amp;nbsp;Some simple rules: Fighters - minimum Strength 9;  Mages - minimum 9 Intelligence; Clerics - minimum 9 Wisdom; Thieves - min 9  Dexterity. &lt;BR&gt;&amp;nbsp;Now I'm at a bit of a quandary. I don't want to compare  objCharacter.Statistic("name").value to  objArchetype.MinimumRequiredStatistic("name").value. I don't like doing  comparisons by "name" - the danger of trying to compare "Strength" and  "Strength" is too great (with my less than stellar spelling ability). I want  canonical Statistics, with IDs and Named constants like STATISTIC_STRENGTH = 1.  I want a global object that defines which statistics exist and exposes an  enumerated list. &lt;BR&gt;&amp;nbsp;However, I also want to be able to add new statistics  later. I guess I want a FindStatisticByName("Strength") so that I can use them  both as string aliases and constants.&amp;nbsp; Let's start down that path.  &lt;BR&gt;&amp;nbsp;CStatistic is sort of an instance of a statistic. This will also give  me the first stuff to put into my StartUp pre-test function. &lt;BR&gt;&amp;nbsp;Oops.  Wrote a bunch of code without a failing test. I've got to get into the right  habits. Two syntax errors. I'm coding too much between tests. &lt;BR&gt;&amp;nbsp;OK, new  plan for today. I'll write up some tests for this new Canonical Statistics  object. I'm still not sure if it should be global, or should be passed around.  &lt;BR&gt;&amp;nbsp;Adding a DebugPrint function to this new object. &lt;BR&gt;&amp;nbsp;My previous  tests have been more like commands - CreateBasicCharacter. I exercise the  functionality, but don't check for results (except for the errors being thrown).  For this new class, I'm going to be specific (as there are specific things I  want to check, such as disallowing the addition of duplicates). Nice - I can use  the DebugPrint function to ensure that the object is the same after attempting  to add a duplicate. &lt;BR&gt;&amp;nbsp;New Assert Function - AssertNumbersMatch(). Funny  how I needed AssertNumberInRange first. Works. I like how the code and the tests  have a symbiotic relationship - each validates the other. &lt;BR&gt;&amp;nbsp;Time to  clean up, set up tasks for next time, and log off, with all tests passing.  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1986806-5016873732914024126?l=flyingsheep.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://flyingsheep.blogspot.com/feeds/5016873732914024126/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1986806&amp;postID=5016873732914024126&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/5016873732914024126'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/5016873732914024126'/><link rel='alternate' type='text/html' href='http://flyingsheep.blogspot.com/2007/03/general-statistics-101.html' title='General Statistics 101'/><author><name>FlyingSheep</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_uk2q-bc5eAQ/SwW62Duw1nI/AAAAAAAAAAM/6CGYucwKJaA/S220/dsc_6061.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1986806.post-1771854915465996349</id><published>2007-03-06T20:05:00.000-05:00</published><updated>2007-03-06T20:13:18.103-05:00</updated><title type='text'>Dice</title><content type='html'>&lt;DIV&gt;You can follow my progress at &amp;nbsp;&lt;A  href="http://flyingsheep.com/dicetest/test.asp"&gt;http://flyingsheep.com/dicetest/test.asp&lt;/A&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;STRONG&gt;Back to it&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;After a brief enjoyable break to play  some Guitar Hero II and BattleLore, I'm back. My next goal is to create a  Character class, add an attribute, and set the attribute by rolling 3d6 (sound  familiar?). &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Delay&lt;/STRONG&gt;&lt;BR&gt;&amp;nbsp;Finding my RL friends on  Live Journal. I'm probably a few years behind the curve here, but there's a  tangled web, and it's difficult to resist the urge to tease out a few strands  and bookmark them. RSS Feeds are the next step, but for today, bookmarks will  have to do. &lt;BR&gt;&amp;nbsp;Also spent some time working on the intellisense problem  with ASP classes. No progress. &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Gunthar the  Barbarian&lt;/STRONG&gt;&lt;BR&gt;&amp;nbsp;Created a character. Tested to make sure name  matches Gunthar and archetype (class) matches Barbarian. Is it okay to pass  parameters to tests? I'm thinking I might have to include an array of parameters  in the test function definition (strTestResult, blnTestPassed,  [arrParameters?]). I'm also thinking that I should move my successful tests out  of the main file that I'm working in (just to tidy up a bit). &lt;BR&gt;&amp;nbsp;The  freedom to move things around and not worry about breaking something (and,  worse, not realizing its been broken until much later) is  exhilarating!&lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Generic Functions&lt;/STRONG&gt;&lt;BR&gt;&amp;nbsp;I need a  generic function AssertNumberInRange(lngNumber, lngRangeMin, lngRangeMax,  strResult). I'll write one and then refactor some of the tests.  &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Debugging&lt;/STRONG&gt;&lt;BR&gt;&amp;nbsp;For the first time so far, it took  more than a minute for me to find the error. I fell back into debugging. It's a  frustrating sign that I'm trying to move too fast. I've got to get back to baby  steps. &lt;BR&gt;&amp;nbsp;I was trying to test both the new Assert..Range function and  the Character stat rolling function. I got greedy. &lt;BR&gt;&amp;nbsp;Used the Assert  Range function to find a bug in the stat rolling function. Investigating. Ah ha!  ObjDie doesn't return the value. It simply sets objDie.Value. Hmm... Maybe I  want to change that. If I can't remember how it worked this morning, that's not  intuitive design. &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;So, Tell Me About Yourself&lt;/STRONG&gt;&lt;BR&gt;&amp;nbsp;I  like my classes to have a .DebugPrint() method that returns an HTML formatted  string with various information (state, variables, etc.) about itself. This  helps debugging, of course. It end up being a holdover from my pre-TDD days  (e.g. yesterday), but I'm going to give it a try. &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Test too  complicated?&lt;/STRONG&gt; &lt;BR&gt;&amp;nbsp;I've got a single test called  CreateBasicCharacter. It's probably not descriptive enough. It does a lot of  things, too - checks the name, the archetype, the strength, etc.  &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Adding function  CDie.RollMultipleDice(lngNumberOfDice)&lt;/STRONG&gt;&lt;BR&gt;&amp;nbsp;Oops - I got a stack  error. I guess if RollMultipleDice calls Roll(), I can't simplify Roll() by  calling RollMultipleDice(1). Ha! Adding some tests for Multiple Dice Rolling.  &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Ok Everything working&lt;/STRONG&gt;&lt;BR&gt;5 Tests running. Progress is  being made. Time for dinner.&lt;/DIV&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1986806-1771854915465996349?l=flyingsheep.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://flyingsheep.blogspot.com/feeds/1771854915465996349/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1986806&amp;postID=1771854915465996349&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/1771854915465996349'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/1771854915465996349'/><link rel='alternate' type='text/html' href='http://flyingsheep.blogspot.com/2007/03/dice.html' title='Dice'/><author><name>FlyingSheep</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_uk2q-bc5eAQ/SwW62Duw1nI/AAAAAAAAAAM/6CGYucwKJaA/S220/dsc_6061.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1986806.post-5766446317697289230</id><published>2007-03-04T07:33:00.000-05:00</published><updated>2007-03-04T07:41:00.145-05:00</updated><title type='text'>First Steps: Dice</title><content type='html'>&lt;DIV&gt;&lt;STRONG&gt;Warning&lt;/STRONG&gt;&lt;BR&gt;&amp;nbsp;I should warn you that this may be a  little frustrating to read, especially if you already use TDD (Test Driven  Development). It's akin to watching someone fumble around in a computer game  when you know what the solution is. You may find yourself thinking, "Press the  Red button twice, then the green button! It's so obvious!", or groaning when I  start down an obvious dead end. My apologies in advance, and I am open to  constructive criticism. &lt;BR&gt;&amp;nbsp;One of my frustrations as a mathematician was  knowing that if there were two possible paths to pursue, I invariably choose the  dead end path first. (: &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Starting Here, Starting  Now&lt;/STRONG&gt;&lt;BR&gt;&amp;nbsp;Ok, so, some infrastructure work first. Setting up a  project, connecting to the website, installing a visual FTP app, etc. Done,  hello world page uploaded. Excellent. &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Baby  Steps&lt;/STRONG&gt;&lt;BR&gt;&amp;nbsp;According to TDD, I need to start with a failing test.  This can include a test that fails because an object can't be created. I've  created a first function called TestAll, that will eventually contain all the  tests. &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;First Test - empty test (always  passed)&lt;/STRONG&gt;&lt;BR&gt;&amp;nbsp;This is a test Test. Whoo hoo! It passed (: I do a  little refactoring (already!), deciding that test functions should take two  output parameters (strTestResult, blnTestPassed). &lt;BR&gt;&amp;nbsp;(Yes, I still use  Hungarian notation. I find it useful, although I probably simply haven't heard  the right argument against it yet. I expect I'll give it up  eventually.)&lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Error checking&lt;/STRONG&gt;&lt;BR&gt;&amp;nbsp;A decision must be  made - do I disable fatal error checking (e.g. use On Error Resume Next) and  catch errors and report them as failing tests? If so, does the test itself need  to do this, or should the master function (TestAll) do this before and after  each test? &lt;BR&gt;&amp;nbsp;Without thinking too much about it, I'll go with making the  TestAll function disable (and reenable) error checking, assuming that it doesn't  reset when crossing function boundaries. I'll test that, obviously.  &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Execute (not Copy.Paste)&lt;/STRONG&gt;&lt;BR&gt;&amp;nbsp;There's a chunk of  code in the TestAll function that clears errors, calls the function, checks for  thrown errors, checks the results of the function, adds the results to the list,  and cleans up. I'm a bit tempted to copy/paste this block of 14 lines, and just  rename the function to be tested each time. Execute command to the rescue! I can  create a generic function for this 14 lines, pass the name of the function in,  and use Execute to run it. Cool beans, although I'm a bit wary that any use of  Execute is a too-clever solution. Time will tell. &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Refactoring  again&lt;/STRONG&gt;&lt;BR&gt;&amp;nbsp;My first attempt at creating a  RunGenericTest(strTestName, strAllTestResults) function doesn't work. Simple  error (neglected to change a variable name), which reminds me that I need to  specify Option Explicit to throw these errors. &lt;BR&gt;&amp;nbsp;Compilation Errors  still are fatal, as they should be. And embarrassing (as they should be).  &lt;BR&gt;&amp;nbsp;I'm already enjoying my RunGenericTest function, as I've decided to  reformat the results a bit to number the tests. Had I chosen the copy/paste  route, that's at least two places that I would have had to change (and would  have increase the barrier to making that change). I now have two test - one  empty passing test, and one failing test that throws a VB Runtime error  (undeclared variable). Excellent. I don't need a failing VBScriptRuntimeError  test, so I'll get rid of it. &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Implementing  RollDieGetValueBetween1And6&lt;/STRONG&gt;&lt;BR&gt;&amp;nbsp;I'm currently torn between keeping  the class files separate (e.g. CDie.asp, CCharacter.asp, CMap.asp, etc.) and the  convenience of intellisense (which only works on classes defined in that file.  I'd like ideally to have the header information (function stubs) inline in my  test file, and the implementation details separate. &lt;BR&gt;&amp;nbsp;Alternatively, I  could define the tests in the class files (where intellisense will work).  Perhaps a class.TestAll() function? I'll go down that route. But how will the  class file have access to the RunGenericTest function? I'm sure there's an  answer, but not sure what it is just yet. &lt;BR&gt;&amp;nbsp;For now, I can kludge  together something like the following - copy/paste the contents of the CDie  class into the testing page for convenience of working on them. Once I'm ready  to move onto a different class, I'll "check in" the current inline version, and  include the separate file. Not clean, but I think it'll work. &lt;BR&gt;&amp;nbsp;I will  probably eventually group functions by class, but I'm not sure yet if I will  include them in the class. &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Tests for random  events&lt;/STRONG&gt;&lt;BR&gt;&amp;nbsp;It's a little difficult to write a test where the  expected result is in a range. For example, I have two tests which simulate  rolling a 6 and 10-sided die, respectively. In each case, I'm testing for  results between 1 and 6 (or 10). But if I screw up and the 10-sided die is  really only a 6 sided die, I'll never catch that bug. &lt;BR&gt;&amp;nbsp;One answer would  be to make the test check that each number in the range appears more or less the  same amount of time. But even this test will occasionally fail (for example, if  all 10 rolls are a "3", just by pure chance. Is it acceptable to have tests that  pass 90% of the time? (: &lt;BR&gt;&lt;/DIV&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1986806-5766446317697289230?l=flyingsheep.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://flyingsheep.blogspot.com/feeds/5766446317697289230/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1986806&amp;postID=5766446317697289230&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/5766446317697289230'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/5766446317697289230'/><link rel='alternate' type='text/html' href='http://flyingsheep.blogspot.com/2007/03/first-steps-dice.html' title='First Steps: Dice'/><author><name>FlyingSheep</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_uk2q-bc5eAQ/SwW62Duw1nI/AAAAAAAAAAM/6CGYucwKJaA/S220/dsc_6061.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1986806.post-4117065340180321516</id><published>2007-03-02T15:28:00.000-05:00</published><updated>2007-03-02T15:36:21.539-05:00</updated><title type='text'>Not Fitnesse</title><content type='html'>&lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt;Not Fitnesse&lt;BR&gt;&amp;nbsp;Well, I've  given up on installing Fitnesse locally. Despite installing the correct version  of the JRE, I can't get it to run. I still believe that Fitnesse is a good tool  that&amp;nbsp; I'd like to play around with at some point, but not now, and not on  this machine. &lt;BR&gt;&amp;nbsp;I can get away with something a little lighter anyway. I  don't need the collaboration or the wiki, I just need a test driver. So, I'll  just have to write one. &lt;BR&gt;&lt;BR&gt;Build vs. Buy&lt;BR&gt;&amp;nbsp;Or possibly, just get  one. There is a &lt;A href="http://www.vbunit.org"&gt;www.vbunit.org&lt;/A&gt; Unit-testing  tool for VB. There is also aspunit.sourceforge.net ASPUnit, but it runs on top  of IIS (which, upon reflection, it would have to do), which I don't have  installed locally. Really, most of the problems I'm encountering are of my own  creation - upgrading my machine would go a long way to solving them.  &lt;BR&gt;&amp;nbsp;So far, my choices are: (a) write a local ASP test driver, or (b)  install and use VBUnit, code a bunch of DLLs with the "business" (read "gaming")  logic, and deploy most of the code as binary files. This second approach has the  advantage of separating the presentation layer, which is always nice, and leaves  the components in a re-usable state. Let's head down that path. &lt;BR&gt;&lt;BR&gt;Path  Bee&lt;BR&gt;&amp;nbsp;First step, does my hosting provider let me deploy binary files?  *Research* No. I should note that there is another option (c) write it in  ASP.Net. For now, back to Path A.&lt;BR&gt;&lt;BR&gt;Path Eh&lt;BR&gt;&amp;nbsp;So, the idea is that  I'm going to set up a web project, create a simple ASP class (to simulate the  roll a die - important in an RPG like game), and create a test harness. First,  though, time for a break. &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1986806-4117065340180321516?l=flyingsheep.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://flyingsheep.blogspot.com/feeds/4117065340180321516/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1986806&amp;postID=4117065340180321516&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/4117065340180321516'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/4117065340180321516'/><link rel='alternate' type='text/html' href='http://flyingsheep.blogspot.com/2007/03/not-fitnesse.html' title='Not Fitnesse'/><author><name>FlyingSheep</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_uk2q-bc5eAQ/SwW62Duw1nI/AAAAAAAAAAM/6CGYucwKJaA/S220/dsc_6061.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1986806.post-2378374603331671030</id><published>2007-02-28T16:46:00.000-05:00</published><updated>2007-02-28T16:54:16.527-05:00</updated><title type='text'>Fitnesse Install I</title><content type='html'>&lt;DIV&gt;&lt;STRONG&gt;Installing Finesse&lt;/STRONG&gt;&lt;BR&gt;&amp;nbsp;So, as a programmer, I'm a  believer in Test Driven Development. I've decided to put my money where my mouse  is (so to speak) and develop a project for FlyingSheep.com using a public test  driven development process. &lt;BR&gt;&amp;nbsp;Now, most developers (excluding the few  that throw up code and expect it to work the first time) use tests (they really  do), they just throw them away afterwards. This is not unlike using a single  tissue and throwing the rest of the box away. Tests increase in value as you  move on to changing other parts of the code. They ensure that you follow the  unwritten requirement - that you don't break anything that was previously  working. &lt;BR&gt;&amp;nbsp;Also, I'm going to blog about my adventures along the way.  &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Fitnesse&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;First order of business: install  Fitness locally. I've gotten a download from &lt;A  href="http://fitnesse.org/"&gt;http://fitnesse.org/&lt;/A&gt;.  &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Java&lt;/STRONG&gt;&lt;BR&gt;&amp;nbsp;Requires the Java Runtime. Gotta install  that locally. Also checking to see if my hosting company has it installed.  &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Easily distracted?&lt;/STRONG&gt; &lt;BR&gt;&amp;nbsp;While I'm waiting, I'll  check my email, review the abysmally low visitor stats to FlyingSheep.com, etc.  *Sigh* The Java download page doesn't resolve. Trying again. &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;No  support for Win98&lt;/STRONG&gt;&lt;BR&gt;&amp;nbsp;Hrmm... Latest version of JRE doesn't  support windows98. Let's see if I can find an older version. Yay! 1.4.2 does  support win98. Let's start with that. Note that Fitnesse website says that this  process "really takes very little time and effort". Presuming you have JRE  already installed, and don't have an old OS, and aren't easily distracted.  &lt;BR&gt;&amp;nbsp;I'm saving the smaller version of the two files offered to me (one is  an Offline installer). Now I need to install the Windows Installer in order to  download the rest of the JRE installer, which will then install the JRE itself,  which I can then use to install Fitnesse with "little time and effort".  &lt;BR&gt;&amp;nbsp;I believe it's worthwhile, though, so I'll persevere. (That word never  looks right when I spell it). At least the JRE installer has the honesty to tell  me this "may take several minutes". (:  &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Meanwhile&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;I didn't find anything promising in  my hosting company's website about support for JRE. Perhaps I'll have to switch  to a Linux account after all. Their "deluxe" plan supports Linux, so it would be  more expensive. &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Restarting. . .&lt;/STRONG&gt;&lt;BR&gt;&amp;nbsp;More  later.&lt;/DIV&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1986806-2378374603331671030?l=flyingsheep.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://flyingsheep.blogspot.com/feeds/2378374603331671030/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1986806&amp;postID=2378374603331671030&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/2378374603331671030'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/2378374603331671030'/><link rel='alternate' type='text/html' href='http://flyingsheep.blogspot.com/2007/02/fitnesse-install-i.html' title='Fitnesse Install I'/><author><name>FlyingSheep</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_uk2q-bc5eAQ/SwW62Duw1nI/AAAAAAAAAAM/6CGYucwKJaA/S220/dsc_6061.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1986806.post-7507891505113925668</id><published>2007-02-25T08:16:00.000-05:00</published><updated>2007-02-28T14:51:37.174-05:00</updated><title type='text'>Kingdom Hearts II: A review</title><content type='html'>&lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;STRONG&gt;Kingdom Hearts&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;I finished  Kingdom Hearts II yesterday. I spent about 35 hours on the game, but I didn't do  everything (there's probably another dozen hours or so of meaningful play time).  My final battle stats (standard difficulty) revealed that Mickey had to save me  twice, I finished 82% of the journal, and I used the heartless form 6 times.  Don't worry, I'm not going to spoil anything about the ending, mostly because I  don't understand it myself. &lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;STRONG&gt;Story&lt;/STRONG&gt;&lt;BR&gt;&amp;nbsp;I really liked the  references to the original game. At the start of the game (which felt slow),  there are some flashbacks to things that happened in the original. This were,  possibly too effective, as they made me want to stop playing the sequel and go  back to playing the original again!&lt;BR&gt;&amp;nbsp;A friend of mine (who never  completed the original) went back to finish things up (to get the story line  straight). However, he was frustrated by the lack of camera controls in the  first game. It's easy to gloss over the fact that they got the camera controls  right in KH II. &lt;BR&gt;&amp;nbsp;So, although I enjoy the complexity of the story, I  simply didn't get it. I'm entirely willing to believe that this is my own fault.  I'd be grateful to anyone who can send me a brief summary (or even an FAQ) that  answers any of my story questions about both games. I fear that the answer to  some question might not be "because it made sense to the character", but rather,  "because we needed some extra tension". &lt;BR&gt;&amp;nbsp;Also, it is just me, or does  Sora like Riku more than Kairi? It reminded me of Back to the Future, where Doc  and Marty go around having adventures, leaving Marty's girlfriend passed out on  a porch somewhere. &lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;STRONG&gt;Tron&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;Awesome.  &lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;STRONG&gt;Gameplay&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;I like the  system of ability points, that allow you to customize the active abilities of  each character. I used the commands that allowed me to close in on an enemy  (either in the air, or on land), quite a bit. I especially liked being able to  set general rules for how the entire party battled (e.g. target separate  enemies, target Sora's enemy, etc.)&lt;BR&gt;&amp;nbsp;I never really understood limits  (mostly my fault, I'm sure), I only used Magic for curing myself (with a few  ignorable exceptions), and I barely used Summon at all. &lt;BR&gt;&amp;nbsp;The features  of the game that I didn't use might explain why the game occassionally felt like  a button-mashing competition. I could eat dinner with one hand, and fight a  battle with another (just pressing the X button repeatedly). In fact, there are  at least three battles that come to mind (Beast, Ursula, MCP) that incorporated  the "Hit this button as many times as you can" challenge. &lt;BR&gt;&amp;nbsp;Not to say  that this game is all about pushing buttons quickly. It's also about pushing  buttons at the right time. &lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;STRONG&gt;Tournaments&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;So, you want  me to spend time playing tournaments, but I don't get any experience? No thanks,  I'll play with Pooh instead. &lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;STRONG&gt;Frustrations&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;I was really  frustrated by the random Heartless form. I would try to do one thing (e.g.  change into a form that I could use to defeat an enemy), but the game would  randomly switch me to a much less useful form instead. And then I'd die.  &lt;BR&gt;&amp;nbsp;In a few battles, this eventually drove me to not using forms at all,  for fear that I would randomly get killed. Not very satisfying. &lt;BR&gt;&amp;nbsp;The  random "get saved by Mickey", though? Awesome. That's the way to do random, as  an extra bonus, not as a detour away from a strategy you're trying to employ.  &lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;STRONG&gt;Bugs&lt;/STRONG&gt;&lt;BR&gt;&amp;nbsp;Nothing major, but I  was able to finish a Pirates adventure (get 4 coins) without getting all of the  coins. I simply walked past (not defeated) the enemy that was supposed to drop  the 3rd coin, defeated the enemy with the 4th coin, and then I was done.  &lt;BR&gt;&amp;nbsp;There was a bug with the Struggle as well. I defeated my opponent,  getting all 200 of the orbs, and the words "You win!" came on the screen, but  Sora sighed as if he had lost, and I got the "quit/try again" options.  &lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;STRONG&gt;Ending&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;The final battles  were unrelated to any progress that had been made during the game (the boardgame  Monsters Menance America has a similar flaw), and there were not enough save  points at the end. Don't attempt the ending if you have to go anywhere in the  next few hours - you'll end up leaving your Playstation on all day until you can  come back and finish the game. &lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;STRONG&gt;Overall?&lt;/STRONG&gt; Meh.  &lt;/FONT&gt;&lt;/DIV&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1986806-7507891505113925668?l=flyingsheep.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://flyingsheep.blogspot.com/feeds/7507891505113925668/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1986806&amp;postID=7507891505113925668&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/7507891505113925668'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/7507891505113925668'/><link rel='alternate' type='text/html' href='http://flyingsheep.blogspot.com/2007/02/kingdom-hearts-ii-review.html' title='Kingdom Hearts II: A review'/><author><name>FlyingSheep</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_uk2q-bc5eAQ/SwW62Duw1nI/AAAAAAAAAAM/6CGYucwKJaA/S220/dsc_6061.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1986806.post-1223502162518448241</id><published>2007-02-23T15:29:00.000-05:00</published><updated>2007-02-23T15:37:05.096-05:00</updated><title type='text'>Sundays!</title><content type='html'>&lt;DIV&gt;&lt;STRONG&gt;Sundays!&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;It seems like I have a habit of updating  this blog on Sunday mornings. So, you should check on Monday, for those that  want to check once a week. I also usually send an update during the week, but  rarely on the same day. &lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; I've been writing a blog series  for one of my projects. While I've been working on that project, I haven't been  re-stocking my blog supply. As such, the next blog will start to document that  project. I hope you enjoy them&amp;nbsp;(: &lt;/FONT&gt;&lt;BR&gt;&lt;BR&gt;&lt;/DIV&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1986806-1223502162518448241?l=flyingsheep.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://flyingsheep.blogspot.com/feeds/1223502162518448241/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1986806&amp;postID=1223502162518448241&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/1223502162518448241'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/1223502162518448241'/><link rel='alternate' type='text/html' href='http://flyingsheep.blogspot.com/2007/02/sundays.html' title='Sundays!'/><author><name>FlyingSheep</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_uk2q-bc5eAQ/SwW62Duw1nI/AAAAAAAAAAM/6CGYucwKJaA/S220/dsc_6061.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1986806.post-8484430215046591715</id><published>2007-02-16T15:53:00.000-05:00</published><updated>2007-02-16T16:00:24.311-05:00</updated><title type='text'>Bookmarks</title><content type='html'>&lt;DIV&gt;&lt;STRONG&gt;Links&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;How many links constitute a valid blog  entry? Is there a standard for this sort of thing? Does it help if there are  insightful comments like "Hey, this is cool, check it out"?&lt;BR&gt;&amp;nbsp;Well, I'm  going to clean out my bookmarks, and I invite you to come along for the ride.  Some of these are probably pretty old, but you may have missed them the first  time around. I'll do it all in a single blog. Hope you find something you like.  &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;404&lt;/STRONG&gt; &lt;BR&gt;&amp;nbsp;Quite a few of the links are dead. I  wonder what the average lifespan of a URL is. I'm not sure if that's even  measurable. Someone should take a random sample of the internet (to be  statistically relevant, it'd have to be a large sample) and compute the  percentage of links that are not working. This might make a good distributed  project - instead of solving the human genome or searching for extraterrestrial  intelligence, we can simply prove something that we all know is true. Namely,  that 90% of the internet is useless. (Present blog excluded, of course).  &lt;BR&gt;&amp;nbsp;&lt;BR&gt;&lt;STRONG&gt;Words&lt;/STRONG&gt;&lt;BR&gt;&amp;nbsp;I'm a word guy. I'm not very  visual. That's why I like things like&amp;nbsp;&lt;A  href="http://consc.net/misc/moser.html"&gt;This Is the Title of the Story, Which Is  Also Found Several Times in the Story Itself&lt;/A&gt;. I'm intrigued by the  self-referential. &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Open Courseware&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;I had a  great idea of writing supplemental materials for MIT's &lt;A  href="http://ocw.mit.edu/OcwWeb/index.htm"&gt;open courseware&lt;/A&gt; project,  specifically in the Mathematics sections. There's some great stuff there, it's  like being in a virtual library. I could spend hours browsing (but I need to get  some cleaning done). MIT offers a course in Studies in Poetry: "&lt;A  href="http://ocw.mit.edu/OcwWeb/Literature/21L-704Studies-in-Poetry---Does-Poetry-Matter-Fall2002/CourseHome/index.htm"&gt;Does  Poetry Matter&lt;/A&gt;". The materials include some short (one-page) advice on how to  write a paper. &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;How Tos&lt;/STRONG&gt;&lt;BR&gt;&amp;nbsp;At work, I maintain a  bunch of short "How To" plain text files, most just a few lines long. I think  it's a worthwhile way of organizing information. I'm a checklist type of person.  It's very useful to be able to answer someone's question completely by referring  to a file. Plus, the file may contain bits of information that you would  otherwise forget to mention. Finally, it's easily updateable. &lt;BR&gt;&amp;nbsp;Of  course, there's a little overhead in organizing the files so you know where they  are. &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;MSN?&lt;/STRONG&gt;&lt;BR&gt;&amp;nbsp;Why the hell do I have a bookmark to  MSN.com? Must have been added by some malware (possibly IE itself). Like that  "Links" folder that always keeps appearing. Bookmarks ARE links. While I adore  self-referentiality, I abhor redundancy. Hmm... "adore/abhor" make a nice pair.  I should use them more often. &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Channels?&lt;/STRONG&gt;  &lt;BR&gt;&amp;nbsp;Remember "push" technology? It was a big thing back in 1997. It  eventually found its way into RSS, but only after some false starts.  &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Dailies&lt;/STRONG&gt;&lt;BR&gt;&amp;nbsp;I'm really impressed that&amp;nbsp;&lt;A  href="http://www.bbspot.com"&gt;Brian Briggs&lt;/A&gt; is still at it. BBSpot seems like  it's been around forever, and yet he still manages to serve up 5 links a day. It  seems he's progressed from fighting Slashdot to fighting diggs.  &lt;BR&gt;&amp;nbsp;Comics: &lt;A href="http://www.dilbert.com/"&gt;Dilbert&lt;/A&gt;,&amp;nbsp; &lt;A  href="http://www.doonesbury.com/strip/dailydose/"&gt;Doonesbury&lt;/A&gt;,&amp;nbsp;&lt;A  href="http://www.userfriendly.org/static/"&gt;User Friendly&lt;/A&gt;,&amp;nbsp;&lt;A  href="http://www.sinfest.net/"&gt;Sinfest&lt;/A&gt;, and &lt;A  href="http://www.penny-arcade.com"&gt;Penny Arcade&lt;/A&gt;, of course. I just bought  and read their third book. &lt;BR&gt;&amp;nbsp;&lt;BR&gt;&lt;STRONG&gt;Not quite  Dailies&lt;/STRONG&gt;&lt;BR&gt;&amp;nbsp;Technical Papers:&amp;nbsp;&lt;A  href="http://www.theregister.co.uk/"&gt;The Register&lt;/A&gt;,&amp;nbsp;&lt;A  href="http://arstechnica.com/index.ars"&gt;Ars Technica&lt;/A&gt;, &lt;BR&gt;&amp;nbsp;I feel a  little dishonest about putting a link to Wired News, as the URL I had bookmarked  doesn't work (see dead links above), and I haven't visited the page in so long,  that it could have been invalid for ages. &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Not  Visual&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;I'm not a visual person, but if I were, I'd spend a lot  of time at&amp;nbsp;&lt;A href="http://elfwood.lysator.liu.se/"&gt;Elfwood&lt;/A&gt;,  and&amp;nbsp;the &lt;A href="http://www.thefairycircle.com/"&gt;Fairy Circle&lt;/A&gt;.  &lt;BR&gt;&lt;BR&gt;Thanks for your patience.&lt;/DIV&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1986806-8484430215046591715?l=flyingsheep.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://flyingsheep.blogspot.com/feeds/8484430215046591715/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1986806&amp;postID=8484430215046591715&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/8484430215046591715'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/8484430215046591715'/><link rel='alternate' type='text/html' href='http://flyingsheep.blogspot.com/2007/02/bookmarks.html' title='Bookmarks'/><author><name>FlyingSheep</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_uk2q-bc5eAQ/SwW62Duw1nI/AAAAAAAAAAM/6CGYucwKJaA/S220/dsc_6061.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1986806.post-1765629619683129363</id><published>2007-02-13T20:14:00.000-05:00</published><updated>2007-02-13T20:21:31.223-05:00</updated><title type='text'>Test Blog</title><content type='html'>&lt;DIV&gt;&lt;FONT face=Arial size=2&gt;So, I've updated my blog to Google blog (from  Blogger). &lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;Hope it works. &lt;/FONT&gt;&lt;/DIV&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1986806-1765629619683129363?l=flyingsheep.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://flyingsheep.blogspot.com/feeds/1765629619683129363/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1986806&amp;postID=1765629619683129363&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/1765629619683129363'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/1765629619683129363'/><link rel='alternate' type='text/html' href='http://flyingsheep.blogspot.com/2007/02/test-blog.html' title='Test Blog'/><author><name>FlyingSheep</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_uk2q-bc5eAQ/SwW62Duw1nI/AAAAAAAAAAM/6CGYucwKJaA/S220/dsc_6061.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1986806.post-117133000329141145</id><published>2007-02-12T20:26:00.000-05:00</published><updated>2007-02-12T20:26:43.366-05:00</updated><title type='text'>Wandering Path</title><content type='html'>&lt;DIV&gt;&lt;STRONG&gt;Wandering Path&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;So, in writing a blog, I wanted to  add a reference to a previous blog. Easy enough, right? Just find the permanent  link ("permanent"? seems an odd adjective for something so clearly fleeting),  and add it to the blog entry. &lt;BR&gt;&amp;nbsp;Well, in the process of checking out my  settings (to make sure permanent links were enabled), I find a reference to  Weblogs.com (which is automatically updated when I post). So, I go to check that  out (it's not working yet). This is another task for another day.  &lt;BR&gt;&amp;nbsp;However, a RSS feed that Blogger will &lt;A  href="http://flyingsheep.blogspot.com/atom.xml"&gt;automatically update &lt;/A&gt;is  available. &lt;BR&gt;&amp;nbsp;While I'm poking around, I find a bunch of dead links  (generated by an outdated customized template). So, to clean them up (and the  javascript errors), I decide to replace my custom template with a more generic  (not to mention "working") one. And then I spend some time tweaking.  &lt;BR&gt;&amp;nbsp;Finally, I find the link I'm looking for. Why does everything turn  into such an ordeal? (Alternatively, why am I so easily  distracted?)&lt;BR&gt;&lt;/DIV&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1986806-117133000329141145?l=flyingsheep.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://flyingsheep.blogspot.com/feeds/117133000329141145/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1986806&amp;postID=117133000329141145&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/117133000329141145'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/117133000329141145'/><link rel='alternate' type='text/html' href='http://flyingsheep.blogspot.com/2007/02/wandering-path.html' title='Wandering Path'/><author><name>FlyingSheep</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_uk2q-bc5eAQ/SwW62Duw1nI/AAAAAAAAAAM/6CGYucwKJaA/S220/dsc_6061.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1986806.post-117111495729398815</id><published>2007-02-10T08:42:00.000-05:00</published><updated>2007-02-10T08:42:37.606-05:00</updated><title type='text'>iPod Interlude</title><content type='html'>&lt;DIV&gt;&lt;STRONG&gt;iPod&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;I bought my wife an iPod last year. It  stopped working a while ago, and neither of us could figure out what was wrong  with it or how to fix it. So, she brought it to an Apple store.  &lt;BR&gt;&amp;nbsp;Neither of us were expecting this to go smoothly. I mean, how could  they debug my computer setup from the store? Considering that iPod technical  failures are probably rare, the most likely explanation is a configuration  error. Sure, I've checked the USB drivers, reinstalled iTunes, etc. but would  they take my word for it? I certainly wouldn't. &lt;BR&gt;&amp;nbsp;Anyways, she went to  the store, explained the problem, and they checked out the iPod. They determined  that it was a hardware failure, and not user-error. They gave her a new one.  &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Endorsement?&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;I don't know, is this an  endorsement or not? On the one hand, the excellent customer service at the store  was unbelievable. On the other hand, the iPod did have a hardware failure. I  suppose these failures are a fact of life when you produce so many (even if the  error rate is incrediblely low), so this is an endorsement. As long as the  replacement works (: And, so far, it's worked fine. &lt;BR&gt;&lt;/DIV&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1986806-117111495729398815?l=flyingsheep.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://flyingsheep.blogspot.com/feeds/117111495729398815/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1986806&amp;postID=117111495729398815&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/117111495729398815'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/117111495729398815'/><link rel='alternate' type='text/html' href='http://flyingsheep.blogspot.com/2007/02/ipod-interlude.html' title='iPod Interlude'/><author><name>FlyingSheep</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_uk2q-bc5eAQ/SwW62Duw1nI/AAAAAAAAAAM/6CGYucwKJaA/S220/dsc_6061.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1986806.post-117082752794050525</id><published>2007-02-07T00:52:00.000-05:00</published><updated>2007-02-07T00:52:08.006-05:00</updated><title type='text'>Content Problem II</title><content type='html'>&lt;DIV&gt;In a previous blog (&lt;A  href="http://flyingsheep.blogspot.com/2007/01/reformatting.html"&gt;http://flyingsheep.blogspot.com/2007/01/reformatting.html&lt;/A&gt;),  I talked about the Content Problem. Some solutions:&lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Just do  it&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;Just suck it up and generate the content yourself. It's not  enough to claim, "I have a proof for this, but the margin is too small to  contain it." You actually have to work through the details. &lt;BR&gt;&amp;nbsp;On the  other hand, how else will people recognize that you solved the problem (which  inspired you in the first place) unless you actually provide the content? It's  not enough to build a better mousetrap, you need to design the promotional  material that convince others to buy it. &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Structure breeds  creativity &lt;/STRONG&gt;(the Rosewater solution)&lt;BR&gt;&amp;nbsp;Break content into  categories. If one category isn't yielding any new inspiration, switch to  another. Set aside a certain time to generate content (each Sunday morning, for  example). &lt;BR&gt;&amp;nbsp;Partition the content you've generated into multiple  dimensions. An oil painting of mushrooms and a watercolor of flowers have at  least two dimensions - medium and subject. Then fill in the gaps (e.g. create an  oil painting of flowers). &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;User-generated&lt;/STRONG&gt;&lt;BR&gt;&amp;nbsp;Trick  your users into creating content for you. Creating a system/engine that makes it  as easy as possible to create content may be a more interesting challenge (and  thus, more likely to get done) than generating the content itself. &lt;BR&gt;&amp;nbsp;Of  course, the best part is that you can use this content-generation tool yourself  (:&amp;nbsp;&lt;BR&gt;&amp;nbsp;&lt;FONT face=Arial size=2&gt;This also might lead to the Wikipedia  problem. More on that later. &lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&lt;BR&gt;&lt;STRONG&gt;Random computer  generated&lt;/STRONG&gt;&lt;BR&gt;&amp;nbsp;This is similar to the matrix-filling idea above.  Write a program to generate the content automatically (again, possible a more  interested problem). Of course, the test of your program would be the quality of  the results - are they interesting? And for how long. &lt;BR&gt;&amp;nbsp;For example, I  could fill blogs with interesting (randomly generated) subject lines from spam  I've received. Some of these subject lines are unintentionally insightful (or,  for that matter, entertaining when &lt;A  href="http://spamusement.com/"&gt;illustrated&lt;/A&gt; ).&lt;BR&gt;&amp;nbsp;This is basically  found art. &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Stolen from other sources&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;Example:  One of my first projects was a random horoscope (if you remember that, you've  been a FlyingSheep Fan for a long long time). I grabbed a bunch of ambiguous  predictions ("You are feeling unusually spiffy today.") and would serve up a few  chosen at random. Alternatively, I could have classified them (something about  romance, something about finance, something about friends or family) and added a  little more structure (possibly the results would be more formulaic). Or I could  have written a little program to play Mad-libs, and generate new content.  &lt;BR&gt;&lt;BR&gt;&amp;nbsp;So, these are some solutions to the content problem. There are  probably more, but I guess my point (if I had one) would be to make sure that  you solve the content problem (using one of these ideas, or something else)  early on in your project.&lt;/DIV&gt; &lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1986806-117082752794050525?l=flyingsheep.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://flyingsheep.blogspot.com/feeds/117082752794050525/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1986806&amp;postID=117082752794050525&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/117082752794050525'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/117082752794050525'/><link rel='alternate' type='text/html' href='http://flyingsheep.blogspot.com/2007/02/content-problem-ii.html' title='Content Problem II'/><author><name>FlyingSheep</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_uk2q-bc5eAQ/SwW62Duw1nI/AAAAAAAAAAM/6CGYucwKJaA/S220/dsc_6061.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1986806.post-117059840047600906</id><published>2007-02-04T09:13:00.000-05:00</published><updated>2007-02-04T09:13:20.543-05:00</updated><title type='text'>Content Problem I</title><content type='html'>&lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;STRONG&gt;Unfinished Symphonies&lt;/STRONG&gt;&lt;BR&gt;&amp;nbsp;How many times has this  happened to you? You have an idea for a program (painting, poem, wood-working  project), and think, "That would be a fun challenge". You do the difficult bits  first (naturally) as a proof of concept. Then, once you've shown yourself that  it's possible, you get bogged down in the details and never finish.  &lt;BR&gt;&amp;nbsp;See, I think that your main objective in these projects is not the  final result that you can use or show to people or whatever, but in proving that  you can overcome the challenge that lay in the initial idea. Unfortunately, I do  this all the time. &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Blogging&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;One  self-referential example is this blog. Writing the system (e.g. the program to  store, retrieve, and send these thoughts that you're reading now) was the  challenge, and I have a working proof of concept. It's not perfect (I need to  work on some minor formatting issues, and I'm not sure if the Scheduled Task  will run when I need it to), but the failure of this project (i.e. blogging  regularly) will not be a failure of this system - after all, I can always blog  "manually" - but from a lack of content. &lt;BR&gt;&lt;BR&gt;&amp;nbsp;I call this the content  problem. I've got some solutions, which I'll list in a separate blog. (See the  tricks I have to use to extend my meager portion of  content?)&lt;BR&gt;&lt;BR&gt;&lt;/DIV&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1986806-117059840047600906?l=flyingsheep.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://flyingsheep.blogspot.com/feeds/117059840047600906/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1986806&amp;postID=117059840047600906&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/117059840047600906'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/117059840047600906'/><link rel='alternate' type='text/html' href='http://flyingsheep.blogspot.com/2007/02/content-problem-i.html' title='Content Problem I'/><author><name>FlyingSheep</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_uk2q-bc5eAQ/SwW62Duw1nI/AAAAAAAAAAM/6CGYucwKJaA/S220/dsc_6061.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1986806.post-117038439928574860</id><published>2007-02-01T21:46:00.000-05:00</published><updated>2007-02-01T21:47:54.713-05:00</updated><title type='text'>Music Recap</title><content type='html'>&lt;span style="font-family:Arial;font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;Music Recap&lt;br /&gt;&lt;/strong&gt; Well, my Day of Music (tm) was really successful. I knew I was being optimistic when I invited a bunch of people who had never played together before (some hadn't played in years, some hadn't played with others at all) and expected it to go well. In fact, it went better than that.&lt;br /&gt; So, where's the (un-)promised MP3 file? Sorry, the DAT recorder wasn't working. Maybe next time.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Group Creativity&lt;br /&gt;&lt;/strong&gt; One of my memories from high school is helping to paint some scenery for a play one weekend. Despite most of us having little to no artistic talent, we managed to put something reasonable together (guided by the talented few). It was a pretty cool community-building feeling, and I've often wondered how to recreate it.&lt;br /&gt; I guess the musical equivalent would be one of those &lt;a href="http://www.gotickets.com/concert/do-it-yourself_messiah.php"&gt;sing-it-yourself Messiah&lt;/a&gt;s that  get arranged around holidays. I once did one for Faure's Requiem with my brother. It was a lot of fun (:&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;More Music&lt;/strong&gt;&lt;br /&gt;&lt;span style="font-family:Arial;font-size:85%;"&gt;    &lt;span style="font-family:Times New Roman;font-size:100%;"&gt;One of the unexpected results of this Day of Music is the opportunity to play with a local combo. I've met with them once so far, and we've got our first gig on the Sunday before Valentine's Day. &lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1986806-117038439928574860?l=flyingsheep.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://flyingsheep.blogspot.com/feeds/117038439928574860/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1986806&amp;postID=117038439928574860&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/117038439928574860'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/117038439928574860'/><link rel='alternate' type='text/html' href='http://flyingsheep.blogspot.com/2007/02/music-recap.html' title='Music Recap'/><author><name>FlyingSheep</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_uk2q-bc5eAQ/SwW62Duw1nI/AAAAAAAAAAM/6CGYucwKJaA/S220/dsc_6061.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1986806.post-116999929021000348</id><published>2007-01-28T10:48:00.000-05:00</published><updated>2007-01-28T10:48:10.270-05:00</updated><title type='text'>UG Session Report</title><content type='html'>&lt;FONT face=Arial size=2&gt; &lt;DIV&gt;&lt;BR&gt;What is Unity Games XII?&lt;BR&gt;&amp;nbsp;&lt;A  href="http://unitygames.org/"&gt;Unity Games &lt;/A&gt;is a loose collection of game  groups in eastern MA. We play strategy board games, which is difficult to define  or categorize, so I won't attempt to do either. A few times a year, UG organizes  a convention for open boardgaming. It's always a blast (: &lt;BR&gt;&amp;nbsp;&lt;BR&gt;What is  a Session Report?&lt;BR&gt;&amp;nbsp;Session reports are a list of games played along with  commentary. While writing a session report feels somewhat self-centered (as  does, say, blogging), I've really enjoyed reading other people's session  reports. It's a good way to learn about new games, compare my opinions to those  of other gamers, and even to game vicariously. &lt;/DIV&gt; &lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;A href="http://boardgamegeek.com/game/15318"&gt;Palazzo&lt;/A&gt;(45  minutes)&lt;BR&gt;&amp;nbsp;Chip: 36&lt;BR&gt;&amp;nbsp;Gary: 30&lt;BR&gt;&amp;nbsp;Mike: 27&lt;BR&gt;&amp;nbsp;Luke: 12  (or, possibly, 21)&lt;/DIV&gt; &lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&amp;nbsp;I received Palazzo as a Christmas gift, but haven't had a chance to  play it yet. I brought it to UG in the hopes of finding someone to teach it to  me, and Mike was kind enough to oblige. &lt;BR&gt;&amp;nbsp;I started the game off by  taking money - figuring that I didn't want to pay 9 for a tile, and I didn't  want to start an auction for a random tile without having a good feel for the  game. Gary and Luke did likewise, and then Mike kicked off with the real game by  running the first auction. &lt;BR&gt;A few assorted observations: &lt;BR&gt;* Tiles seemed  to be valued at about 7 &amp;lt;random currency&amp;gt; each, unless, of course,  multiple players needed a particular tile. &lt;BR&gt;* We never got to the situation  where there were too many tiles to auction (so that they would be drafted  instead). &lt;BR&gt;* Drafting money is more difficult than it initially appears. Sets  of the same value across multiple colors is worth 15 (generic money). While this  is obviously a good way to use cards whose values sum to less than 15 (e.g.  three 4 cards), it may even be worthwhile to use three 6 cards in this way, as  they can all be used together. &lt;BR&gt;* Luke's alternate score is based on placing  his last tile on top of a existing building instead of as a separate building.  &lt;BR&gt;&amp;nbsp;I tend to like Reiner Knizia's games, and this was no exception.  Auctioning, drafting (money), building in order (a la Lost Cities), set  collection - all in under an hour. I can't wait to play again. &lt;/DIV&gt; &lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;A href="http://boardgamegeek.com/game/25417"&gt;BattleLore&lt;/A&gt; (1  hour)&lt;BR&gt;&amp;nbsp;Craig: 4 VP&lt;BR&gt;&amp;nbsp;Chip: 3 VP&lt;/DIV&gt; &lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&amp;nbsp;Although playing a two-player game seems at odds with the communal  nature of Unity Games, I couldn't resist Craig's offer to learn this game.  Another friend of mine received BattleLore as a Christmas gift, so I've been  meaning to learn the system. While it's very similar to &lt;A  href="http://boardgamegeek.com/game/10630"&gt;Memoir '44&lt;/A&gt;, the fantasy theme is  much more appealing to me. &lt;BR&gt;&amp;nbsp;We played a basic scenario (without Magic  or Lore), in which my archers were defending themselves against Craig's mounted  swordsmen. I had the advantage in hand size (6 to his 4), but I believe he had  more powerful units overall. I was fortunate to draw a card early on that  allowed each of my archers to attack twice (so long as they were not in melee,  and did not move). An early shot forced one of Craig's units to retreat, which  then, in turn, freed up those archers to attack that same cavalry unit.  &lt;BR&gt;&amp;nbsp;Craig struggled to find cards that made use of the bulk of his army in  the center of the board. However, he cleverly copied one of my cards (and, I  think, got more us of it than I did). It was a very close game, both of us  having opportunities to win during the last few rounds. &lt;BR&gt;&amp;nbsp;One of my  friends from college got a copy of BattleLore for, and I'm looking forward to  teaching him the basic game and exploring some of the advanced aspects of the  game. &lt;/DIV&gt; &lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;A href="http://boardgamegeek.com/game/18258"&gt;Mission: Red Planet&lt;/A&gt; (1  hour)&lt;BR&gt;&amp;nbsp;Marc: 61&lt;BR&gt;&amp;nbsp;Chip: 32&lt;BR&gt;&amp;nbsp;Matt: 31&lt;BR&gt;&amp;nbsp;Bill:  23&lt;BR&gt;&amp;nbsp;Nate: 15&lt;/DIV&gt; &lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&amp;nbsp;While waiting for Erica and Joe to finish a game of Tikal, I started  a quick "half-hour" game of Mission: Red Planet. This is an area control game  with simultaneous role selection (not unlike &lt;A  href="http://boardgamegeek.com/game/478"&gt;Citadels&lt;/A&gt;).&lt;BR&gt;&amp;nbsp;There's a  little bit of "take that" in the game, as players occasionally have to decide  who to hurt with actions that help themselves. In fact, at one point Nate and  Matt took the same action (Femme Fatale, I think) and effectively cancelled each  other out, to neither one's advantage. &lt;BR&gt;&amp;nbsp;The end scores reflect the  number of bonus cards each of us scored (Marc completed three, Matt and I each  completed one (I think), and I think Nate did not complete any). These bonus  cards are significant, and (not to whine) each time that I tried to draw a bonus  card, I got a pretty rock (e.g. useless card) instead. Bonus cards are similar  to &lt;A href="http://boardgamegeek.com/game/9209"&gt;Ticket to Ride&lt;/A&gt;'s destination  cards, and I think some additional selection (e.g. draw three, keep one) would  benefit the game. (In fact, I recommend a similar modification to the Secret  Objective cards in &lt;A href="http://boardgamegeek.com/game/15363"&gt;Nexus Ops&lt;/A&gt;).  In all three games, bonus cards also create a sense of strategic goals, which I  felt was a little lacking in this game. &lt;/DIV&gt; &lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;A href="http://boardgamegeek.com/game/17240"&gt;That's Life&lt;/A&gt; (20  minutes)&lt;BR&gt;&amp;nbsp;Karl: 31&lt;BR&gt;&amp;nbsp;Joe: 6&lt;BR&gt;&amp;nbsp;Erica: 3&lt;BR&gt;&amp;nbsp;Chip:  0&lt;/DIV&gt; &lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&amp;nbsp;After dinner at Acapulcos, Karl talked us into returning to UG for  one last 20-minute game (that did, in fact, turn out to take 20 minutes). That's  life is a simple game that still allows for some strategic thought -  unfortunately, I didn't have any strategy left in my brain. While my score may  seem (and is) pathetically low, I was elated to discover that it wasn't actually  negative. &lt;BR&gt;&amp;nbsp;This was a good learning game (especially for people who  learn from their mistakes), and I like the game despite how poorly I played it.  I even suggested playing it a second time (unusual for me), but I was out-voted.  &lt;/DIV&gt; &lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;Thanks&lt;BR&gt;&amp;nbsp;Thanks to Dave Bernazzani and to the UG Steering Committee  for yet another fabulous day of gaming! &lt;/FONT&gt;&lt;/DIV&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1986806-116999929021000348?l=flyingsheep.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://flyingsheep.blogspot.com/feeds/116999929021000348/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1986806&amp;postID=116999929021000348&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/116999929021000348'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/116999929021000348'/><link rel='alternate' type='text/html' href='http://flyingsheep.blogspot.com/2007/01/ug-session-report.html' title='UG Session Report'/><author><name>FlyingSheep</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_uk2q-bc5eAQ/SwW62Duw1nI/AAAAAAAAAAM/6CGYucwKJaA/S220/dsc_6061.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1986806.post-116981342191282123</id><published>2007-01-26T07:10:00.000-05:00</published><updated>2007-01-26T07:10:21.986-05:00</updated><title type='text'>Work and Play</title><content type='html'>&lt;DIV&gt;Everything I do can be divided into Work and Play.  &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Work&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;Well, this is fairly obvious. I consider  my job to be work, and, although there are a few other chores that I do (making  dinner, paying bills, cleaning occasionally), I don't really consider them work.  &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Play&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;I play a ton of games (and yet, still not  as many as I'd like). Mostly tabletop board/card strategy games (chiefly Magic),  and some Playstation games (most recently, Kingdom Hearts). I used to play  computer games as well (most recently, well, Diablo II), but I don't keep my  system upgraded any more. My PS2 is my lazy solution to electronic gaming, and  I'm pretty happy with it. &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Play II&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;I also play  music. Later this afternoon (which will be in the past by the time you read  this), I'll get together with a small group of musicians and play (and record)  some old standards. I would promise to upload an mp3, but (a) I don't know if  we'll be any good, and (b) I don't know if I would actually get around to  uploading it. &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Not Play&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;One version of the word  "play" that I don't do is play sports. While I am a little disappointed that I  can't fulfill every meaning (as that would have a nice completeness to it), I'm  not so upset as to try to remedy the situation. &lt;BR&gt;&amp;nbsp;Does bowling count as  playing a sport? I doubt it.  &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Completeness&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;Dictionary.com (Actually, it's  dictionary.reference.com now, but *shrug*) lists 21 definitions for the noun  "play", along with another 83 verbs and "verb phrases" - including one that I  unintentionally included in this sentence ("play along"). Rather than bore you  to possible death (or distraction), I will use the 27 American Heritage  definitions instead. &lt;BR&gt;&amp;nbsp;Along with the ones I noted above (amusement,  recreation, and music, which are not really different), there's also jesting  (which I do occasionally), acting carelessly (akin to flirting), theatrical  acting (used to, not anymore), betting (not really), pretending (e.g. "played  the diligent blogger"), manipulating (e.g. "playing two opponents against each  other"), and finally, torturing fish ("To exhaust (a hooked fish) by allowing it  to pull on the line") which gets its own definition entry for some bizarre  reason. &lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&lt;/DIV&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1986806-116981342191282123?l=flyingsheep.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://flyingsheep.blogspot.com/feeds/116981342191282123/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1986806&amp;postID=116981342191282123&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/116981342191282123'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/116981342191282123'/><link rel='alternate' type='text/html' href='http://flyingsheep.blogspot.com/2007/01/work-and-play.html' title='Work and Play'/><author><name>FlyingSheep</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_uk2q-bc5eAQ/SwW62Duw1nI/AAAAAAAAAAM/6CGYucwKJaA/S220/dsc_6061.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1986806.post-116955437920738129</id><published>2007-01-23T07:12:00.000-05:00</published><updated>2007-01-23T07:12:59.283-05:00</updated><title type='text'>Automation</title><content type='html'>&lt;DIV&gt;In my last post (don't expect this sort of continuity to, err, continue), I  mentioned that I will attempt to post more regularly by building up a reserve of  content and then doling it out in a metered fashion. I probably didn't use those  exact words, but that was my intent.  &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Automation&lt;/STRONG&gt;&lt;BR&gt;&amp;nbsp;To that end, I've written a little  script (very little) that will do pick the next content in line from the  reserve, put it into a pre-addressed email, and pop up a little window which  will wait (patiently) for me to click Send. &lt;BR&gt;&amp;nbsp;I'm hoping to schedule  this script to run each time if it's been more than a few days since my last  post. Otherwise, I may just have it run each time I start the computer.  &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Pithy Sayings&lt;/STRONG&gt;&lt;BR&gt;&amp;nbsp;This is a bit of a tangent into  work philosophy. I've always liked these sayings:&lt;BR&gt;&lt;BR&gt;What gets measured,  gets done. &lt;BR&gt;What gets tested, works. &lt;BR&gt;&lt;BR&gt;&amp;nbsp;I like these versions even  better. &lt;BR&gt;What gets measured &lt;EM&gt;automatically, always &lt;/EM&gt;gets done.  &lt;BR&gt;What gets tested &lt;EM&gt;automatically, always &lt;/EM&gt;works.  &lt;BR&gt;&lt;BR&gt;&amp;nbsp;Oversimplification? Sure. But what rule is not without its  exceptions?&lt;/DIV&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1986806-116955437920738129?l=flyingsheep.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://flyingsheep.blogspot.com/feeds/116955437920738129/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1986806&amp;postID=116955437920738129&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/116955437920738129'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/116955437920738129'/><link rel='alternate' type='text/html' href='http://flyingsheep.blogspot.com/2007/01/automation.html' title='Automation'/><author><name>FlyingSheep</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_uk2q-bc5eAQ/SwW62Duw1nI/AAAAAAAAAAM/6CGYucwKJaA/S220/dsc_6061.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1986806.post-116939095236834813</id><published>2007-01-21T09:49:00.000-05:00</published><updated>2007-01-21T09:49:12.416-05:00</updated><title type='text'>Reformatting</title><content type='html'>&lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;STRONG&gt;Reformatting&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;I've made  some formatting changes. This should get rid of some dead links and javascript  errors that my old customized template was generating. Hope you like it (:  &lt;BR&gt;&lt;/FONT&gt;&lt;/DIV&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1986806-116939095236834813?l=flyingsheep.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://flyingsheep.blogspot.com/feeds/116939095236834813/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1986806&amp;postID=116939095236834813&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/116939095236834813'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/116939095236834813'/><link rel='alternate' type='text/html' href='http://flyingsheep.blogspot.com/2007/01/reformatting.html' title='Reformatting'/><author><name>FlyingSheep</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_uk2q-bc5eAQ/SwW62Duw1nI/AAAAAAAAAAM/6CGYucwKJaA/S220/dsc_6061.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1986806.post-116929918494613430</id><published>2007-01-20T08:19:00.000-05:00</published><updated>2007-01-20T08:19:48.693-05:00</updated><title type='text'>Auto-Blog</title><content type='html'>&lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&amp;nbsp;So, I'm thinking about this blog, once  active, then neglected, now active again. I'd like to lure you here on a  relatively frequent basis, and not disappoint you with stale content when you  arrive. There's a good way of doing that, e.g. have a regular schedule and stick  with it. There are a few problems with this. &lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;STRONG&gt;Wet-ware&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;Although I have  plenty of interesting (one might say bizarre) thoughts during the week, I have  them at inconvenient times (e.g. not when I'm sitting at a computer, trying to  come up with something to write in my blog). If I had some sort of wet-ware  installed directly into my brain, you know, with some sort of wireless internet  connection, then when inspiration struck I could simply send an email and there  that thought would be (perfectly expressed) on my blog. &lt;BR&gt;&amp;nbsp;Come to think  of it, that could be potentially embarrassing. &lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;STRONG&gt;Regularity&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;The second  problem is that I'm not always at my home computer on, say, every Tuesday and  Thursday. And, while I am at work (almost) every weekday, I simply don't feel  right (conscious-wise) blogging from work. I mean, if my boss (who is very  understanding) asked me what I was doing, "Working on my blog" is not a response  I want to give (understanding nonwithstanding - don't some words seem odd  together?)&lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;STRONG&gt;Solution? &lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;Well, I'm  going to try to compile a list of random blog-worthy thoughts (and, it doesn't  take much to be "blog-worthy". Pity the thought that doesn't meet that low  threshold), and I'll simply try to force myself to update the blog each time I  log on from home (which should be maybe once during the week, and again on the  weekend). &lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;STRONG&gt;Thursdays&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;So, my  recommendation is to check this blog each Thursday. By then, you should at least  see one or two updates from the previous weekend, any possibly during the week.  Although you may be tempted to check more often, well, I recommend against it. I  don't want to disappoint. &lt;/FONT&gt;&lt;/DIV&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1986806-116929918494613430?l=flyingsheep.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://flyingsheep.blogspot.com/feeds/116929918494613430/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1986806&amp;postID=116929918494613430&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/116929918494613430'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/116929918494613430'/><link rel='alternate' type='text/html' href='http://flyingsheep.blogspot.com/2007/01/auto-blog.html' title='Auto-Blog'/><author><name>FlyingSheep</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_uk2q-bc5eAQ/SwW62Duw1nI/AAAAAAAAAAM/6CGYucwKJaA/S220/dsc_6061.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1986806.post-116921203550874486</id><published>2007-01-19T08:07:00.000-05:00</published><updated>2007-01-19T08:07:16.800-05:00</updated><title type='text'>Search</title><content type='html'>&lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;STRONG&gt;Searching...&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Most FlyingSheep.com visitors  arrive via a search engine (Yahoo, Live, etc.) using the keyword "FlyingSheep".  What exactly are you looking for? Perhaps a reference to the &lt;A  href="http://orangecow.org/pythonet/sketches/sheep.htm"&gt;Monty Python skit&lt;/A&gt;?  For &lt;A href="http://www.flyingsheep.org/"&gt;Harold&lt;/A&gt;? Or, perhaps you're looking  for the person who wrote that insightful review of &lt;A  href="http://www.otb-games.com/qwitch/reviews/flyingsheep.html"&gt;Qwitch&lt;/A&gt;  (that's me). &lt;/FONT&gt;&lt;/DIV&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1986806-116921203550874486?l=flyingsheep.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://flyingsheep.blogspot.com/feeds/116921203550874486/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1986806&amp;postID=116921203550874486&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/116921203550874486'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/116921203550874486'/><link rel='alternate' type='text/html' href='http://flyingsheep.blogspot.com/2007/01/search.html' title='Search'/><author><name>FlyingSheep</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_uk2q-bc5eAQ/SwW62Duw1nI/AAAAAAAAAAM/6CGYucwKJaA/S220/dsc_6061.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1986806.post-116912430818116664</id><published>2007-01-18T07:45:00.000-05:00</published><updated>2007-01-18T07:45:08.186-05:00</updated><title type='text'>This is a test blog</title><content type='html'>&lt;DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;STRONG&gt;Test&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&lt;FONT face=Arial size=2&gt;I send this by email. Isn't technology wonderful?  &lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1986806-116912430818116664?l=flyingsheep.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://flyingsheep.blogspot.com/feeds/116912430818116664/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1986806&amp;postID=116912430818116664&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/116912430818116664'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/116912430818116664'/><link rel='alternate' type='text/html' href='http://flyingsheep.blogspot.com/2007/01/this-is-test-blog.html' title='This is a test blog'/><author><name>FlyingSheep</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_uk2q-bc5eAQ/SwW62Duw1nI/AAAAAAAAAAM/6CGYucwKJaA/S220/dsc_6061.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1986806.post-116912366450136553</id><published>2007-01-18T07:28:00.000-05:00</published><updated>2007-01-18T07:34:24.516-05:00</updated><title type='text'></title><content type='html'>Hi there!&lt;br /&gt;&lt;strong&gt;Apologies&lt;/strong&gt;&lt;br /&gt;It's been two years since my last blog, so I should start off by apologizing for not writing sooner, not keeping in touch, not calling as often as I promised.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Migration&lt;/strong&gt;&lt;br /&gt;One of my entries (shortly before I stopped writing altogether) mentions moving to a new server on August 03, 2004. Well, I've moved again, changing hosting companies along the way. After setting up a new blog with my hosting company (only to discover ads across the top of the page), I recalled this neglected (&lt;em&gt;sorry&lt;/em&gt;) blog, and decided to resurrect it (so to speak).&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Phoenix&lt;/strong&gt;&lt;br /&gt;You know, rising from the ashes and stuff?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1986806-116912366450136553?l=flyingsheep.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://flyingsheep.blogspot.com/feeds/116912366450136553/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1986806&amp;postID=116912366450136553&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/116912366450136553'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/116912366450136553'/><link rel='alternate' type='text/html' href='http://flyingsheep.blogspot.com/2007/01/hi-there-apologies-its-been-two-years.html' title=''/><author><name>FlyingSheep</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_uk2q-bc5eAQ/SwW62Duw1nI/AAAAAAAAAAM/6CGYucwKJaA/S220/dsc_6061.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1986806.post-109880579882959351</id><published>2004-10-26T11:49:00.000-04:00</published><updated>2004-10-26T11:49:58.830-04:00</updated><title type='text'></title><content type='html'>Session Report: October 25, 2004&lt;br /&gt;Games Played: Metro, Exxtra, Atlantic Star&lt;br /&gt;Gamers: Chip, Arkady, Rob, Josh, Sara, Chris&lt;br /&gt;&lt;br /&gt;Thanks to Chris for hosting, and welcome to our newest SOG member, Arkady. &lt;br /&gt;&lt;br /&gt;METRO (0:22)&lt;br /&gt;	Josh: 	65&lt;br /&gt;	Sara: 	51&lt;br /&gt;	Arkady: 39&lt;br /&gt;	Rob: 	39&lt;br /&gt;	Chip: 	34&lt;br /&gt;&lt;br /&gt;	We set up Metro for 3 players, then 4 players, and then again for 5 players, as people arrived (not unlike Gandalf inviting the dwarves into Beorn's house in The Hobbit). Metro's rules are extremely simply and easy to explain, and we were off. &lt;br /&gt;	One of the interesting parts of Metro is how difficult it is to tell who is in the lead. Counting the number of trains remaining for each player is a good way of getting a general idea, but without tracing the length of each train, it's more of a gut feel. I considered Sara the leader (and I wasn't far off), and tried to limit her trains when the opportunity arose. Rob considered me a threat, and closed off at least two of my paths. Arkady scored some longish train paths, and he became a target as well. Josh completed the highest-scoring path late in the game (for over 20 points), placing him safely in the lead. &lt;br /&gt;	Metro is a fun game - the rules are simple to explain, and it plays quickly (without the rotating tiles variant). It's difficult to accurately tag one player as the leader, and players don't really have a ton of control over the final outcome. I'm happy with the game and would gladly play it again. &lt;br /&gt;&lt;br /&gt;EXXTRA (0:26)&lt;br /&gt;	Josh: 	21&lt;br /&gt;	Chip: 	13&lt;br /&gt;	Chris: 	13&lt;br /&gt;	Arkady:  8&lt;br /&gt;	Sara: 	 7&lt;br /&gt;	Rob: 	 4&lt;br /&gt;&lt;br /&gt;	Josh pulled out Exxtra, my newest favorite game. He explained all of the rules and we started rolling. &lt;br /&gt;	My favorite part of this game is the "stop the leader" group influence ending. At one point, Josh was within striking distance of the finish line with a 76 on the 3-point level. Rob was the last player before Josh, and we had to convince him to not place his 71 on the 4-point level, but rather to keep rolling to dislodge Josh. Rob was willing to "take one for the team" so to speak (especially when Josh started to protest his "non-winningness"), and the dice gods smiled and granted Rob the unlikely 76 required to keep Josh from winning (that turn). I believe Josh won in the following round, but at least we postponed the inevitable a bit. &lt;br /&gt;	Great game - I've got to get a copy for myself. &lt;br /&gt;&lt;br /&gt;ATLANTIC STAR (1:20)&lt;br /&gt;	Chris: 	49&lt;br /&gt;	Arkady: 48&lt;br /&gt;	Rob: 	36&lt;br /&gt;	Josh: 	35&lt;br /&gt;	Chip: 	34&lt;br /&gt;	Sara: 	20&lt;br /&gt;&lt;br /&gt;	Josh suggested Atlantic Star, designed by Dirk Henn (who also created Alhambra, so I had high expectations). I wasn't disappointed. Chris, Josh, and Rob (I believe) had played this (or the equivalent, Show Manager) before, and Sara, Arkady, and I were new players. &lt;br /&gt;	Someone (Arkady?) completed the first cruise in green, and placed in the highest scoring slot (5 stars). I was working on completing a green cruise as well, but I paid more attention to having the correct letter combinations (without having more than 2 excess cards) than creating a high scoring cruise. As the five star cruise has the biggest impact on the game, my first cruise would end up hurting me a lot. I held onto the second highest slot on two other cruises, and used my other cruise for money. I should have spent more time accumulating high value cards. &lt;br /&gt;	During the last round, Rob, Arkady, and Chris (not co-incidentally, the top three scorers), were working on completing the highest-value cruise (green), and Josh, Sara, and myself were competing to complete a red cruise (the second-highest value). Rob complained about Arkady taking the good tiles before he got a chance at them (as the turn order was Arkady -&gt; Rob -&gt; Chris), but I'm not convinced of his logic. If this were the case, then Chris, who was also competing for the same tiles, should have been in an even worse situation - but Chris won the game. &lt;br /&gt;	This game was a lot of fun, and I look forward to playing it (or Show Manager) sometime soon.&lt;br /&gt;&lt;br /&gt;.chip&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1986806-109880579882959351?l=flyingsheep.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://flyingsheep.blogspot.com/feeds/109880579882959351/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1986806&amp;postID=109880579882959351&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/109880579882959351'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/109880579882959351'/><link rel='alternate' type='text/html' href='http://flyingsheep.blogspot.com/2004/10/session-report-october-25-2004-games.html' title=''/><author><name>FlyingSheep</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_uk2q-bc5eAQ/SwW62Duw1nI/AAAAAAAAAAM/6CGYucwKJaA/S220/dsc_6061.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1986806.post-109664843933084317</id><published>2004-10-01T13:32:00.000-04:00</published><updated>2004-10-01T12:33:59.330-04:00</updated><title type='text'></title><content type='html'>Session Report: September 30, 2004&lt;br /&gt;&lt;br /&gt;Games Played: Magic, Password, Apples to Apples&lt;br /&gt;&lt;br /&gt;Gamers: Steven, Rob, Chip, Ryan, Motor, Erick, Rob H. Erin, Bobby&lt;br /&gt;&lt;br /&gt;The play-for-keeps decks were quite popular (: Rob, Ryan, and Motor each won a deck. I'll have to make some more.&lt;br /&gt;&lt;br /&gt;MAGIC (0:31) Chip: 2 Steven: 0&lt;br /&gt;&lt;br /&gt;My only match victory came early. I played my blue deck against Steven's black discard deck. I got off to a quick start with my Vedalken Engineers, and beat him down with some early Spire Golems and later Quicksilver Behemoths. He played Megrim and various discard inducers (such as Ravenous Rats), but it wasn't enough to disrupt my deck.&lt;br /&gt;&lt;img src="http://mi.wizards.com/global/images/magic/general/Quicksilver_Behemoth.jpg" /&gt; &lt;img src="http://mi.wizards.com/global/images/magic/general/Ravenous_Rats.jpg" /&gt;&lt;br /&gt;&lt;br /&gt;MAGIC (0:43) Rob: 2 Chip: 0&lt;br /&gt;&lt;br /&gt;Rob was next, with his Elf deck, including an infinite creature combination - Voice of the Woods + Intruder Alarm. I held him off as long as I could, bouncing his Elves occasionally with Echoing Truth. I was able to deal a lot of damage to him, as he did not have any flying defenses out, but his Well-wisher kept his life total at or above 20.&lt;br /&gt;&lt;img src="http://mi.wizards.com/global/images/magic/general/Voice_of_the_Woods.jpg" /&gt; &lt;img src="http://mi.wizards.com/global/images/magic/general/Intruder_Alarm.jpg" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;MAGIC (0:19) Ryan: 2 Chip: 0&lt;br /&gt;&lt;br /&gt;In the quickest match of the night, I played my red deck against Ryan's black/red dragon deck. Ryan has two ways of getting Dragons into play cheaply and quickly - Patriarch's Bidding and Belbe's Portal. He played each of those cards during our quick two games, and I wasn't fast enough to win.&lt;br /&gt;&lt;img src="http://mi.wizards.com/global/images/magic/general/Patriarchs_Bidding.jpg" /&gt; &lt;img src="http://mi.wizards.com/global/images/magic/general/Belbes_Portal.jpg" /&gt;&lt;br /&gt;&lt;br /&gt;MAGIC (0:35) Motor: 2 Chip: 1&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;In the closest match of the night, I played against Motor's black pre-constructed Darksteel deck. I won the first match with a lot of quick damage, but he came back to win the second match. His deck had a lot of creature removal, and I had to struggle to keep a creature in play. In the last game, I Essence Drained him down to three life, which was enough for me to lose the game. He played Pulse of the Forge three times to defeat me. It was the comeback of the night!&lt;br /&gt;&lt;img src="http://mi.wizards.com/global/images/magic/general/Essence_Drain.jpg" /&gt; &lt;img src="http://mi.wizards.com/global/images/magic/general/Pulse_of_the_Forge.jpg" /&gt;&lt;br /&gt;MAGIC (0:15, 0:10) Rob: won, lost Chip: lost, won&lt;br /&gt;I played two casual games against Rob. He won the first against my signature deck with his arcbound deck. In the second game, he played a red burn deck (with 40 cards), and I played a white/green deck. He kept me creatureless for a while with two seals of Fire on the board. He sacrificed them to deal the damage directly to me, and I followed the next turn with an Auriok Glaivemaster and put one of my Vulshok Morningstars on her. I played another Auriok Glaivemaster, added a second Morningstar to the other Glaivemaster, and then Rob brought me down to a single life point (he had 13 life remaining). On the following turn, I attacked with both Glaivemasters for a total of 7 points of damage. When Rob passed on playing creatures (he had none in play), I cast Echoing Courage to increase the damage to 11. Still not enough? I played a second Echoing Courage to finish the game. After the game, I pointed out to Rob that he could have won at any time if he had remembered the Firebolt in his graveyard.&lt;br /&gt;&lt;img src="http://mi.wizards.com/global/images/magic/general/seal_of_fire.jpg" /&gt; &lt;img src="http://mi.wizards.com/global/images/magic/general/Auriok_Glaivemaster.jpg" /&gt; &lt;img src="http://mi.wizards.com/global/images/magic/general/Vulshok_Morningstar.jpg" /&gt; &lt;img src="http://mi.wizards.com/global/images/magic/general/Echoing_Courage.jpg" /&gt; &lt;img src="http://mi.wizards.com/global/images/magic/general/Firebolt.jpg" /&gt;&lt;br /&gt;&lt;br /&gt;PASSWORD (0:48) Erick + Motor: 106 Chip + Rob H: 51&lt;br /&gt;&lt;br /&gt;We played through two cards of Password clues. Erick and Motor crushed us, getting about twice as many clues as Rob and myself. They gave some really clever clues like "eager" ("beaver") and "resident" ("evil"). It was a lot of fun, and I look forward to playing this game again sometime soon.&lt;br /&gt;&lt;br /&gt;APPLES TO APPLES (1:01) Bobby: won Erin, Motor, Rob H, Chip: lost&lt;br /&gt;&lt;br /&gt;I didn't keep track of exactly how many green apples each player had, as we were having too much fun to worry overmuch about the score. Bobby did win the first round, and I believe he also had the most cards when we finished the deck. This game is usually a "the more the merrier" type of game, but it even plays well with only five players. The key is having the right group of people, which we did.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;PLUG: Next week, G.I. Joe demos!&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1986806-109664843933084317?l=flyingsheep.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://flyingsheep.blogspot.com/feeds/109664843933084317/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1986806&amp;postID=109664843933084317&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/109664843933084317'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/109664843933084317'/><link rel='alternate' type='text/html' href='http://flyingsheep.blogspot.com/2004/10/session-report-september-30-2004-games.html' title=''/><author><name>FlyingSheep</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_uk2q-bc5eAQ/SwW62Duw1nI/AAAAAAAAAAM/6CGYucwKJaA/S220/dsc_6061.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1986806.post-109414473257446754</id><published>2004-09-02T13:04:00.000-04:00</published><updated>2004-09-02T13:05:32.576-04:00</updated><title type='text'></title><content type='html'>Some monthly stats for August 2004&lt;br /&gt;&lt;br /&gt;Total games played: 35&lt;br /&gt;Unique games played: 16&lt;br /&gt;Total gaming sessions: 12&lt;br /&gt;&lt;br /&gt;Total Gaming Time: 33:42&lt;br /&gt;Total Set-up Time: 0:42&lt;br /&gt;Average Game Length: 0:58&lt;br /&gt;&lt;br /&gt;Games played more then once this month (other then Magic):&lt;br /&gt;&lt;br /&gt;Hick Hack in Gackelwack 4&lt;br /&gt;10 Days in the USA 3&lt;br /&gt;G. I. Joe CCG 3&lt;br /&gt;Alhambra 2&lt;br /&gt;&lt;br /&gt;New games this month:&lt;br /&gt;&lt;br /&gt;Spy Alley&lt;br /&gt;The Amazing Labyrinth&lt;br /&gt;G. I. Joe CCG&lt;br /&gt;Risk: Godstorm&lt;br /&gt;&lt;br /&gt;Game of the month: Memoir '44&lt;br /&gt;As a result of taking a few weeks of to go to GenCon, I didn't get to any of the usual SOG nights this past month. Thus, I was exposed to less new games then usual, which I regret. However, I was able to demo some games at the convention: Dos Rios, some Out-of-the-Box games (including Cloud Nine), and Memoir '44.&lt;br /&gt;I noticed a significant difference between being taught a new game by a fellow player and being taught a new game by someone who is working a booth at a convention. The excitement isn't really there, and sometimes professional demo-ers make silly mistakes, such as misreading a red river card for green river card in Dos Rios ("Verde? Does that mean red?", he asked us.) I should mention that the people demoing Out of the Box games were much more like fellow gamers and really got into the games.&lt;br /&gt;Based on discussions on the geek, I specifically sought out Memior '44 to give it a try. I wasn't disappointed. The demo played quickly, the rules were easy to pick up, and the different scenarios seem to offer a long lifespan for the game. It reminded me of Star Wars: The Queen's Gambit, except without the hour-long setup time. The one difference that I found a little startling in Memoir '44 is that hexes of units are equally powerful regardless of the number of units remaining in that hex. In other words, four infantry men do as much damage as one. On the other hand, if this simplification helps the game move along more quickly (which I am sure it does), I can't complain too much.&lt;br /&gt;I look forward to playing more scenarios of this game in the future. Based on its local popularity, I imagine it'll be easy to find someone with a copy at UG8!&lt;br /&gt;&lt;br /&gt;Computer Games played: Age of Wonders II&lt;br /&gt;&lt;br /&gt;PS2 Games played:&lt;br /&gt;Karaoke Revolution (aka SSR for Sing Sing Revolution)&lt;br /&gt;Baldur's Gate: Dark Alliance II&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1986806-109414473257446754?l=flyingsheep.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://flyingsheep.blogspot.com/feeds/109414473257446754/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1986806&amp;postID=109414473257446754&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/109414473257446754'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/109414473257446754'/><link rel='alternate' type='text/html' href='http://flyingsheep.blogspot.com/2004/09/some-monthly-stats-for-august-2004.html' title=''/><author><name>FlyingSheep</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_uk2q-bc5eAQ/SwW62Duw1nI/AAAAAAAAAAM/6CGYucwKJaA/S220/dsc_6061.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1986806.post-109155480133586295</id><published>2004-08-03T13:39:00.000-04:00</published><updated>2004-08-03T13:40:01.336-04:00</updated><title type='text'></title><content type='html'>Oh, and in case you're wondering - FlyingSheep.com is migrating to a new server. Hence, the downtime.&lt;br /&gt;&lt;br /&gt;When will it be back up? Good question. (:&lt;br /&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1986806-109155480133586295?l=flyingsheep.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://flyingsheep.blogspot.com/feeds/109155480133586295/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1986806&amp;postID=109155480133586295&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/109155480133586295'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/109155480133586295'/><link rel='alternate' type='text/html' href='http://flyingsheep.blogspot.com/2004/08/oh-and-in-case-youre-wondering.html' title=''/><author><name>FlyingSheep</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_uk2q-bc5eAQ/SwW62Duw1nI/AAAAAAAAAAM/6CGYucwKJaA/S220/dsc_6061.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1986806.post-109155468944271937</id><published>2004-08-03T13:36:00.000-04:00</published><updated>2004-08-03T13:38:09.443-04:00</updated><title type='text'></title><content type='html'>Some monthly stats for July&lt;br /&gt;&lt;br /&gt;Total games played: 49&lt;br /&gt;Unique games played: 18&lt;br /&gt;Total gaming sessions: 13&lt;br /&gt;&lt;br /&gt;Total Gaming Time: 33:45&lt;br /&gt;Total Set-up Time: 1:02&lt;br /&gt;Average Game Length: 0:41&lt;br /&gt;&lt;br /&gt;Games played more then once this month (other then Magic):&lt;br /&gt;&lt;br /&gt;(Three times)&lt;br /&gt;Hick Hack in Gackelwack&lt;br /&gt;&lt;br /&gt;(Twice)&lt;br /&gt;Alhambra&lt;br /&gt;Scrabble&lt;br /&gt;Coloretto&lt;br /&gt;&lt;br /&gt;New games this month:&lt;br /&gt;&lt;br /&gt;Yinsh&lt;br /&gt;Axis and Allies: D-Day&lt;br /&gt;Hera and Zeus&lt;br /&gt;Turnabout&lt;br /&gt;&lt;br /&gt;Game of the month: Yinsh&lt;br /&gt;&lt;br /&gt;I'm a big fan of Dvonn (which I haven't played recently), so I've been anxious to try other games in the GIPF project. The gameplay and components are elegant (just like Dvonn), and I enjoyed my first play. My only concern is that it seems (from one play) that your opponent will only score if you make a mistake. However, it's possible that, between two experienced players, the winner will have to force his or her opponent into lose-lose situations, rather then hope that they overlook something. I look forward to playing this game again.&lt;br /&gt;&lt;br /&gt;Computer Games played: Age of Wonders II&lt;br /&gt;&lt;br /&gt;PS2 Games played: Baldur's Gate: The Dark Alliance II (continuing)&lt;br /&gt;&lt;br /&gt;Notes:&lt;br /&gt;In addition to over 30 hours of gameplay this month, I spent 12 hours teaching games at various local stores. This is part of my agreement with Wizards of the Coast, in exchange for which they have provided me with copies of quite a few of their games. One of which (A&amp;amp;A:D-Day), I tried for the first time last week. While I'm not heavily into wargames, it seems to be a good introduction to the genre.&lt;br /&gt;&lt;br /&gt;Next Month: GenCon! &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1986806-109155468944271937?l=flyingsheep.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://flyingsheep.blogspot.com/feeds/109155468944271937/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1986806&amp;postID=109155468944271937&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/109155468944271937'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/109155468944271937'/><link rel='alternate' type='text/html' href='http://flyingsheep.blogspot.com/2004/08/some-monthly-stats-for-july-total.html' title=''/><author><name>FlyingSheep</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_uk2q-bc5eAQ/SwW62Duw1nI/AAAAAAAAAAM/6CGYucwKJaA/S220/dsc_6061.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1986806.post-109033985269844664</id><published>2004-07-20T12:10:00.000-04:00</published><updated>2004-07-20T12:10:52.696-04:00</updated><title type='text'></title><content type='html'>Session Report: July 19, 2004 &lt;br /&gt;Games Played: RoboRally, Turnabout, Yinsh, Hera and Zeus &lt;br /&gt;Gamers: Vitas, Mark, Chip, Rob, Josh, Chris &lt;br /&gt;&amp;nbsp; &lt;br /&gt;Thanks to Rob for hosting! &lt;br /&gt;&amp;nbsp; &lt;br /&gt;ROBORALLY &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Vitas: won &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Rob, Josh: lost &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Chip, Mark: left &lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Mark suggested RoboRally at the start of evening (actually, I think at least one hand of Set occurred before I arrived). The configuration of the game varied over time. With four players and 3 checkpoints (essentially two), it looked like a game that could complete within two hours or so, quite possibly less. Before we began, the game expanded to five players and 4 checkpoints. By the time the game ended, there were only three players left in the game (I don't know how many checkpoints were actually reached before Vitas was declared the winner). &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; When Chris arrived, I offered to exit the game (only a single turn had passed so far, so I felt that I had made minimal impact on the game). While leaving a game prematurely is not something I want to make a habit of, I think it was better than sending Chris home for hours until the game was finished. I admit to feeling bad about the decision, but I think it was the best choice in the circumstances. Unfortunately, Mark also had to leave early, leaving Vitas, Rob, and Josh to finish the game. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; I agree with Josh's assessment that the options and the particular boards that we started with were complicated - perhaps adding too much analysis for inexperienced players (such as myself). I'm curious what a bare-bones game of RoboRally would be like - without options and with relatively simple boards. I think that the unpredictability of the other player's actions (limited, as they are, with the random distribution of cards) would keep the game from being boring. I'd like to at least give it a try sometime. &lt;br /&gt;&amp;nbsp; &lt;br /&gt;TURNABOUT (0:10) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Chip: won (defense) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Chris: lost (offense) &lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Mark recommended this simple game. I recalled reading about it in a previous SR, so I was happy to give it a try. I chose what I believe is the easier role of Defense, and we were off. This game wasn't really to Chris's tastes, so we didn't play a second game (with reversed roles). I'd be willing to try it again to see if the defense player really has an advantage. &lt;br /&gt;&amp;nbsp; &lt;br /&gt;YINSH (0:21) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Chris: &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 3 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Chip: &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Chris offered to teach me Yinsh, and I gladly accepted. I really like Dvonn (although I haven't played it recently), and I was curious about other games in the Gipf series. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; The games have similar bits that look appealing while the game is in progress. One difference between this game an Dvonn is that (in most cases) your opponent can only score when you overlook something. Perhaps this problem will go away as I gain experience in the game. I look forward to playing this game again soon. &lt;br /&gt;&amp;nbsp; &lt;br /&gt;HERA AND ZEUS (0:20) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Chip: won &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Chris: lost &lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; After Yinsh, Chris also taught me Hera and Zeus. I had read over the rules months ago, but hadn't played it before now. My opening hand had a number of strong creatures (5s) and Zeus, so I filled my front row with my best cards and planned for an aggressive start. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; During my second turn, I spent all four actions attacking and eliminated two of Chris's columns. With his single action during his turn, he used a Pegasus to remove Zeus. On the following turn, my Giant wiped out the rest of his creatures. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; While this short game didn't allow me to explore it in any depth, I enjoyed it, and look forward to playing again. Chris was kind enough to lend me the game.&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1986806-109033985269844664?l=flyingsheep.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://flyingsheep.blogspot.com/feeds/109033985269844664/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1986806&amp;postID=109033985269844664&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/109033985269844664'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/109033985269844664'/><link rel='alternate' type='text/html' href='http://flyingsheep.blogspot.com/2004/07/session-report-july-19-2004-games.html' title=''/><author><name>FlyingSheep</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_uk2q-bc5eAQ/SwW62Duw1nI/AAAAAAAAAAM/6CGYucwKJaA/S220/dsc_6061.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1986806.post-108905668885119591</id><published>2004-07-05T15:44:00.000-04:00</published><updated>2004-07-05T15:44:48.850-04:00</updated><title type='text'></title><content type='html'>Report for the first half of 2004. &lt;br /&gt;&lt;br /&gt;Game Month Index&lt;br /&gt;(Months Played/Months Owned in 2004)&lt;br /&gt;&lt;br /&gt;(all months)&lt;br /&gt;Magic: the Gathering&lt;br /&gt;Alhambra&lt;br /&gt;&lt;br /&gt;(5/6)&lt;br /&gt;Land Unter!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;(4/5)&lt;br /&gt;Domaine	&lt;br /&gt;&lt;br /&gt;(4/6)&lt;br /&gt;Hick Hack in Gackelwack&lt;br /&gt;Star Wars: Epic Duels&lt;br /&gt;Lost Cities&lt;br /&gt;Knights of the Rainbow&lt;br /&gt;&lt;br /&gt;(2/3) &lt;br /&gt;San Juan&lt;br /&gt;&lt;br /&gt;(3/6)&lt;br /&gt;Rack-O			&lt;br /&gt;Old Entdecker		&lt;br /&gt;Wooly Bully		&lt;br /&gt;Coloretto		&lt;br /&gt;Penguin Ultimatum	&lt;br /&gt;Boggle			&lt;br /&gt;Switch (aka Qwitch)	&lt;br /&gt;Scrabble		&lt;br /&gt;Bohnanza		&lt;br /&gt;Dvonn			&lt;br /&gt;6 Nimmt!		&lt;br /&gt;Quiddler		&lt;br /&gt;Basari			&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;(2/5)&lt;br /&gt;Xactika	&lt;br /&gt;&lt;br /&gt;(2/6)&lt;br /&gt;Apples to Apples	&lt;br /&gt;Bucket King		&lt;br /&gt;My Word			&lt;br /&gt;Catch phrase		&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Top Ten List&lt;br /&gt;&lt;br /&gt;(all months)&lt;br /&gt;&lt;br /&gt;10. Bohnanza		&lt;br /&gt;	On last year's list, Bohnanza was second only to Magic. While this may seem like a considerable down-grade, it's the only (non-Magic) game to appear on this year's list. I still enjoy playing this game on occasion, especially with new players. I've only won 8 of 25 games. &lt;br /&gt;&lt;br /&gt;9. Old Entdecker		&lt;br /&gt;	I received a copy of this for Christmas. I play it whenever I can, but it's getting difficult to find opponents willing to play again. I've only been defeated once in six plays. I attribute this more to luck than skill.&lt;br /&gt;&lt;br /&gt;8. Basari&lt;br /&gt;	On the other side of the coin, I've never won Basari. I find it slightly frustrating, but still enjoyable. At some point, I'll either discover a decent strategy that lets me finish with a competitive score, or I'll give up and sell the game on EBay (: &lt;br /&gt;&lt;br /&gt;7. Land Unter!&lt;br /&gt;	It's hard to believe that I've played this game 16 times (winning only 6 times). This has replaced Bohnanza as my "must introduce to new players" game. It plays quickly, and each player usually does well in at least one round. &lt;br /&gt;&lt;br /&gt;6. Coloretto		&lt;br /&gt;	This game got off to a slow start. No one seemed that I introduced it to seem to share my interest in it. I pulled it off the shelf again a few weeks ago, and it's starting to catch on. My record is 5 wins over 10 plays. &lt;br /&gt;&lt;br /&gt;5. Hick Hack in Gackelwack&lt;br /&gt;	As the quickest game on the list, this is my filler of choice. There's much more luck than skill, in my opinion, but it's fun to try to anticipate other people's decisions. It's sort of like Basari sped up. &lt;br /&gt;&lt;br /&gt;4. San Juan&lt;br /&gt;	I've only played San Juan four times, and I can't wait for the next play. It will probably be the next game I purchase. &lt;br /&gt;&lt;br /&gt;3. Domaine	&lt;br /&gt;	I can see myself playing this game about once a month for the rest of the year (at least). I've won 2 of my 6 plays, which is respectable. Resources are short, making for a very tense game. &lt;br /&gt;&lt;br /&gt;2. Alhambra&lt;br /&gt;	This has been one of my favorite games all year, and that doesn't seem likely to change soon. My record is slightly better then 50% - I've won 8 of 15 games, and no one's beaten me more than once. There's something about this game that brings out the architect in me. &lt;br /&gt;&lt;br /&gt;1. Magic: the Gathering&lt;br /&gt;	I am very pleased to host a monthly casual Magic tournament at my house. We've been playing for about 3 months now, and I'd like to keep this tradition going for as long as possible. &lt;br /&gt;&lt;br /&gt;Last Year's Top Ten List (first half of 2003)&lt;br /&gt;&lt;br /&gt;10. Bucket King&lt;br /&gt;9. Call My Bluff&lt;br /&gt;8. 6 Nimmt!&lt;br /&gt;7. Space Beans&lt;br /&gt;6. Carcassonne (Hunters and Gatherers)&lt;br /&gt;5. Torres&lt;br /&gt;4. Dvonn&lt;br /&gt;3. Lost Cities&lt;br /&gt;2. Bohnanza&lt;br /&gt;1. Magic: the Gathering&lt;br /&gt;	&lt;br /&gt;&lt;br /&gt;Game of the Month Review:&lt;br /&gt;Jan	Old Entdecker&lt;br /&gt;Feb	Domaine&lt;br /&gt;Mar	Oasis&lt;br /&gt;Apr	San Juan&lt;br /&gt;May	Web of Power&lt;br /&gt;June	Star Wars: TCG&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1986806-108905668885119591?l=flyingsheep.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://flyingsheep.blogspot.com/feeds/108905668885119591/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1986806&amp;postID=108905668885119591&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/108905668885119591'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/108905668885119591'/><link rel='alternate' type='text/html' href='http://flyingsheep.blogspot.com/2004/07/report-for-first-half-of-2004.html' title=''/><author><name>FlyingSheep</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_uk2q-bc5eAQ/SwW62Duw1nI/AAAAAAAAAAM/6CGYucwKJaA/S220/dsc_6061.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1986806.post-108817896858227694</id><published>2004-06-25T11:55:00.000-04:00</published><updated>2004-06-25T11:56:08.583-04:00</updated><title type='text'></title><content type='html'>Session Report: June 24, 2004&lt;br /&gt;Games Played: 10 Days in the USA, Magic, Hick Hack, Coloretto&lt;br /&gt;Gamers: Dylan, Chip, Paul, Phil (the elder), Theo, Sara, Erin, Nathan, Jimmy&lt;br /&gt;&lt;br /&gt;10 DAYS IN THE USA (0:15)&lt;br /&gt;	Chip: 	won&lt;br /&gt;	Dylan, Paul: lost&lt;br /&gt;&lt;br /&gt;	The big hit of the night was 10 Days in the USA, my newest acquisition from Out of the Box games. It's quick to learn, and challenging to play. Each player is racing to be the first to finish his or her trip around the US. &lt;br /&gt;&lt;br /&gt;MAGIC (0:21)&lt;br /&gt;	Phil: won&lt;br /&gt;	Chip: lost&lt;br /&gt;&lt;br /&gt;	Phil played his enchantment drawing deck, and I played my white artifact deck. Although I had the initial advantage, Phil was able to Pacify my Rust Elemental and other attacking creatures. Before I could get enough mana to reset the board (with Soulscour), Phil was drawing at least seven new cards each turn, and put the game-ending Endless Wurm on the board.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://mi.wizards.com/global/images/magic/general/pacifism.jpg"&gt; &lt;img src="http://mi.wizards.com/global/images/magic/general/rust_elemental.jpg"&gt; &lt;img src="http://mi.wizards.com/global/images/magic/general/soulscour.jpg"&gt; &lt;img src="http://mi.wizards.com/global/images/magic/general/endless_wurm.jpg"&gt;&lt;br /&gt;&lt;br /&gt;MAGIC	(0:06)&lt;br /&gt;	Phil: 2 games&lt;br /&gt;	Chip: 0 games&lt;br /&gt;&lt;br /&gt;	Phil played his Suicide Black deck against my (much slower) black discard deck. In his first turn, Phil chained two Dark Rituals together to play 3 creatures. In my first turn, I played a land, and looked despondently at the 4-mana casting cost of all my cards. Phil's second turn Bad Moon sealed the victory for him. &lt;br /&gt;	The second game was similar, except that I did get a chance to play a spell - but only one. Mind Swords didn't really slow him down at all, though, and Phil won again. &lt;br /&gt;&lt;br /&gt;&lt;img src="http://mi.wizards.com/global/images/magic/general/dark_ritual.jpg"&gt; &lt;img src="http://mi.wizards.com/global/images/magic/general/bad_moon.jpg"&gt; &lt;img src="http://mi.wizards.com/global/images/magic/general/mind_swords.jpg"&gt;&lt;br /&gt;&lt;br /&gt;MAGIC (0:07)&lt;br /&gt;	Phil: 12&lt;br /&gt;	Chip: 5&lt;br /&gt;	&lt;br /&gt;	Phil played a white shadow deck against my blue artifact deck. We both got out powerful beatdown creatures pretty early, his Soltari Champion powered up his other (unblockable) shadow creatures, while my early Juggernaut dealt five damage each turn. Unfortuantely for me, after the first turn my Juggernaut was chump blocked by a welkin hawk, which, when it died, fetched a replacement welkin hawk. Another victory for Phil (: &lt;br /&gt;	&lt;br /&gt;&lt;img src="http://mi.wizards.com/global/images/magic/general/soltari_champion.jpg"&gt; &lt;img src="http://mi.wizards.com/global/images/magic/general/juggernaut.jpg"&gt; &lt;img src="http://mi.wizards.com/global/images/magic/general/welkin_hawk.jpg"&gt;&lt;br /&gt;&lt;br /&gt;MAGIC (0:15)&lt;br /&gt;	Chip: won&lt;br /&gt;	Theo: lost&lt;br /&gt;&lt;br /&gt;	My last game of Magic for the night was against Theo's multi-colored deck. He brought out a few myr to speed up his mana production, and managed to kill a few of my creatures with Murderous Spoils. My elf-ball deck brought out plenty of elves (providing my own mana acceleration), but no sources of red mana. With a useless Fireball in hand, I had to be content to beat down Theo's defenses with my SkyShroud Troopers. &lt;br /&gt;&lt;br /&gt;&lt;img src="http://mi.wizards.com/global/images/magic/general/murderous_spoils.jpg"&gt; &lt;img src="http://mi.wizards.com/global/images/magic/general/skyshroud_troopers.jpg"&gt;&lt;br /&gt;&lt;br /&gt;10 DAYS IN THE USA (0:24)&lt;br /&gt;	Erin: 	1 win&lt;br /&gt;	Paul: 	1 win&lt;br /&gt;	Sara, Chip: 0 wins&lt;br /&gt;&lt;br /&gt;	We played two more rounds of 10 Days, with Paul winning the first round and Erin winning the second. Paul lobbied for Alhambra (which I would have been happy to play), but he didn't have enough time, so we settled for a different quick game. &lt;br /&gt;&lt;br /&gt;HICK HACK IN GACKELWACK (0:23)&lt;br /&gt;	Erin: 	48, 50&lt;br /&gt;	Chip: 	42, 28&lt;br /&gt;	Paul: 	38, 28&lt;br /&gt;	Sara: 	22, 32&lt;br /&gt;&lt;br /&gt;	Erin, fresh off of a victory in 10 Days, was unstoppable in Hick Hack. After two games, Paul had to leave, so we roped Nathan into playing Coloretto with us. &lt;br /&gt;&lt;br /&gt;COLORETTO (0:25)&lt;br /&gt;	Sara: 	38&lt;br /&gt;	Chip: 	38&lt;br /&gt;	Nathan: 28&lt;br /&gt;	Erin: 	28&lt;br /&gt;&lt;br /&gt;	We only played one round, after which we lost Nathan and replaced him with Jimmy. Erin, disheartened by the end of her winning streak, suggested a return to 10 Days. &lt;br /&gt;&lt;br /&gt;10 DAYS IN THE USA (0:33)&lt;br /&gt;	Erin: 	2 wins&lt;br /&gt;	Sara, Jimmy, Chip: 0 wins&lt;br /&gt;	&lt;br /&gt;	Erin picked up where she left off, winning two more rounds of 10 Days in the USA. The second round was close, with everyone being only one turn away from winning. This game was the biggest hit in the night, and I'll be sure to bring it back often. &lt;br /&gt;&lt;br /&gt;PLUG: I'll be running a Mirrodin block draft tonight (Friday, June 25th) starting at 5:00. Only eight seats are available, so sign up early!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1986806-108817896858227694?l=flyingsheep.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://flyingsheep.blogspot.com/feeds/108817896858227694/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1986806&amp;postID=108817896858227694&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/108817896858227694'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/108817896858227694'/><link rel='alternate' type='text/html' href='http://flyingsheep.blogspot.com/2004/06/session-report-june-24-2004-games.html' title=''/><author><name>FlyingSheep</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_uk2q-bc5eAQ/SwW62Duw1nI/AAAAAAAAAAM/6CGYucwKJaA/S220/dsc_6061.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1986806.post-108756880936435189</id><published>2004-06-18T10:25:00.000-04:00</published><updated>2004-06-18T10:26:59.100-04:00</updated><title type='text'></title><content type='html'>Session Report: June 17, 2004&lt;br /&gt;Games Played: Magic, Basari&lt;br /&gt;Gamers: Geno, Chip, Phil, Motor, Sara&lt;br /&gt;&lt;br /&gt;MAGIC (0:26)&lt;br /&gt;	Geno: 	2 games&lt;br /&gt;	Chip: 	0 games&lt;br /&gt;&lt;br /&gt;	Geno played a red goblin deck, and I played a Black modular deck. We both played plenty of creatures, but Geno's Walls of Stone neutralized the threat of my bigger creatures, and his embermage goblins were able to snipe my smaller creatures. &lt;br /&gt;	At one point, Geno activated two embermage goblins, each targeting a different arcbound stinger. After the first activation resolved, I put the +1/+1 counter from the dead stinger onto the remaining one, thus saving it from dying to the second embermage activation. Triggered abilities go on the stack after each object on the stack resolves. &lt;br /&gt;	A few fireballs later, and the game was over. &lt;br /&gt;&lt;br /&gt;&lt;img src="http://mi.wizards.com/global/images/magic/general/wall_of_stone.jpg"&gt; &lt;img src="http://mi.wizards.com/global/images/magic/general/embermage_goblin.jpg"&gt; &lt;img src="http://mi.wizards.com/global/images/magic/general/arcbound_stinger.jpg"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;MAGIC 	(0:25)&lt;br /&gt;	Chip: 	2 games&lt;br /&gt;	Geno: 	1 game&lt;br /&gt;&lt;br /&gt;	Geno played a 5 color pre-constructed fifth dawn sunburst deck, and I played a green elf-ball deck. I was surprised at the consistency with which he was able to generate five different colors of mana, and his Skyreach Manta was a real threat, winning one game and threatening another. My mana-producing elves were able to generate a few fireballs large enough to win the game. &lt;br /&gt;&lt;br /&gt;&lt;img src="http://mi.wizards.com/global/images/magic/general/skyreach_manta.jpg"&gt; &lt;img src="http://mi.wizards.com/global/images/magic/general/fireball.jpg"&gt;&lt;br /&gt;&lt;br /&gt;MAGIC 	(0:21)&lt;br /&gt;	Geno: 	8&lt;br /&gt;	Chip: 	0&lt;br /&gt;&lt;br /&gt;	Geno played his sliver deck, and I played my token-generating skullclamp deck. I was able to generate lots of creatures, especially with two genesis chambers in play, so I had plenty of chump blockers. I was able to wear Geno down to 8 life before he played Shifting Sliver. Needless to say, I conceded after that hit the table. &lt;br /&gt;&lt;br /&gt;&lt;img src="http://mi.wizards.com/global/images/magic/general/genesis_chamber.jpg"&gt; &lt;img src="http://mi.wizards.com/global/images/magic/general/shifting_sliver.jpg"&gt;&lt;br /&gt;&lt;br /&gt;MAGIC 	(0:35)&lt;br /&gt;	Phil: 	5&lt;br /&gt;	Chip: 	0 &lt;br /&gt;&lt;br /&gt;	Phil played a multi-colored deck featuring Recurring Nightmare, and I played my black modular deck. Phil recurred Uktabi Orangutan to destroy my modular creatures and Deranged Hermit to provide chump squirrel blockers. His deck had an answer to everything, and he could get creatures from either his graveyard or his deck at will. At one point, I was only a turn away from winning, but Phil was able to pull out the right answer for the win.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://mi.wizards.com/global/images/magic/general/recurring_nightmare.jpg"&gt; &lt;img src="http://mi.wizards.com/global/images/magic/general/uktabi_orangutan.jpg"&gt; &lt;img src="http://mi.wizards.com/global/images/magic/general/deranged_hermit.jpg"&gt;&lt;br /&gt;&lt;br /&gt;BASARI 	(0:37)&lt;br /&gt;	Geno: 	90&lt;br /&gt;	Chip: 	78&lt;br /&gt;	Motor: 	72&lt;br /&gt;	Sara: 	61&lt;br /&gt;&lt;br /&gt;	I don't think I've ever won Basari, but this is the best game I've had to date. Motor was new to the game (I think Geno had played once before). I decided to concentrate on amassing gems, as I think I had undervalued them in previous games. Sara, on the other hand, declared that she didn't really like gems and thought they were overrated. &lt;br /&gt;	She changed her mind in the second round, when she was left with only two or three gems, and had to accept almost any offer. This round was also my best - I went from last place to second by having the majority of almost every type of gem. &lt;br /&gt;	Previous plays of this game have been pretty frustrating, but I think I might be getting the hang of it, finally. &lt;br /&gt;&lt;br /&gt;PLUG: Fifth Dawn draft tournament tonight, starting at five, at &lt;a href="http://www.legendscomix.com/about_us.php"&gt;Legends&lt;/a&gt;. Come and win some packs!&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1986806-108756880936435189?l=flyingsheep.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://flyingsheep.blogspot.com/feeds/108756880936435189/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1986806&amp;postID=108756880936435189&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/108756880936435189'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/108756880936435189'/><link rel='alternate' type='text/html' href='http://flyingsheep.blogspot.com/2004/06/session-report-june-17-2004-games.html' title=''/><author><name>FlyingSheep</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_uk2q-bc5eAQ/SwW62Duw1nI/AAAAAAAAAAM/6CGYucwKJaA/S220/dsc_6061.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1986806.post-108635699036622224</id><published>2004-06-04T09:49:00.000-04:00</published><updated>2004-06-04T09:49:50.366-04:00</updated><title type='text'></title><content type='html'>Session Report: June 3, 2004&lt;br /&gt;Games Played: Magic, Domaine, Quiddler&lt;br /&gt;Gamers: Phil (x2), Chip, Geno, Robert, Sara, Dave&lt;br /&gt;&lt;br /&gt;MAGIC (0:24)&lt;br /&gt;	Phil, Geno: 	won&lt;br /&gt;	Robert, Chip:	lost&lt;br /&gt;&lt;br /&gt;	We started with a two-player team game. Phil, Geno and I played green decks, and Robert played a black deck. &lt;br /&gt;	Geno and Phil's decks depended on getting big creatures into play quickly. Phil played a Vernal Bloom early on, which I destroyed after taking advantage of it for a turn or so. Geno played a Forgotten Ancient which grew quickly. Robert had a little trouble getting out early lands, and only played a single creature. Fortunately, his Dross Prowler had fear, so it was able to get in and do some damage. My deck takes a little while to start drawing cards with Skullclamp, but Geno and Phil grew quickly into an unbeatable force. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://mi.wizards.com/global/images/magic/general/vernal_bloom.jpg"&gt; &lt;img src="http://mi.wizards.com/global/images/magic/general/dross_prowler.jpg"&gt; &lt;img src="http://mi.wizards.com/global/images/magic/general/forgotten_ancient.jpg"&gt;&lt;br /&gt;&lt;br /&gt;MAGIC (0:25)&lt;br /&gt;	Chip: 	2 games&lt;br /&gt;	Robert: 1 game&lt;br /&gt;&lt;br /&gt;	Robert and I played a match between my red burn deck, and his blue accelerated artifact deck. Each game was a close race - Robert won the first, and I managed to win the next two. &lt;br /&gt;	The cards played in the first two games were almost identical. I reduced our life totals with Flame Rift, and looked to Fireblast (with its alternate cost) for the game winner. Robert used Ur-Golem's Eye (and a Sculpting Steel copy) to bring out Arcbound Overseer. &lt;br /&gt;	Playing three games with the same decks helps to mitigate the luck of the draw, and allows players to get a good idea of how well their deck (and their opponent's deck) really performs. Time permitting, I really like playing this way.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://mi.wizards.com/global/images/magic/general/flame_rift.jpg"&gt; &lt;img src="http://mi.wizards.com/global/images/magic/general/fireblast.jpg"&gt; &lt;img src="http://mi.wizards.com/global/images/magic/general/ur_golems_eye.jpg"&gt; &lt;img src="http://mi.wizards.com/global/images/magic/general/arcbound_overseer.jpg"&gt;&lt;br /&gt;&lt;br /&gt;DOMAINE (1:03)&lt;br /&gt;	Robert: 30+&lt;br /&gt;	Sara: 	18&lt;br /&gt;	Chip: 	15&lt;br /&gt;	Phil (the Elder): 14&lt;br /&gt;&lt;br /&gt;	After Magic, we split into two groups, one playing Bohnanza (Beans!) and the other playing Domaine. Domaine is an area-control game in which players deploy knights to defend their castles and expand their influence. Robert and Phil were new to the game. I explained the rules, emphasizing the importance of getting gold early, and we began. &lt;br /&gt;	I took and early lead in points, but Sara was earning more gold each turn than I was, and Phil was earning even more. Phil took the point lead in the mid-game, with a few of his domains able to grow unfettered by neighbors, while Sara and I built up our defenses as neighbors. When she finally got the upper hand, I declared a truce between us, and we both focused on Phil (the obvious leader). Robert was just starting to develop a domain in the center of the board near the royal city, which he later stole from Phil. &lt;br /&gt;	Close to the end of the game (about 3 cards remaining in the deck), Phil made a small error. He didn't see how close he was to completing a decent-sized domain. Instead, I trapped him into a much smaller area. After this discussion, Robert realized (with a little prompting) that he could create two huge domains for himself with just two walls. After counting up the points of these two areas, he had over 30 points, enough to end the game prematurely and win. &lt;br /&gt;	Domaine is an enjoyable game, and victories like the above are unusual, but exciting. The game tends to slow down towards the end, but regularly finishes in a little over an hour. &lt;br /&gt;&lt;br /&gt;QUIDDLER (0:50)&lt;br /&gt;	Sara: 	275&lt;br /&gt;	Chip:	237&lt;br /&gt;	Phil (the Elder): 213&lt;br /&gt;&lt;br /&gt;	We introduced Phil to Quiddler, the word-forming card game. He had poor hands in the first two rounds, as Sara and I each had a tenfold lead over him. I assured him that the later rounds were more important, and he would easily be able to overcome this start. &lt;br /&gt;	He was, in fact, able to catch up quickly - well, catch up to me, at any rate. By the midpoint of the game, Sara was consistently 30 or 40 points ahead of us. Even as we plotted against her, trying to steal any bonuses from her each round, we couldn't close the gap. &lt;br /&gt;	This is a pretty good word game as long as the players play pretty quickly. During the final rounds, the downtime as your opponents try to find the best combination of words can take forever. This is probably best with three players (although it can take up to eight!). &lt;br /&gt;&lt;br /&gt;MAGIC	(1:02)&lt;br /&gt;	Chip: 	won&lt;br /&gt;	Dave: 	lost&lt;br /&gt;&lt;br /&gt;	While waiting for the game of Munchkin to finish, Dave and I played a game of Magic (as did Sara and Phil). Dave played a white deck including the Sword of Fire and Ice, and I played by green skullclamp deck. Each creature came into play with two 1/1 tokens, thanks to multiple copies of Genesis Chamber. It was a long battle, but I was finally able to overwhelm my opponent. &lt;br /&gt;&lt;br /&gt;&lt;img src="http://mi.wizards.com/global/images/magic/general/sword_of_fire_and_ice.jpg"&gt; &lt;img src="http://mi.wizards.com/global/images/magic/general/genesis_chamber.jpg"&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1986806-108635699036622224?l=flyingsheep.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://flyingsheep.blogspot.com/feeds/108635699036622224/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1986806&amp;postID=108635699036622224&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/108635699036622224'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/108635699036622224'/><link rel='alternate' type='text/html' href='http://flyingsheep.blogspot.com/2004/06/session-report-june-3-2004-games.html' title=''/><author><name>FlyingSheep</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_uk2q-bc5eAQ/SwW62Duw1nI/AAAAAAAAAAM/6CGYucwKJaA/S220/dsc_6061.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1986806.post-108576206495154713</id><published>2004-05-28T12:31:00.000-04:00</published><updated>2004-05-28T12:34:24.953-04:00</updated><title type='text'></title><content type='html'>Session Report: May 27, 2004&lt;br /&gt;Games Played: Magic, Hick Hack, Torres&lt;br /&gt;Gamers: Chip, Sara, Marianne, Morgan, Eric, Geno, Theo&lt;br /&gt;&lt;br /&gt;I didn't have my notebook with me, so I didn't record final scores. &lt;br /&gt;&lt;br /&gt;MAGIC&lt;br /&gt;	Theo:	won&lt;br /&gt;	Chip: 	lost&lt;br /&gt;&lt;br /&gt;	I played a quick game against Theo. He played a slightly modified version of a pre-constructed deck - the Black discard Mirrodin one. I played a deck I borrowed from Theo's pervious opponent. &lt;br /&gt;	With a combination of Geth's Grimoire and Specter's Shroud, Theo was able to keep drawing cards as he attacked me with creatures. I had some good cards in my hand, especially Eater of Days, but I didn't draw enough lands to bring him into play. &lt;br /&gt;&lt;br /&gt;&lt;img src="http://mi.wizards.com/global/images/magic/general/specters_shroud.jpg"&gt; &lt;img src="http://mi.wizards.com/global/images/magic/general/geths_grimoire.jpg"&gt; &lt;img src="http://mi.wizards.com/global/images/magic/general/eater_of_days.jpg"&gt;&lt;br /&gt;&lt;br /&gt;MAGIC&lt;br /&gt;	Sara: 	won&lt;br /&gt;	Chip: 	2nd out&lt;br /&gt;	Morgan: 1st out&lt;br /&gt;&lt;br /&gt;	Morgan played a red 150-card "chaos" deck featuring some wacky Unglued cards, Sara played her domain artifact deck, and I played a black swampwalk/fear deck. &lt;br /&gt;	Morgan put out a Bronze Calendar early in game, and entertained us with his various funny voices. I played a Tainted Well on one of Sara's lands to let my swampwalking creatures through. Unfortunately, doing so raised her basic land count and enabled her to play Stratadon earlier. She also had a Viridian Longbow which picked off all of my little creatures. &lt;br /&gt;&lt;br /&gt;&lt;img src="http://mi.wizards.com/global/images/magic/general/bronze_calendar.jpg"&gt; &lt;img src="http://mi.wizards.com/global/images/magic/general/tainted_well.jpg"&gt; &lt;img src="http://mi.wizards.com/global/images/magic/general/stratadon.jpg"&gt; &lt;img src="http://mi.wizards.com/global/images/magic/general/viridian_longbow.jpg"&gt;&lt;br /&gt;&lt;br /&gt;MAGIC &lt;br /&gt;	Sara: 	won&lt;br /&gt;	Robert?: 2nd out&lt;br /&gt;	Chip: 	1st out&lt;br /&gt;&lt;br /&gt;	Robert (this may or may not be his name, with my poor memory and without notes, that's the best I can come up with) played my Elf deck, I played a blue artifact deck, and Sara played her domain artifact deck again. &lt;br /&gt;	Robert was able to keep himself (and me) alive for a while with various fog effects and a copy of Elvish Fury. He wasn't able to get enough Elves in play to get Voice of the Woods to go off, which was unfortunate (and a sign that I need to put some more Elves in the deck). &lt;br /&gt;	I was able to get a pair of Spire Golems and a pair of Vulshok Morningstars in play, but each artifact I played simply powered up Sara's Arcbound Crusher (which eventually became a 10/10 creature). With this creature and her Stratadon, Sara was able to defeat both of us easily. &lt;br /&gt;&lt;br /&gt;&lt;img src="http://mi.wizards.com/global/images/magic/general/elvish_fury.jpg"&gt; &lt;img src="http://mi.wizards.com/global/images/magic/general/voice_of_the_woods.jpg"&gt; &lt;img src="http://mi.wizards.com/global/images/magic/general/vulshok_morningstar.jpg"&gt; &lt;img src="http://mi.wizards.com/global/images/magic/general/arcbound_crusher.jpg"&gt;&lt;br /&gt;&lt;br /&gt;HICK HACK&lt;br /&gt;	Sara: 	won&lt;br /&gt;	Robert, Eric, Chip, Marianne: lost&lt;br /&gt;	&lt;br /&gt;	We played a quick round of Hick Hack. Sara ended with at least 10 more points than anyone else. Her winning streak continued. . .&lt;br /&gt;&lt;br /&gt;TORRES&lt;br /&gt;	Sara: 	won&lt;br /&gt;	Geno, Marianne, Robert: lost&lt;br /&gt;&lt;br /&gt;	And she won Torres as well. Torres maxes out at four, so I opted to watch D&amp;D Minatures and wait for a Magic duel instead. Geno and Robert were new to the game, and Marianne had only played a handful of times before. The game board developed nicely and it was quite cool to see the various towers from an outside perspective. Usually, I'm too wrapped up in the strategic importance of the tiles to appreciate the interesting patterns that they form. &lt;br /&gt;	&lt;br /&gt;MAGIC&lt;br /&gt;	Geno: won&lt;br /&gt;	Chip: lost&lt;br /&gt;&lt;br /&gt;	Geno played a multi-colored Sliver deck, and I played my green/white three-word deck. Geno wisely waited until he could play a few slivers in a single turn before revealing the theme of his deck. His Toxin Sliver made quick work of the few creatures I was able to get into play. Eventually he had five creatures in play, and I had none. He had 8 life, and I was down to 2. To my pleasant surprise, I drew Wrath of God!&lt;br /&gt;	Of course, I lost anyways, but at least I had a chance (: &lt;br /&gt;&lt;br /&gt;&lt;img src="http://mi.wizards.com/global/images/magic/general/toxin_sliver.jpg"&gt; &lt;img src="http://mi.wizards.com/global/images/magic/general/wrath_of_god.jpg"&gt;&lt;br /&gt;&lt;br /&gt;I had a great time, and I'm looking forward to next week.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1986806-108576206495154713?l=flyingsheep.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://flyingsheep.blogspot.com/feeds/108576206495154713/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1986806&amp;postID=108576206495154713&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/108576206495154713'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/108576206495154713'/><link rel='alternate' type='text/html' href='http://flyingsheep.blogspot.com/2004/05/session-report-may-27-2004-games.html' title=''/><author><name>FlyingSheep</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_uk2q-bc5eAQ/SwW62Duw1nI/AAAAAAAAAAM/6CGYucwKJaA/S220/dsc_6061.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1986806.post-108488791337784485</id><published>2004-05-18T09:44:00.000-04:00</published><updated>2004-05-18T09:45:13.376-04:00</updated><title type='text'></title><content type='html'>Session Report: May 17, 2004&lt;br /&gt;Games Played: Hick Hack, Web of Power, San Juan&lt;br /&gt;Gamers: Rob, Richard, Marianne, Sara, Chip, Vitas, Lewis, Eric (+5 more)&lt;br /&gt;&lt;br /&gt;Thanks to Rob for hosting. We had over a dozen people in attendance (not counting all the naked chicks). &lt;br /&gt;&lt;br /&gt;HICK HACK	(0:12)&lt;br /&gt;	Richard: 35&lt;br /&gt;	Rob: 	32&lt;br /&gt;	Marianne: 31&lt;br /&gt;	Sara: 	31&lt;br /&gt;	Chip: 	15&lt;br /&gt;&lt;br /&gt;	There was a game of St. Petersburg already underway when we arrived, so I suggested Hick Hack as a quick filler, as people were still showing up. The final scores were (with one exception) really close. &lt;br /&gt;	I like this game. It's sort of a quick brain warm-up exercise before getting into the meatier games. &lt;br /&gt;&lt;br /&gt;WEB OF POWER 	(0:25)&lt;br /&gt;	(first round score) final score&lt;br /&gt;	Rob:	 (16) 52&lt;br /&gt;	Chip: 	 (14) 51&lt;br /&gt;	Richard: (13) 49&lt;br /&gt;	Vitas: 	 (12) 38&lt;br /&gt;&lt;br /&gt;	Richard suggested Web of Power, and Rob, Vitas, and I joined him. I was new to the game, Rob and Vitas had played once before, and Richard was, as he put it, the most experienced. &lt;br /&gt;	I really like this game. For such a short game, there's a lot going on, and a lot to think about. I didn't keep track of everything, and I made a few mistakes along the way. I'd really like to try this game again soon. &lt;br /&gt;&lt;br /&gt;SAN JUAN (1:02)&lt;br /&gt;	Lewis: 	29&lt;br /&gt;	Chip: 	27&lt;br /&gt;	Sara: 	25&lt;br /&gt;	Eric: 	24&lt;br /&gt;	&lt;br /&gt;	After Web of Power, we waited for the other games (San Juan, St. Petersberg) to finish up. In the meantime, Lewis mentioned that he had not played San Juan yet, so I offered to teach it to him (and Eric). Sara had just won San Juan, and was reluctant to play again immediately. Faced with the remaining options (Nano-Fictionary or Tahuantinsuyu: The Rise of the Inca Empire), she opted to join us in the hopes of repeating her victory. &lt;br /&gt;	The more I play San Juan, the more I appreciate my luck in the first two session of this game. I was able to build violet buildings almost exclusively and rack up a lot of points doing so. Without a few key components, however, I ended up not really focusing on a single strategy, and my score suffered as a result. &lt;br /&gt;	So far, the prevalence of luck in this game has not turned me off to it. Rather, it makes each play a little different, forcing me to think on my feet, as it were. I still enjoy playing this game and look forward to playing it again soon.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1986806-108488791337784485?l=flyingsheep.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://flyingsheep.blogspot.com/feeds/108488791337784485/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1986806&amp;postID=108488791337784485&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/108488791337784485'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/108488791337784485'/><link rel='alternate' type='text/html' href='http://flyingsheep.blogspot.com/2004/05/session-report-may-17-2004-games.html' title=''/><author><name>FlyingSheep</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_uk2q-bc5eAQ/SwW62Duw1nI/AAAAAAAAAAM/6CGYucwKJaA/S220/dsc_6061.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1986806.post-108377172799548385</id><published>2004-05-05T11:42:00.000-04:00</published><updated>2004-05-05T11:45:19.780-04:00</updated><title type='text'></title><content type='html'>Session Report: May 3, 2004&lt;br /&gt;Games Played: Ticket To Ride, Einfach, Genial, Schwarzarbeit&lt;br /&gt;Gamers: Richard, Chip, Marianne, Rob, Mike, Vitas, Josh&lt;br /&gt;&lt;br /&gt;Thanks to Rob for hosting!&lt;br /&gt;&lt;br /&gt;TICKET TO RIDE 	(1:15) &lt;br /&gt;	Richard: 140&lt;br /&gt;	Mike: 	 125&lt;br /&gt;	Chip: 	 116&lt;br /&gt;	Marianne: 86&lt;br /&gt;	Rob: 	  75&lt;br /&gt;&lt;br /&gt;	Mike brought his copy of Ticket to Ride, which I had heard a lot about and was eager to try. Richard explained the rules (which were pretty straight-forward) and we were off. &lt;br /&gt;	I kept two of my initial destination tickets whose paths overlapped quite a bit. I didn't draw any additional tickets throughout the game, and I think that hurt my score. I found it difficult to resist building tracks right away, as my ideal path included a few single connections between cities. I felt that if I lost even one of them that I'd be at a huge disadvantage. Fortunately, I was able to connect all the routes that I wanted. The more experienced players did take additional tickets, and waited a few turns before building. &lt;br /&gt;	There was a fairly nice game. There were a few moments in the game when it became clear that a player needed one particular connection, and other players did not take advantage of this player's vulnerability. In particular, Rob once considered blocking off my long train path, but decided against it. He later rued his kindness as I blocked him from completing either of two tickets he drew during his penultimate turn. &lt;br /&gt;	While comparisons to TransAmerica and Union Pacific are inevitable, I believe that Ticket To Ride is significantly different from either. Of the three, this is my favorite so far. I'd like to play again, and take the first few turns drawing Destination Tickets. Once I had five or so that overlapped decently, I'd start trying to make my connections. I can't wait to play again. &lt;br /&gt;&lt;br /&gt;EINFACH GENIAL	(0:42)&lt;br /&gt;	Mike: 	16&lt;br /&gt;	Josh: 	12&lt;br /&gt;	Chip: 	9&lt;br /&gt;	Vitas: 	8&lt;br /&gt;&lt;br /&gt;	There's something a little worrying about a game that encourages players to declare, "I'm a genius". In most games, it's best for the leading player to keep a low profile, lest opponents conspire against him. Mike taught the rest of us how to play this abstract domino-like game. &lt;br /&gt;	Early on, I tried to hoard some of the double pieces (two of the same symbol), hoping that when I knew more about the game I could use them more to my advantage. I found that it was useful to sort of follow the crowd - if other players were building up a large blue field, that's a good time to pump up blue, rather than trying to start a new green field elsewhere. &lt;br /&gt;	I tried to follow Mike's example of "going out" in multiple colors during the same turn, but I found that I was always one or two points away. I should have taken those points at the time (to enable an easier declaration of supreme intelligence later), but I opted to try to boost my weaker colors instead. &lt;br /&gt;	I enjoyed this game, and I'd be happy to play again. Even if I don't win, it's an interesting and fun puzzle challenge. I'd even be willing to sit at Josh's right (: &lt;br /&gt;&lt;br /&gt;SCHWARZARBEIT (0:28)&lt;br /&gt;	Mike: 	18&lt;br /&gt;	Josh: 	15&lt;br /&gt;	Marianne: 12&lt;br /&gt;	Vitas: 	11&lt;br /&gt;	Chip: 	 7&lt;br /&gt;&lt;br /&gt;	Josh brought out Schwarzarbeit ("Moonlighting") and taught all of us the rules. We all reacted pretty negatively to the memory aspect of the game, but we played it (with varying degrees of effort) nonetheless. &lt;br /&gt;	I tried to put some effort into the game, and took some risks early in the game, but eventually settled into a pattern of either taking a worker that was known to be safe (e.g. the weekend version was face-up on the table), or accusing a working at random. In either case, I felt that my decisions were either obvious (in the safe example) or completely random. Mike and Josh seemed to have a better strategy, so whenever possible, I would follow their lead (: &lt;br /&gt;	In retrospect, it seems to me that if a player can remember which weekend cards are in the deck (and, after the first time through the deck, all this information is publicly available), that player should be able to accuse (and rack up more points) with impunity. Unfortunately, I didn't think of this until after the game was over. &lt;br /&gt;	I'm not really impressed with this game, and I'll try to avoid playing it again. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1986806-108377172799548385?l=flyingsheep.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://flyingsheep.blogspot.com/feeds/108377172799548385/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1986806&amp;postID=108377172799548385&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/108377172799548385'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/108377172799548385'/><link rel='alternate' type='text/html' href='http://flyingsheep.blogspot.com/2004/05/session-report-may-3-2004-games-played.html' title=''/><author><name>FlyingSheep</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_uk2q-bc5eAQ/SwW62Duw1nI/AAAAAAAAAAM/6CGYucwKJaA/S220/dsc_6061.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1986806.post-108361178822845130</id><published>2004-05-03T15:16:00.000-04:00</published><updated>2004-05-03T15:19:25.593-04:00</updated><title type='text'></title><content type='html'>Some monthly stats for April, 2004&lt;br /&gt;&lt;br /&gt;Total games played: 	58&lt;br /&gt;Unique games played:	24&lt;br /&gt;Total gaming sessions:	17&lt;br /&gt;&lt;br /&gt;Total Gaming Time:	38:01&lt;br /&gt;Total Set-up Time:	1:33&lt;br /&gt;Average Game Length:	0:39&lt;br /&gt;&lt;br /&gt;Games played more then once this month (other then Magic):&lt;br /&gt;&lt;br /&gt;Alhambra (four plays)&lt;br /&gt;Land Unter!, Trendy (two plays each)&lt;br /&gt;&lt;br /&gt;New games this month:&lt;br /&gt;&lt;br /&gt;San Juan&lt;br /&gt;Formula Motor Racing&lt;br /&gt;Sticheln&lt;br /&gt;Trendy&lt;br /&gt;Fantasy Pub&lt;br /&gt;Marvel TCG&lt;br /&gt;Cathedral&lt;br /&gt;Evo&lt;br /&gt;1313 Deadend Drive&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Game of the month: San Juan&lt;br /&gt;&lt;br /&gt;	I only played San Juan once (and I won), so it might be a bit early to declare this the best game ever, but it's safe to say that it's the best new game I've played this month. I got off to a good start by focusing on finding ways to replenish my hand. I felt some real tension when I dove into my monument building strategy, especially as I had to discard the Hero to pay for my first monument. I managed to get two of the three before the end of the game, and it contributed to my final score. I haven't played Puerto Rico yet, although San Juan has whetted my appetite for PR.&lt;br /&gt;	In other games, Formula Motor Racing has replaced Formula De as my little plastic cars game of choice. &lt;br /&gt;&lt;br /&gt;Computer Games played: Puzzle Pirates. &lt;br /&gt;&lt;br /&gt;PS2 Games played: Finished Crash Bandicoot 3.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1986806-108361178822845130?l=flyingsheep.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://flyingsheep.blogspot.com/feeds/108361178822845130/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1986806&amp;postID=108361178822845130&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/108361178822845130'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/108361178822845130'/><link rel='alternate' type='text/html' href='http://flyingsheep.blogspot.com/2004/05/some-monthly-stats-for-april-2004.html' title=''/><author><name>FlyingSheep</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_uk2q-bc5eAQ/SwW62Duw1nI/AAAAAAAAAAM/6CGYucwKJaA/S220/dsc_6061.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1986806.post-108360138009135812</id><published>2004-05-03T12:23:00.000-04:00</published><updated>2004-05-03T12:26:58.733-04:00</updated><title type='text'></title><content type='html'>Session Report: May 1, 2004&lt;br /&gt;Games Played: Magic, Cathedral, Blokus&lt;br /&gt;Gamers: Mike, Chip, Vitas, Shaun&lt;br /&gt;&lt;br /&gt;Thanks to all of you for coming. All the magic cards in the world aren't worth anything without great people to play with, and you guys are the best. I'd like to expand this to 6 players sometime and try team sealed-deck. In the meantime, I'll look at my collection and see which block we can play with next time (probably Urza's block). Perhaps May 29th? &lt;br /&gt;&lt;br /&gt;MAGIC (2:00)&lt;br /&gt;	Mike:	won&lt;br /&gt;	Vitas:	2nd&lt;br /&gt;	Chip: 	3rd&lt;br /&gt;&lt;br /&gt;	We played a Mercadian Masques sealed deck tournament. Each player had three boosters from Masques, and one booster each of Nemesis and Prophecy. Mike defeated me to in two close duels, and then defeated Vitas (although Vitas did win one of the three games). &lt;br /&gt;	Some notes on Mike's winning deck: It had 13 creatures, 11 other spells, and 19 land (for a total of 43 cards). These thirteen creatures, including Saber Ants which created even more creatures, were key to his victory, although the other spells (Desert Twister, Ancestral Mask, and Aura Fracture) were very effective. Indeed, I choose to play blue in my first deck mostly for the inclusion of Coastal Piracy, but I didn't bother casting it when Mike had Aura Fracture in play. He could leave it in play to power his Ancestral Mask and then destroy it before it helped me. &lt;br /&gt;	&lt;br /&gt;&lt;img src="http://mi.wizards.com/global/images/magic/general/saber_ants.jpg"&gt; &lt;img src="http://mi.wizards.com/global/images/magic/general/aura_fracture.jpg"&gt; &lt;img src="http://mi.wizards.com/global/images/magic/general/coastal_piracy.jpg"&gt; &lt;img src="http://mi.wizards.com/global/images/magic/general/ancestral_mask.jpg"&gt;&lt;br /&gt;&lt;br /&gt;MAGIC (2:30)&lt;br /&gt;	Mike: 	won&lt;br /&gt;	Chip: 	2nd&lt;br /&gt;	Vitas: 	3rd&lt;br /&gt;	Shaun: 	4th&lt;br /&gt;&lt;br /&gt;	We all got new booster packs and made new decks. I defeated Vitas to face Mike, who defeated Shaun. Mike won in two games against me (not as close as the first tournament), and Vitas defeated Shaun. &lt;br /&gt;	Mike's second tournament-winning deck had 15 creatures, featuring powerhouses like Gerrard's Irregulars and Battle Squadron. His top non-creature spell (of the seven he included) was probably Ferocity. In my match against him, I hoped to use Unnatural Hunger on the creature Mike enchanted with Ferocity. Unfortunately, I never saw that card, and his pumped up creatures had little difficult overrunning me. The other 17 cards in his deck were 7 forests, 9 mountains, and two non-basic lands. &lt;br /&gt;&lt;br /&gt;&lt;img src="http://mi.wizards.com/global/images/magic/general/gerrards_irregulars.jpg"&gt; &lt;img src="http://mi.wizards.com/global/images/magic/general/unnatural_hunger.jpg"&gt; &lt;img src="http://mi.wizards.com/global/images/magic/general/ferocity.jpg"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;CATHEDRAL (0:10)&lt;br /&gt;	Mike: 0&lt;br /&gt;	Chip: -5&lt;br /&gt;	&lt;br /&gt;	While waiting for Shaun and Vitas to finish their match, Mike and I played two rounds of Cathedral. I lost to him by five points in the first round, and the second round was a draw. &lt;br /&gt;	&lt;br /&gt;BLOKUS	(0:30)&lt;br /&gt;	Shaun: 	-11, -12= -23&lt;br /&gt;	Vitas: 	-9, -17 = -26&lt;br /&gt;	Chip: 	-17, -11= -28&lt;br /&gt;	Mike: 	-19, -12= -31&lt;br /&gt;&lt;br /&gt;	We then played two round of Blokus. Vitas taught the game to Shaun and I, and Mike had played before. Although he didn't place first in either round, Shaun ended with the highest total score. &lt;br /&gt;	I'm not sure if I really got this game, although I did see things differently in the second round. I wasn't really enthralled by the game, but it is an interesting puzzle-like activity. &lt;br /&gt;&lt;br /&gt;	After that, Mike and Shaun went home to enjoy the nice weather. Vitas and I played a series of Magic matches - first with an expanded sealed deck (using up the remainder of the "boosters"), and then with pre-constructed decks. &lt;br /&gt;&lt;br /&gt;MAGIC	(1:01)&lt;br /&gt;	Chip: 	2 games&lt;br /&gt;	Vitas: 	0&lt;br /&gt;&lt;br /&gt;	We started with a sealed-deck duel, each of us with 7 boosters instead of the usual 5. I built a white/black deck, and Vitas had a white/green deck. In each game, Vitas beat me down early with creatures such as Pangosaur. I gave up at least half of my life to Murderous Betrayal to deal with such threats, but it eventually won me the game.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://mi.wizards.com/global/images/magic/general/pangosaur.jpg"&gt; &lt;img src="http://mi.wizards.com/global/images/magic/general/murderous_betrayal.jpg"&gt;&lt;br /&gt;&lt;br /&gt;MAGIC	(1:11)&lt;br /&gt;	Vitas:	2 games&lt;br /&gt;	Chip: 	1 game&lt;br /&gt;&lt;br /&gt;	Vitas played his blue/white deck featuring flying creatures (such as Serra Angels) powered by Unstable Mutations. I played a blue artifact deck featuring Memnarch and Tinker. &lt;br /&gt;	I won the first game by Tinkering for Memnarch and then stealing Vitas's creatures. I lost the next two games from poor decisions. I had the misfortune of having Memnarch in my hand (in hindsight, I probably should have mulliganed), without the mana to cast him. I had a re-usable Tinker on a Panoptic Mirror, but I foolishly sacrificed the creatures I needed in order to bring out other, less effective creatures. My planning didn't improve in the final game, and Vitas out-played me to win the match. &lt;br /&gt;&lt;br /&gt;&lt;img src="http://mi.wizards.com/global/images/magic/general/unstable_mutation.jpg"&gt; &lt;img src="http://mi.wizards.com/global/images/magic/general/tinker.jpg"&gt; &lt;img src="http://mi.wizards.com/global/images/magic/general/panoptic_mirror.jpg"&gt;&lt;br /&gt;&lt;br /&gt;MAGIC	(0:17)&lt;br /&gt;	Vitas, Chip: tie?&lt;br /&gt;	&lt;br /&gt;	I discovered that there were two boosters left, so to mix things up a bit we played a limited infinity duel. Each player starts with 15 cards (the booster pack, arranged commons -&gt; rare) in his library. Each player has access to inifinite mana each turn, but is limited to one spell per turn (hence the name of the format). We discovered that the flailing creatures didn't really work in this format (we decided that they simply existed at their printed power/toughness). The game ended in a stalemate. &lt;br /&gt;&lt;br /&gt;&lt;img src="http://mi.wizards.com/global/images/magic/general/flailing_soldier.jpg"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;MAGIC	(1:01)&lt;br /&gt;	Chip: 	2 games&lt;br /&gt;	Vitas: 	1 game&lt;br /&gt;&lt;br /&gt;	I played a mono-blue deck featuring Vizzerdrix and card-filtering cards (e.g. draw 1, discard 1), and Vitas played a blue/red deck featuring Quicksilver Dagger and Jilt. &lt;br /&gt;	Vitas crushed me (16 to 0) in the first game - three of his creatures were enchanted with the Dagger (which, I suppose, would be an Equipment if it were made today), and he could draw all the cards he needed. I managed to build up an army of creatures in the next two games to win. &lt;br /&gt;&lt;br /&gt;&lt;img src="http://mi.wizards.com/global/images/magic/general/vizzerdrix.jpg"&gt; &lt;img src="http://mi.wizards.com/global/images/magic/general/quicksilver_dagger.jpg"&gt;&lt;br /&gt;&lt;br /&gt;MAGIC	(0:16)&lt;br /&gt;	Vitas: 	2 games&lt;br /&gt;	Chip: 	0&lt;br /&gt;&lt;br /&gt;	Yearning for a simple strategy, I brought out my mono-red burn deck, and Vitas played a mono-white deck. In the first game, Vitas played Armageddon before I had a chance to Flamebreak his flying creatures. I never recovered from this loss of tempo. I conceded the second game when he played Conversion. &lt;br /&gt;&lt;br /&gt;&lt;img src="http://mi.wizards.com/global/images/magic/general/flamebreak.jpg"&gt; &lt;img src="http://mi.wizards.com/global/images/magic/general/conversion.jpg"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;MAGIC	(0:27)&lt;br /&gt;	Chip: 	2 games&lt;br /&gt;	Vitas: 	0 games&lt;br /&gt;&lt;br /&gt;	We finished off the night with my elf deck against his black/artifact deck. The elf deck set itself up quickly while Vitas was searching for creatures that he could afford to cast (e.g. anything but Lord of the Pit). The second game ended when I combined three of my elves with three copies of Wirewood Pride, and attacked for twelve points of damage.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://mi.wizards.com/global/images/magic/general/lord_of_the_pit.jpg"&gt; &lt;img src="http://mi.wizards.com/global/images/magic/general/wirewood_pride.jpg"&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1986806-108360138009135812?l=flyingsheep.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://flyingsheep.blogspot.com/feeds/108360138009135812/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1986806&amp;postID=108360138009135812&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/108360138009135812'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/108360138009135812'/><link rel='alternate' type='text/html' href='http://flyingsheep.blogspot.com/2004/05/session-report-may-1-2004-games-played.html' title=''/><author><name>FlyingSheep</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_uk2q-bc5eAQ/SwW62Duw1nI/AAAAAAAAAAM/6CGYucwKJaA/S220/dsc_6061.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1986806.post-108247241148537847</id><published>2004-04-20T10:46:00.000-04:00</published><updated>2004-04-20T10:49:48.310-04:00</updated><title type='text'></title><content type='html'>Session Report: April 19, 2004&lt;br /&gt;Games Played: Foppen, Fantasy Pub&lt;br /&gt;Gamers: Lewis, Vitas, Josh, Marianne, Chip, Mike&lt;br /&gt;&lt;br /&gt;Thanks to Josh for hosting. &lt;br /&gt;&lt;br /&gt;FOPPEN 	(0:43)&lt;br /&gt;	Mike: 	11&lt;br /&gt;	Chip: 	-15&lt;br /&gt;	Lewis: 	-17&lt;br /&gt;	Marianne: -30&lt;br /&gt;	Vitas: 	-55&lt;br /&gt;	Josh: 	-57&lt;br /&gt;&lt;br /&gt;	Mike, freshly returned from the Gathering of Friends, brought Foppen and Power Grid. As we were expecting more people to arrive soon, we started with Foppen. &lt;br /&gt;	Mike got off to an excellent start, scoring 10 positive points during the first two rounds. Vitas and Josh, on the other side of the spectrum, were very close throughout the game, always within 5 points of each other. &lt;br /&gt;	The way the cards are dealt seems to have more impact on the game then strategy, but I did find myself testing a few theories. For example, having the 15 and 19 of green, I would lead the 15, hoping that whoever took the trick with the 20 would follow up with another green card, and I could take the lead back. &lt;br /&gt;	In any event, this is a fun card game that I'd be happy to play again. &lt;br /&gt;&lt;br /&gt;FANTASY PUB (0:49)&lt;br /&gt;	Chip: 	15&lt;br /&gt;	Josh: 	9&lt;br /&gt;	Mark: 	9&lt;br /&gt;	Marianne: 5&lt;br /&gt;	&lt;br /&gt;	While Mike and others started a game of Power Grid, the rest of us played Josh's suggestion: Fantasy Pub. With orcs, hobbits, and beer, how could a game go wrong? After a brief explanation of the rules, we let Josh start (it was, after all, his game). &lt;br /&gt;	There are a few tactical decisions to make each turn, slightly limited by the roll of a pair of dice.  While this limitation allowed each player to consider all the possible moves (without bogging the game down too much), it also resulted in a few turns in which the player didn't have any good options. This was pretty rare and didn't detract from the game too much. &lt;br /&gt;	Josh and I were pegged as leaders pretty early, and I managed to deflect most of the suspicion onto him, until I brought home one of my knights and put my score a single beer away from victory. Had I considered the situation more (and had I been more sneaky), I should have waited for one more beer. As it was, there was no doubt that I was a threat now, and the other players tried to prevent me from winning. The dice rolled in my favor and, two rounds later, I brought my dwarf home with three beers for the win. &lt;br /&gt;	This was a fun game, nicely themed. It's light and moves quickly, but there aren't many strategic decisions. I'd be happy to play it again. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;	&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1986806-108247241148537847?l=flyingsheep.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://flyingsheep.blogspot.com/feeds/108247241148537847/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1986806&amp;postID=108247241148537847&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/108247241148537847'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/108247241148537847'/><link rel='alternate' type='text/html' href='http://flyingsheep.blogspot.com/2004/04/session-report-april-19-2004-games.html' title=''/><author><name>FlyingSheep</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_uk2q-bc5eAQ/SwW62Duw1nI/AAAAAAAAAAM/6CGYucwKJaA/S220/dsc_6061.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1986806.post-108178587521891341</id><published>2004-04-12T12:04:00.000-04:00</published><updated>2004-04-12T12:07:24.450-04:00</updated><title type='text'></title><content type='html'>Session Report: April 8, 2004&lt;br /&gt;Games Played: Magic, Chess, Land Unter!&lt;br /&gt;Gamers: Motor, Marianne, Chip, Eric, Phil&lt;br /&gt;&lt;br /&gt;MAGIC	(0:33)&lt;br /&gt;	Chip: 	19 life&lt;br /&gt;	Phil:	3rd eliminated&lt;br /&gt;	Motor:	2nd eliminated&lt;br /&gt;	Eric:	1st eliminated&lt;br /&gt;&lt;br /&gt;	Motor and I played as one team against Eric and Phil. Motor played a red deck, I played a blue artifact deck, Phil used an mostly-artifact deck, and Eric played a white/black deck. Unfortunately, Eric wasn't able to draw any swamps, so his deck didn't really get off the ground. &lt;br /&gt;	While Motor and I attacked Eric, Phil brought out some heavy equipment, including a Sword of Fire and Ice. Motor pointed out that I could use my Neurok Transmuter to make the Sword blue, thus causing it to "fall off" the creature that it was attached to. &lt;br /&gt;	Unfortunately, as it turns out, this doesn't work. The Transmuter can only change artifact creatures, so it couldn't target the sword after all. Of course, it couldn't target the equipped creature either, as that creature had protection from blue. &lt;br /&gt;	I think playing Multiplayer magic with teams adds an interesting dimension to the game. It also keeps players more involved in the game, even when it's not their turn. &lt;br /&gt;&lt;br /&gt;[img]http://mi.wizards.com/global/images/magic/general/Sword_of_Fire_and_Ice.jpg[/img] [img]http://mi.wizards.com/global/images/magic/general/Neurok_Transmuter.jpg[/img]&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;MAGIC	(0:30)&lt;br /&gt;	Eric:	won&lt;br /&gt;	Chip:	2nd out&lt;br /&gt;	Phil:	1st out	&lt;br /&gt;&lt;br /&gt;	We played a three-player game. Phil played a green deck featuring Slag Wurm, I played a white artifact deck, and Eric won with a strong Zombie deck. &lt;br /&gt;	I concentrated my initial efforts against Phil, as I knew he'd bring out some big creatures later in the game. Besides, Eric's Zombies were immune to the fear my Arcbound Fiends generated. Unfortunately, by the time Phil left the game, Eric's undead army was massive and made quick work of my remaining creatures. &lt;br /&gt;&lt;br /&gt;[img]http://mi.wizards.com/global/images/magic/general/plated_slagwurm.jpg[/img] [img]http://mi.wizards.com/global/images/magic/general/arcbound_fiend.jpg[/img] [img]http://mi.wizards.com/global/images/magic/general/clutch_of_undeath.jpg[/img]&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;MAGIC	(0:25)&lt;br /&gt;	Chip:	20&lt;br /&gt;	Phil:	8&lt;br /&gt;&lt;br /&gt;	Phil and I both played big green creatures and mana acceleration. There wasn't much subtlety involved, early Rampant Growths lead to Crashes of Rhinos and other big creatures. I can't even remember who had which creatures, but it was fun. I believe an Overrun at the end of the game gave me the win. &lt;br /&gt;&lt;br /&gt;[img]http://mi.wizards.com/global/images/magic/general/rampant_growth.jpg[/img] [img]http://mi.wizards.com/global/images/magic/general/overrun.jpg[/img]&lt;br /&gt;&lt;br /&gt;CHESS 	(0:40)&lt;br /&gt;	Chip:	won&lt;br /&gt;	Marianne: lost&lt;br /&gt;&lt;br /&gt;	While waiting for the next game, Marianne and I played a quick game of chess. It was a fairly even match, as neither of us had played at all in the previous few years, and the pieces (LOTR) weren't always obvious (Gollum as bishop?). I lost my queen early, but in the end I had one more rook than she, and that was enough. &lt;br /&gt;&lt;br /&gt;LAND UNTER!	(0:25)&lt;br /&gt;	Marianne: 14&lt;br /&gt;	Motor:	7&lt;br /&gt;	Chip: 	6&lt;br /&gt;	Eric:	5&lt;br /&gt;	&lt;br /&gt;	We brought out the drowning sheep game an introduced it to Motor and Eric. As usual when playing with new players, Marianne won. She scored no less than 2 points with each hand, while the rest of us scored no more than 3. Motor handled one of the hands as skillfully as she, but she was unbeatable on all the others. &lt;br /&gt;	This is a fun game that plays pretty quickly. The agony of choice and the pain of second-guessing your own decisions make this game a real pleasure to play. &lt;br /&gt;&lt;br /&gt;Look forward to playing again next Thursday!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;	&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1986806-108178587521891341?l=flyingsheep.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://flyingsheep.blogspot.com/feeds/108178587521891341/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1986806&amp;postID=108178587521891341&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/108178587521891341'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/108178587521891341'/><link rel='alternate' type='text/html' href='http://flyingsheep.blogspot.com/2004/04/session-report-april-8-2004-games.html' title=''/><author><name>FlyingSheep</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_uk2q-bc5eAQ/SwW62Duw1nI/AAAAAAAAAAM/6CGYucwKJaA/S220/dsc_6061.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1986806.post-10812639443720784</id><published>2004-04-06T11:05:00.000-04:00</published><updated>2004-04-06T11:08:27.546-04:00</updated><title type='text'></title><content type='html'>Session Report: April 5, 2004&lt;br /&gt;Games Played: Formula Motor Racing, Sticheln&lt;br /&gt;Gamers: Jeff, Luke, Josh, Marianne, Chip, Chris&lt;br /&gt;&lt;br /&gt;Thanks to Luke for hosting!&lt;br /&gt;&lt;br /&gt;FORMULA MOTOR RACING (0:53)&lt;br /&gt;	Luke: 	13&lt;br /&gt;	Josh: 	11&lt;br /&gt;	Chip: 	10&lt;br /&gt;	Chris*: 9&lt;br /&gt;	Marianne: 5&lt;br /&gt;	Jeff**:	1&lt;br /&gt;&lt;br /&gt;	We started with four players and added Chris after round one, and Jeff after round two. This is a pretty quick and simple racing game with plenty of opportunities to target other players. Anything that hurts others helps you. &lt;br /&gt;	Josh seemed to spend most of the first two games with both cars in last place and only scored one point until the final round. Luke also made a big jump - after not scoring any points in the first round, he was first in the second round. A player can place third consistently in every round and still lose to a player who comes in first once and spends the rest of the races in last place. &lt;br /&gt;	Even so, this is a fun quick game, and I'd be happy to play it again. &lt;br /&gt;&lt;br /&gt;STICHELN (2:10)&lt;br /&gt;	Chris: 	73&lt;br /&gt;	Jeff: 	47&lt;br /&gt;	Mariane: 19&lt;br /&gt;	Luke: 	11&lt;br /&gt;	Chip: 	8&lt;br /&gt;	Josh: 	-3&lt;br /&gt;	&lt;br /&gt;	Josh suggested Sticheln and 6 Nimmt! as games for six players, and we selected Sticheln. It's a trick-taking (and trick-avoiding) card game in which each player has a "pain" suit which causes them to lose points equal to the value of each card. All other cards taken are worth one positive point each. &lt;br /&gt;	I spent most of the game competing with Josh for fifth place. Chris played incredibly well, scoring double digits (up to 22 points) almost every hand. Neither Marianne nor Jeff lost points in a round, but they didn't gain points as quickly as Chris. Luke's alternated between gaining and losing points, while Josh and I just tried to get our scores back to zero. &lt;br /&gt;	There were a number of times when the last player in a round had a chance to either save the current leader (on that trick) or punish him/her. In almost all cases, that player was "merciful" and took the trick away, usually netting six positive points. While it's fun to consider the possibility of really screwing a player over, with six players it's generally better to improve your own score than to hurt another player (which helps everyone else, relatively speaking). In other words, greed overrules cruelty. &lt;br /&gt;	Of course, if taking the trick isn't desirable, players will try to make it as painful as possible for the player who ends up with the cards. At one point, I played the highest card in a trump suit, reasoning that the pain I would sufffer was limited by the highest pain card in the remaining player's hand. And, of course, he turned out to have the highest pain card in the deck, and I suffered greatly. &lt;br /&gt;	This is another fun card game. I never really had a chance to win, but at least I beat Josh (: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1986806-10812639443720784?l=flyingsheep.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://flyingsheep.blogspot.com/feeds/10812639443720784/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1986806&amp;postID=10812639443720784&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/10812639443720784'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/10812639443720784'/><link rel='alternate' type='text/html' href='http://flyingsheep.blogspot.com/2004/04/session-report-april-5-2004-games.html' title=''/><author><name>FlyingSheep</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_uk2q-bc5eAQ/SwW62Duw1nI/AAAAAAAAAAM/6CGYucwKJaA/S220/dsc_6061.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1986806.post-108006214067013992</id><published>2004-03-23T12:15:00.000-05:00</published><updated>2004-03-23T12:18:09.763-05:00</updated><title type='text'></title><content type='html'>Session Report: March 22, 2004&lt;br /&gt;Games Played: 6 Nimmt!, Attika, Und Tschuss&lt;br /&gt;Gamers: Josh, Vitas, Mike, Nancy, Rob, Richard, Chip&lt;br /&gt;&lt;br /&gt;Thanks to Rob for hosting!&lt;br /&gt;&lt;br /&gt;6 NIMMT! 	(0:37)&lt;br /&gt;	Richard: 19&lt;br /&gt;	Josh: 	30&lt;br /&gt;	Mike: 	30&lt;br /&gt;	Chip: 	41&lt;br /&gt;	Vitas: 	45&lt;br /&gt;	Rob: 	54&lt;br /&gt;	Nancy: 	73&lt;br /&gt;&lt;br /&gt;	Richard and I arrived too late to join in the initial game of Coloretto, but when that finished up, we started a game of 6 Nimmt! Nancy was new to the game, so we gave her the best advice we could: "Just play cards at random."&lt;br /&gt;	Nancy had to endure some painful rounds, taking up to 28 points in a single round. However, this didn't really compare to Rob "Play Fast" Elkind, who took 35 points in the next round. Fortunately, his daughter came to help him, and he was able to avoid taking any tricks at all in the second round. &lt;br /&gt;	6 Nimmt! is a great filler game, and the only game to be played on a semi-regular basis at SOG. &lt;br /&gt;&lt;br /&gt;ATTIKA 	(1:07)&lt;br /&gt;	Mike: 	won&lt;br /&gt;	Josh, Richard, Chip: lost&lt;br /&gt;	&lt;br /&gt;	I've heard a lot about this game, so I requested it in advance. Mike brought his copy, and Josh and Richard, both of whom have played before, joined in. &lt;br /&gt;	Richard got off to a very good start, threatening to link up two temples early on. Josh, apparently not trusting Mike to stop Richard, went out of his way to block his progress. &lt;br /&gt;	I made quite a few newbie mistakes, such as emptying a stack prematurely, and not realizing the importance of the black tiles. Nevertheless, I was able to at least threaten victory a few times (and would have won, had it not been for those meddling - uh, Richard). In the end, it was a very close race between Richard and Mike, and it might have ended differently if Richard wasn't forced to expend excessive energy stopping me. &lt;br /&gt;	This is a fun game, although I think it would benefit greatly from a way (say, tokens) to determine which pieces have already played. In this respect, the English on the cards is very helpful. There's more depth to explore here, and I look forward to playing this game again. &lt;br /&gt;&lt;br /&gt;UND TSCHUSS 	(0:12)&lt;br /&gt;	Richard: 58&lt;br /&gt;	Mike: 	49&lt;br /&gt;	Josh: 	31&lt;br /&gt;	Chip: 	-1&lt;br /&gt;&lt;br /&gt;	While waiting for the game of uber-Carcassonne to finish up, Richard suggested Und Tschuss, and taught the rest of us how to play. &lt;br /&gt;	Wow, I did really horribly at this game. After not taking many positive points, I was stuck without any high cards and took two -10s in a row. I didn't really recover from that. &lt;br /&gt;	This is a fun simple game, and I'd be willing to try it again. Chances are rather good that I'll do better next time. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1986806-108006214067013992?l=flyingsheep.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://flyingsheep.blogspot.com/feeds/108006214067013992/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1986806&amp;postID=108006214067013992&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/108006214067013992'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/108006214067013992'/><link rel='alternate' type='text/html' href='http://flyingsheep.blogspot.com/2004/03/session-report-march-22-2004-games.html' title=''/><author><name>FlyingSheep</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_uk2q-bc5eAQ/SwW62Duw1nI/AAAAAAAAAAM/6CGYucwKJaA/S220/dsc_6061.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1986806.post-107946174918892472</id><published>2004-03-16T13:29:00.000-05:00</published><updated>2004-03-16T13:31:31.170-05:00</updated><title type='text'></title><content type='html'>Session Report: March 15, 2004&lt;br /&gt;Games Played: Touche, Clans, Bucket King, Liar's Dice, Electronic Catchphrase&lt;br /&gt;Gamers: Rob, Mark, Mike, Marianne, Chip, Vitas&lt;br /&gt;&lt;br /&gt;Thanks to Rob for hosting. &lt;br /&gt;&lt;br /&gt;TOUCHE (0:15)&lt;br /&gt;	Chip: 	3&lt;br /&gt;	Marianne: 1&lt;br /&gt;&lt;br /&gt;	Rob, Mike, and Vitas were playing Attika when we arrived, so Marianne and I entertained ourselves with flipping magnets. Vitas told us two of the ten or so rules, and that was good enough for us. After we played a few games, he tried to explain some of the other rules, but we weren't listening (: Not a bad way to waste fifteen minutes. &lt;br /&gt;&lt;br /&gt;CLANS (0:23)&lt;br /&gt;	Vitas: 	46&lt;br /&gt;	Marianne: 44&lt;br /&gt;	Chip: 	44&lt;br /&gt;	Mike:	43&lt;br /&gt;	Rob: 	22&lt;br /&gt;&lt;br /&gt;	Attika finished up just as I had set up Clans, so we did a quick rules refresher and started the game. Once again, we were playing with one player over the limit. &lt;br /&gt;	Despite having little success with this strategy before, I tried to keep my color huts spread out in hopes of being in as many villages as possible, while creating villages when they came along and preventing the next player from getting an easy score. I need to pay more attention to the actual formation of each village. &lt;br /&gt;	As a footnote, somehow Rob thought that the tokens that players received were worth ten points each, and thus he focused solely on acquiring them. He was disappointed, to say the least, when they turned out to be worth only a single point each. &lt;br /&gt;	This is a fun game that I don't play often enough. &lt;br /&gt;&lt;br /&gt;BUCKET KING (0:40)&lt;br /&gt;	Mark: 	5&lt;br /&gt;	Rob: 	4&lt;br /&gt;	Chip:	3&lt;br /&gt;	Mike:	2&lt;br /&gt;	Vitas: 	1&lt;br /&gt;	Marianne: 0&lt;br /&gt;&lt;br /&gt;	At this point, Mark arrived. I preferred to break into two groups of three, but I was outvoted, so we played Bucket King for six instead. I did manage to convince to group to play one round until everyone was eliminated (a la Liar's Dice) instead of three rounds, which would have taken considerably longer. &lt;br /&gt;	This turned out to be the most fun session of Bucket King I've ever played. Rob consistently reminded us who was winning (as early as the second bucket falling), and we all watched eagerly for the next player to run out of cards. &lt;br /&gt;	I wasn't able to stay in the entire game, but I was happy to cause the demise of two players. I made Vitas lose six buckets in a single strike, leaving him with only one bucket remaining, and I took out Mike with a similar heavy-handed play later in the game. Unfortunately, this viciousness took its toll, and I wasn't able to compete against the more conservative Mark and Rob. &lt;br /&gt;	Despite the emphasis on elimination in this method of playing, I think this version is more tense and more exciting, even for the players that lose all their buckets early. It also left us with more time for other games.&lt;br /&gt;&lt;br /&gt;LIAR'S DICE (0:27)&lt;br /&gt;	Mike: 	5&lt;br /&gt;	Mark: 	4&lt;br /&gt;	Chip:	3&lt;br /&gt;	Vitas: 	2&lt;br /&gt;	Marianne: 1&lt;br /&gt;	Rob: 	0&lt;br /&gt;&lt;br /&gt;	Still looking for quick six-player games, we took out Liar's Dice. I think Vitas was new to the game, but everyone else had played before. &lt;br /&gt;	Rob fell victim to Vitas's strategy of always challenging. At one point, Mark called for 5 of a single die when there were three stars showing. I confidently increased the bid to three stars and the game moved on (: &lt;br /&gt;	Mark and Mike played a very good game, retaining all of their dice until they were the only two remaining. At the very end, Mark had one die, and Mike had two, when Mark opened with a bid of two 1s. Mike looked at his dice, neither of which was 1 or wild, and confidently called his bluff to end the game. &lt;br /&gt;&lt;br /&gt;ELECTRONIC CATCHPHRASE (0:38)&lt;br /&gt;	Rob, Chip, Mike: 	2 games&lt;br /&gt;	Vitas, Marianne, Mark: 	0 games&lt;br /&gt;&lt;br /&gt;	I suggested Electronic Catchphrase which was quickly agreed to by all. We set up some house rules before we started: 1) If the buzzer goes off while the device is between players, no one gets a point. 2) If a player says part of the clue, the clue giver can repeat that word to guide the players in the right direction. Happily, with these two rules we avoided most of the arguments that usually accompany this game. Some of the more impressive clues that each team got were "Tennessee Titans" and "Witch hazel". &lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1986806-107946174918892472?l=flyingsheep.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://flyingsheep.blogspot.com/feeds/107946174918892472/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1986806&amp;postID=107946174918892472&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/107946174918892472'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/107946174918892472'/><link rel='alternate' type='text/html' href='http://flyingsheep.blogspot.com/2004/03/session-report-march-15-2004-games.html' title=''/><author><name>FlyingSheep</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_uk2q-bc5eAQ/SwW62Duw1nI/AAAAAAAAAAM/6CGYucwKJaA/S220/dsc_6061.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1986806.post-107937613645466375</id><published>2004-03-15T13:42:00.000-05:00</published><updated>2004-03-15T13:44:37.280-05:00</updated><title type='text'></title><content type='html'>Session Report: March 13, 2004&lt;br /&gt;Games Played: Alhambra, King's Breakfast, 6 Nimmt!, Basari, Foppen&lt;br /&gt;Gamers: Marianne, Chip, Tom, Sara, Kevin, Lev, Linda, Dawn, Brandon, Raymond, Bill, Alec, Jerry.&lt;br /&gt;&lt;br /&gt;Thanks to Matt for hosting and for the chili!&lt;br /&gt;&lt;br /&gt;ALHAMBRA (1:12)&lt;br /&gt;	Sara: 	100&lt;br /&gt;	Tom: 	93&lt;br /&gt;	Chip: 	89&lt;br /&gt;	Kevin: 	88&lt;br /&gt;	Marianne: 38&lt;br /&gt;&lt;br /&gt;	When we arrived, there was a group playing Zoff in Buffalo. I haven't played it myself, but after watching the last few turns, it doesn't look all that appealing. After Zoff finished up, I brought out my new copy of Alhambra which I received for my birthday. I think Tom and Kevin were new to the game, but picked it up quickly. &lt;br /&gt;	I tried to stick to a strategy of only purchasing tiles with the exact amount, but after the second scoring round, there were some tiles that were simply too tempting. I wasn't able to build a decent wall, and I think this was reflected in my final score. &lt;br /&gt;	Alhambra becomes more chaotic with more players, but even with five players, there was some decent interaction. I took a money card that Sara needed to buy a tile that we were competing for (it was either white or purple), and followed up by purchasing that tile in my next turn. I don't usually pay attention to which player has which currency, but such knowledge does help me plan ahead. &lt;br /&gt;	This is a great game that I'm willing to play, even if I lose. I'm glad to add it to my collection. &lt;br /&gt;&lt;br /&gt;KING'S BREAKFAST (0:42, 2 rounds)&lt;br /&gt;	Lev:	(96) 36, 60&lt;br /&gt;	Chip: 	(92) 54, 38&lt;br /&gt;	Tom:	(91) 43, 48&lt;br /&gt;	Sara: 	(67) 30, 37&lt;br /&gt;	Linda:	(60) 26, 34&lt;br /&gt;	Marianne: (46) 23, 23&lt;br /&gt;&lt;br /&gt;	Sara and I had played King's Breakfast at EllisCon last year, and we wanted to try it again. We broke the official limit of number of players (five), but I don't think the game suffered any ill effects as a result. &lt;br /&gt;	When we played before, we shuffled the five copies of Emerald into different parts of the deck. We didn't do that this time, and four of the five cards came up in the same round. This was a bit unusual, but didn't seem to affect the game too much. &lt;br /&gt;	This is a quick, light game that I don't really have any strong feelings about. It's pleasant to play, and not too challenging. &lt;br /&gt;&lt;br /&gt;6 NIMMT! (0:50)&lt;br /&gt;	Tom: 	13&lt;br /&gt;	Dawn: 	33&lt;br /&gt;	Lev:	40&lt;br /&gt;	Sara: 	41&lt;br /&gt;	Chip: 	53&lt;br /&gt;	Brandon: 52&lt;br /&gt;	Marianne: 54&lt;br /&gt;	Raymond: 72&lt;br /&gt;&lt;br /&gt;	There were a number of people standing around while we finished King's Breakfast, so I suggested a game for lots of people. A few players were new to the game, but I think everyone enjoyed it. &lt;br /&gt;	There were some really painful rounds. Lev managed to take 34 bulls in the first round, while Sara and Brandon escaped untouched. Raymond took it one step further and gathered 47 bulls in the second round, bringing him one point shy of ending the game. We all watched Ray carefully in the last round, as he made it through nine tricks without taking a single card. Unfortunately, he took seven points in the last trick, and the game ended with Tom in the lead by a considerable margin. &lt;br /&gt;	This game gets more chaotic and a lot more fun with more people. It brings out the sadist in everyone. &lt;br /&gt;&lt;br /&gt;BASARI (0:55)&lt;br /&gt;	Alec:	96&lt;br /&gt;	Bill: 	69&lt;br /&gt;	Chip: 	64&lt;br /&gt;	Sara: 	61&lt;br /&gt;&lt;br /&gt;	I brought out my other birthday present game - Basari. I had played this once before at Out of the Box's booth at Gencon last year. &lt;br /&gt;	I need some practice at determining what to bid when haggling over the right to a contested action. A few more plays should help me see the value of things more clearly. As it was, I started the third round with two gems. While that didn't help my chance of winning, at least I wasn't completely eliminated from the game as I could still try to get VP and die rolls to try for the round-completion bonus. &lt;br /&gt;	Bill lead for most of the game, and even gave Sara some gems to keep Alec from getting the red gem bonus. Alec had some high rolls early in the game and got the 10 points bonus each round (as well as number of gem bonuses). &lt;br /&gt;	This is a fun and challenging game. I look forward to playing it again soon, and hopefully learning from my mistakes. &lt;br /&gt;&lt;br /&gt;FOPPEN (0:50)&lt;br /&gt;	Sara: 	-3&lt;br /&gt;	Alec: 	-10&lt;br /&gt;	Tom: 	-12&lt;br /&gt;	Jerry:	-13&lt;br /&gt;	Marianne: -27&lt;br /&gt;	Chip:	-51&lt;br /&gt;&lt;br /&gt;	We were back up to six players, and someone suggested Foppen, which is new to me. We had a brief explanation of the rules and scoring, and we started. &lt;br /&gt;	I made some bad choices in a few hands, occasionally playing a risky card when I had a safer choice in my hand. Although these decisions played a part in my final score, I also received a really unbalanced hand in the last round. I never seemed to have cards in requested color and I played the foppen tile as often as I played cards. I lost 25 points that round, doubling my already negative score. &lt;br /&gt;	Despite my dismal performance in this game (and my usual distaste for trick-taking games), I enjoyed playing Foppen. The rules are simple and elegant, and there's plenty of room for strategy. The role that luck plays (say, in getting a poor hand) is outweighed by playing a number of rounds. I look forward to playing again. &lt;br /&gt;&lt;br /&gt;	Unfortunately, I wasn't feeling well enough to stay for Rob's Haste Worte game, which I was looking forward to. I'm sure it was a resounding success, and hope I get to participate in the next one. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;	&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1986806-107937613645466375?l=flyingsheep.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://flyingsheep.blogspot.com/feeds/107937613645466375/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1986806&amp;postID=107937613645466375&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/107937613645466375'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/107937613645466375'/><link rel='alternate' type='text/html' href='http://flyingsheep.blogspot.com/2004/03/session-report-march-13-2004-games.html' title=''/><author><name>FlyingSheep</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_uk2q-bc5eAQ/SwW62Duw1nI/AAAAAAAAAAM/6CGYucwKJaA/S220/dsc_6061.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1986806.post-107825130428279608</id><published>2004-03-02T13:15:00.000-05:00</published><updated>2004-03-02T13:17:12.530-05:00</updated><title type='text'></title><content type='html'>Some monthly stats for February 2004&lt;br /&gt;&lt;br /&gt;Total games played: 	74&lt;br /&gt;Unique games played:	35&lt;br /&gt;Total gaming sessions:	24&lt;br /&gt;&lt;br /&gt;Total Gaming Time: 	36:54&lt;br /&gt;Total Set-up Time:	 1:46&lt;br /&gt;Average Game Length:	 0:30&lt;br /&gt;&lt;br /&gt;Games played more then once this month (other then Magic):&lt;br /&gt;&lt;br /&gt;Eight times:	Switch (aka Qwitch)&lt;br /&gt;Three Times:	Hick Hack in Gackelwack, My Word, Domaine, Land Unter!&lt;br /&gt;Twice:		Rainbows, Knights of the Rainbow, Gold Digger, Finstere Flure, Dvonn&lt;br /&gt;&lt;br /&gt;New games this month:&lt;br /&gt;&lt;br /&gt;Domaine&lt;br /&gt;Syzygy&lt;br /&gt;Finstere Flure&lt;br /&gt;Xactika&lt;br /&gt;Rainbows&lt;br /&gt;Mama Mia&lt;br /&gt;Formula De (Full Version)&lt;br /&gt;Goldland&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Game of the month: Domaine&lt;br /&gt;	I enjoyed Lowenherz sufficiently to buy this remake without playing it first (something I try to avoid). Mike, Vitas, Sara and I played it on the day I bought it, and enjoyed it thoroughly. In fact, three of us played it again a few nights later at SOG. Everyone that I've played it with so far has asked to play it again, which is a good sign. &lt;br /&gt;	It doesn't have the bidding mechanic of the original, but there are still plenty of choices to make. It does still have the wild scoring swings, but scoring is less fiddly (no more chart lookups) and easier to validate mid-game. &lt;br /&gt;	I look forward to playing this game, and will enjoy introducing it to others. &lt;br /&gt;&lt;br /&gt;Computer Games played: Zax&lt;br /&gt;&lt;br /&gt;PS2 Games played: Ratchet and Clank II: Going commando. Finished it the first time after 30 hours, finished it again in 15 hours. There's still some interesting gameplay left. &lt;br /&gt;&lt;br /&gt;Notes: &lt;br /&gt;	Wow! Lots of gaming time this month. Unity games contributed as well as playing games at home with my sister almost every night (this also explains the recent jump in Switch playing). Despite her insistence that she's no good at strategy games, she holds her own, beating 4 of us at Oasis just last night. &lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1986806-107825130428279608?l=flyingsheep.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://flyingsheep.blogspot.com/feeds/107825130428279608/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1986806&amp;postID=107825130428279608&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/107825130428279608'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/107825130428279608'/><link rel='alternate' type='text/html' href='http://flyingsheep.blogspot.com/2004/03/some-monthly-stats-for-february-2004.html' title=''/><author><name>FlyingSheep</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_uk2q-bc5eAQ/SwW62Duw1nI/AAAAAAAAAAM/6CGYucwKJaA/S220/dsc_6061.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1986806.post-107824634336848021</id><published>2004-03-02T11:52:00.000-05:00</published><updated>2004-03-02T11:54:30.966-05:00</updated><title type='text'></title><content type='html'>Session Report: March 1, 2004&lt;br /&gt;Games Played: Oasis, Industria&lt;br /&gt;Gamers: Marianne, Sara, Chip, Mike, Josh, Lewis, Sue&lt;br /&gt;&lt;br /&gt;Thanks to Rob for hosting. &lt;br /&gt;&lt;br /&gt;OASIS (1:00)&lt;br /&gt;	Marianne: 93&lt;br /&gt;	Chip: 	81&lt;br /&gt;	Mike:	74&lt;br /&gt;	Sara: 	72&lt;br /&gt;	Josh: 	64&lt;br /&gt;&lt;br /&gt;	I'm still infected with the "new game" bug, so when Mike suggested Oasis, I jumped at the chance. Mike was the only one who had played before, and after a quick rules explanation, we began. &lt;br /&gt;	I made a few mistakes early on in the game, taking multipliers because I thought I would be able to develop all the different types of areas and camels. I soon realized that some sort of specialization would be required, and I concentrated on grasslands and wheat fields, ignoring stone and camels completely. Marianne specialized in camels (and camel multipliers), which proved to be a winning strategy. Josh mostly complained about his lousy cards and being last all the time. &lt;br /&gt;	When revealing cards for the auction, I tried the following strategy. I'd flip the first one and see if it would appeal to the current starting player. If so, then I'd flip one or two more in order to create an irresistible offer. Otherwise, I'd cut my losses, hope that someone wanted my single card, and take two cards to increase my chances of making a good offer the next round. In other words, if I couldn't get the starting token (and the associated bonus), I wasn't going to put much of an effort in. This isn't to say that second place is bad (as you have a better selection of stuff to take from), but I'd like to try this strategy again to see how it works out. &lt;br /&gt;	There was a question about whether the penultimate player was forced to take the last player's offer (as otherwise, the last player would have to take his or her own offer). There aren't any rules clarifications on boardgamegeek.com, but I did find "He may select any from the table except his own (unless its the only one left)." on RPG.net's review of the game (http://www.rpg.net/reviews/archive/10/10088.phtml). I can't remember exactly how we played it out, but I think that's what we agreed upon. &lt;br /&gt;	I tried to imagine what the game would be like if players could select their offer from their hand, rather than just flipping over cards from their stack. While it would offer players more control, I think it might also slow the game down and threaten analysis paralysis. I'd be willing to try it as a variant, though. &lt;br /&gt;	I liked this game a lot and look forward to playing again soon. Area control games tend to appeal to me, and Oasis is no exception. &lt;br /&gt;&lt;br /&gt;INDUSTRIA (1:42)&lt;br /&gt;	Lewis:	47&lt;br /&gt;	Sara: 	36&lt;br /&gt;	Chip:	35&lt;br /&gt;	Sue: 	27&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;	To everyone's shock and surprise, I requested Industria, so when Lewis brought it out, I felt some sort of obligation to push for it, even at the expense of a game of Alhambra (which Lewis also brought). Sue, Sara, and I were new to the game, and Lewis, who had played a few times previously, explained the rules. &lt;br /&gt;	I think the last player (myself, in this case) has a bit of a disadvantage in the beginning as he or she might not profit from an auction until the first epoch is over. Fortunately, this wasn't really a problem, as the auction moved around as players kept things that they wanted. I had more than enough cash throughout most of the game, which is a pretty good indication that I wasn't bidding enough. &lt;br /&gt;	There was a certain amount of pain in this initial game as plans seem a bit fragile - players might not bid on your auctions, forcing you to take things you don't want, and a player might not build a factory that produces the item you need to finish your building before your turn. These are problems that probably become less frequent with repeated playings. &lt;br /&gt;	In terms of not being able to do everything you want to, this game reminds me of Princes of Florence. However, Industria seems a bit more forgiving - everyone was able to do something during the last few rounds. &lt;br /&gt;	I'm not sure how I feel about this game. I think I'd have to play it again to be sure. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1986806-107824634336848021?l=flyingsheep.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://flyingsheep.blogspot.com/feeds/107824634336848021/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1986806&amp;postID=107824634336848021&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/107824634336848021'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/107824634336848021'/><link rel='alternate' type='text/html' href='http://flyingsheep.blogspot.com/2004/03/session-report-march-1-2004-games.html' title=''/><author><name>FlyingSheep</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_uk2q-bc5eAQ/SwW62Duw1nI/AAAAAAAAAAM/6CGYucwKJaA/S220/dsc_6061.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1986806.post-107790676925290903</id><published>2004-02-27T13:32:00.000-05:00</published><updated>2004-02-27T13:34:53.186-05:00</updated><title type='text'></title><content type='html'>Session Report: February 26, 2004&lt;br /&gt;Games Played: Epic Duels, Hick Hack, Land Unter!, Bohnanza&lt;br /&gt;Gamers: Dylan, Chuck, Eric, Chip, Matt, Geno, Marianne, Sara&lt;br /&gt;&lt;br /&gt;EPIC DUELS (0:55)&lt;br /&gt;	Eric, Chip: 	won&lt;br /&gt;	Dylan, Chuck:	lost&lt;br /&gt;&lt;br /&gt;	Eric (the Emperor) and I (Jango Fett) played the dark side against Chuck (Mace Windu) and Dylan (Anakin Skywalker). Anakin came out swinging, with Padme close behind. Unfortunately, that meant that he was an easy target for Jango and his sidekick Lam, as well as the two Royal Guards. The Emperor and Mace stayed in the background, sending their minions into the fray. &lt;br /&gt;	After Lam finished off Anakin with a sniper shot (6 damage if not blocked), Jango and Lam went after Mace, while the Emperor and his guards tracked down Padme. Unfortunately, Dylan was stuck with mostly Anakin cards in his hand which, while they kept Padme alive, reduced his offensive and defensive options. The game ended as Mace was killed by another Sniper Shot. &lt;br /&gt;	This game is pretty light, but it's a lot of fun when players get into the theme, especially as much as Dylan did. Incidentally, Epic Duels is on sale at KB Toys for $4.99 online (I've heard it's $7.99 in stores). [url]http://www.kbtoys.com/genProduct.html/PID/1624639/ctid/17/INstock/Y/D/530/ls/default[/url]&lt;br /&gt;&lt;br /&gt;HICK HACK (0:12, 0:12)&lt;br /&gt;	Marianne: 44, 42&lt;br /&gt;	Geno:	38, 42&lt;br /&gt;	Matt: 	37, 35&lt;br /&gt;	Chip: 	33, 24&lt;br /&gt;	Sara:	 8, 24&lt;br /&gt;&lt;br /&gt;	After dinner, we played two rounds of Hick Hack in Gacklewack (aka Pick Picnic). Marianne beat us all in the first round and then tied with Geno in the second. Despite my relatively low scores, I did manage to eat two chickens in a single turn, netting 11 points. Otherwise, I was out sync with everyone else - placing my chickens right in front of a fox while my foxes went away hungry. &lt;br /&gt;	This is a great starter game - very fun, light, and social. &lt;br /&gt;&lt;br /&gt;LAND UNTER! (0:38)&lt;br /&gt;	Sara:	18&lt;br /&gt;	Marianne: 13&lt;br /&gt;	Matt: 	12&lt;br /&gt;	Chip: 	10&lt;br /&gt;	Geno:	8&lt;br /&gt;	&lt;br /&gt;	Next out was Marianne's favorite game (as long as she's winning), the drowning sheep game. We played all five rounds relatively quickly. Marianne and Sara played Matt's opening hand well, while Sara did best with Geno's initial set of cards. Matt did the best with Marianne's hand, and everyone except for Matt and Geno did well with Sara's hand. Matt also did the best job with my first hand (which I scored -1 with). Sara won by a large margin, never scoring less than 3 points in any round. &lt;br /&gt;&lt;br /&gt;BOHNANZA (0:50)&lt;br /&gt;	Chip: 	19&lt;br /&gt;	Geno: 	15&lt;br /&gt;	Marianne: 15&lt;br /&gt;	Sara: 	13&lt;br /&gt;	Matt: 	13&lt;br /&gt;&lt;br /&gt;	We ended the evening with a round of Beans. While this is a solid game, after a number of plays it becomes a bit mechanical. Still, negotiating with other players and watching the dynamics change is always fun. &lt;br /&gt;	The garden beans (6) came out early in the game, and I was fortunate enough to eat up 5 of the six, making the last bean utterly useless. Sara was stuck with this bean twice, although I offered to burn it for her (I think she's still trying to figure out how I profited from that). I was usually the first to make an trade offer, and pushed to complete the deals before other players could put together an offer (especially a better offer!). I think this, along with a number of lucky draws, contributed to my success. &lt;br /&gt;&lt;br /&gt;	I had a great time playing games. Hope to see you all again next week for more board games (and maybe some Magic).&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1986806-107790676925290903?l=flyingsheep.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://flyingsheep.blogspot.com/feeds/107790676925290903/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1986806&amp;postID=107790676925290903&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/107790676925290903'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/107790676925290903'/><link rel='alternate' type='text/html' href='http://flyingsheep.blogspot.com/2004/02/session-report-february-26-2004-games.html' title=''/><author><name>FlyingSheep</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_uk2q-bc5eAQ/SwW62Duw1nI/AAAAAAAAAAM/6CGYucwKJaA/S220/dsc_6061.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1986806.post-107766125355199412</id><published>2004-02-24T17:20:00.000-05:00</published><updated>2004-02-24T17:22:54.810-05:00</updated><title type='text'></title><content type='html'>Session Report: February 23, 2004&lt;br /&gt;Games Played: Mama Mia, Syzygy, Finstere Flure&lt;br /&gt;Gamers: Josh, Marianne, Sara, Lewis, Vitas, Joyce, Chip&lt;br /&gt;&lt;br /&gt;Thanks to Josh for hosting. &lt;br /&gt;&lt;br /&gt;MAMA MIA (0:40)&lt;br /&gt;	Chip: 	7&lt;br /&gt;	Sara:	5&lt;br /&gt;	Marianne: 4&lt;br /&gt;	Joyce:	4&lt;br /&gt;&lt;br /&gt;	I've heard a lot about Mama Mia, and was looking forward to trying it. While it does have a strong memory component, which isn't my cup of tea, I enjoyed my first play of this game. &lt;br /&gt;	During the first round, I was completely lost. We were all new to the game, so we didn't really know what we were doing in the first round. Nevertheless, everyone managed to complete at least two pizzas - except for me. I didn't complete any. &lt;br /&gt;	In the last two rounds, I tried to make sure that I ended my hand with a lot of ingredients to help complete pizzas that were otherwise impossible. I was one card short of the Bombastico in the second round, but managed to complete it in the third (while leaving an olive open for my last pizza). &lt;br /&gt;	I'd play this game at least once again, but I'm not really thrilled by it. &lt;br /&gt;&lt;br /&gt;SYZYGY (0:23)&lt;br /&gt;	Sara: 	-1&lt;br /&gt;	Chip: 	-1&lt;br /&gt;	Joyce:	-3&lt;br /&gt;	Josh: 	-15 or so&lt;br /&gt;	Marianne: -20 or so&lt;br /&gt;&lt;br /&gt;	Josh offered a word game and Sara jumped at it, so out it came. We were all new to the game, except for Josh. &lt;br /&gt;	We each had a good run of completing our crosswords as the game progressed. When a player completes his or her crossword, it's usually pretty easy to place the next tile (especially if it is a vowel). As such, usually the same player would call "Draw" five times or so before getting stuck, and then another player would take up the stream. It's a little frustrating to draw additional tiles when you're having difficulty playing the tiles at hand, but it's not overwhelming. &lt;br /&gt;	There was some discussion at the end about the validity of one of Josh's words. Although I was the first to question it, I was willing to let it pass. Sara, however, realized that this point could tie her for first place, and challenged the word. I believe the majority opinion was that the word in question was not valid. Otherwise, Josh would have won with 0 points. &lt;br /&gt;	It seems to me that a player could play very well throughout the game and then get stuck with a bad tile near the end and thus lose the game. I think that drawing more than a single tile would make an interesting variant, as it would reduce the twitch factor of the game. I would definitely play this again. &lt;br /&gt;&lt;br /&gt;FINSTERE FLURE  (1:14)&lt;br /&gt;	Lewis: 	won&lt;br /&gt;	Josh, Marianne, Sara, Vitas, Joyce, Chip: lost&lt;br /&gt;&lt;br /&gt;	There was a collective sigh of relief when this game finally completed. I was a little lukewarm on this game when we played with four, but seven is far too many. &lt;br /&gt;	I did find more strategy and planning in this game than in the previous play. At least twice, I took advantage of the fact that the monster doesn't change direction if players are equidistant. I found this sort of planning very satisfying. &lt;br /&gt;	Close to the end of the game, I was under the impression that Josh and I were close enough to exit with two of our pieces during the next turn. As he would be the start player, he would win. Instead of using my third guy to lure away the monster, I tried to use him to lure the monster towards Josh. Unfortunately, my plan failed and the monster ate all three of my characters in a single walk. During the next turn, I realized that Josh wasn't about to walk out the door with his second character, so, had I successfully sacrificed my third character, I would have won. &lt;br /&gt;	While I definitely wouldn't play this game again with seven, this second playing exposed some strategic thinking that I like. Overall, my impression of this game (with four or less players) has improved. &lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1986806-107766125355199412?l=flyingsheep.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://flyingsheep.blogspot.com/feeds/107766125355199412/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1986806&amp;postID=107766125355199412&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/107766125355199412'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/107766125355199412'/><link rel='alternate' type='text/html' href='http://flyingsheep.blogspot.com/2004/02/session-report-february-23-2004-games.html' title=''/><author><name>FlyingSheep</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_uk2q-bc5eAQ/SwW62Duw1nI/AAAAAAAAAAM/6CGYucwKJaA/S220/dsc_6061.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1986806.post-107703866755558483</id><published>2004-02-17T12:24:00.000-05:00</published><updated>2004-02-17T12:26:21.590-05:00</updated><title type='text'></title><content type='html'>Session Report: February 16, 2004&lt;br /&gt;Games Played: Land Unter!, My Word!, Finstere Flure, Formula De, 6 Nimmt!&lt;br /&gt;Gamers: Jeff, Mark, Joyce, Chip, Vitas, Theresa, Josh, and others&lt;br /&gt;&lt;br /&gt;Thanks to Chris for hosting!&lt;br /&gt;Welcome to Jeff and Theresa, our newest SOG additions!&lt;br /&gt;&lt;br /&gt;LAND UNTER! (0:18)&lt;br /&gt;	Josh: 	5&lt;br /&gt;	Marianne: 2&lt;br /&gt;	Chip:	1&lt;br /&gt;&lt;br /&gt;	Josh brought a copy of this game, and easily convinced Marianne and I to play it. After all, I like sheep, and Marianne likes to watch people suffer. Either I was going easy on Josh (as it was his first try at the game), or my brain hadn't kicked into gear yet. I found myself making very poor choices, even with a good hand (especially the last round). &lt;br /&gt;	Marianne did very well with Josh's opening hand, and Josh did well with Marianne's opening hand (in fact, he was the only one to stay above water). Each round ended prematurely with either Marianne or me being eliminated from the game, something that rarely happens with four or more players. &lt;br /&gt;	This is a really good quick game, and I'm happy to play it. &lt;br /&gt;&lt;br /&gt;MY WORD! (0:05 or less)&lt;br /&gt;	Marianne: 24&lt;br /&gt;	Josh: 	17&lt;br /&gt;	Chip: 	7&lt;br /&gt;	Joyce: 	?&lt;br /&gt;&lt;br /&gt;	Joyce and I discussed other word forming games after UG7, so I had to bring My Word! It's a twitch game, but a short one, so I thought it wouldn't be too bad. &lt;br /&gt;	Josh and Marianne called out most words almost simultaneously, and he, being a gentleman, let her take most of the cards. I'd have to say that it was closer than the scores make it seem. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;FINSTERE FLURE (0:53)&lt;br /&gt;	Josh: 	won&lt;br /&gt;	Joyce, Chip, Marianne: lost&lt;br /&gt;	&lt;br /&gt;	I had heard quite a bit about this game, especially the comparisons to RoboRally, so I was looking forward to playing Josh's copy. There was a little confusion about the rules at the beginning, but we quickly got the hang of it. &lt;br /&gt;	My plan (if I had one) was to leave one of my people behind to distract the monster while my other tokens ran for the exit. Unfortunately, the monster gobbled up three of my people (two for good), and I was left with little hope for victory. Fortunately, I was able to get one guy to escape, and used the other one to attract the monster towards Marianne's last piece. This had little effect on the final outcome (Josh would have won anyways), but it felt good. &lt;br /&gt;	I like this game, and would play again.&lt;br /&gt;&lt;br /&gt;FORMULA DE (1:31)&lt;br /&gt;	Mark: 	1st&lt;br /&gt;	Jeff: 	2nd&lt;br /&gt;	Vitas:	3rd&lt;br /&gt;	Theresa: 4th&lt;br /&gt;	Chip:	5th&lt;br /&gt;	Joyce: 	dropped out&lt;br /&gt;&lt;br /&gt;	Mark brought out his new copy of Formula De. I was torn between playing this and trying to get a game of Attika going, but I opted for the racing game. I've only previously played with the Mini rules, so I consider it a psuedo-new game. &lt;br /&gt;	The good news is that the additional mechanics of the full version are not overwhelming and, after a few plays of the Mini-version, were easily incorporated into my understanding of the game. The bad news is that it still seems to suffer from the runaway leader/unwinnable position problem. &lt;br /&gt;	Mark was well in the lead for well over half of the game. There was a little shifting in position behind him, but nothing terribly interesting - Vitas and Jeff traded spaces once or twice as the second player. Battling for fifth place is not as exciting as it sounds (and that's not saying much). Joyce was sufficiently frustrated with the game as to drop out in the last round. I've seen other last-place players drop out of this game (or at least lose all interest) previously. I've given Formula De three plays, and I'm not inclined to play it again. &lt;br /&gt;&lt;br /&gt;6 NIMMT! (0:30)&lt;br /&gt;	Joyce: 	26&lt;br /&gt;	Chip:	31&lt;br /&gt;	Jeff: 	35&lt;br /&gt;	Mark: 	46&lt;br /&gt;&lt;br /&gt;	Looking for something quick to play, I suggested that we introduce Jeff to 6 Nimtt!, SOG's pain-inducing game of choice. &lt;br /&gt;	I didn't take any points in the first round, offloading most of them to Jeff and Mark, but the tides of fortune change quickly, and I took 20 points in the second round. Mark outdid me in the final round, taking 23 points. Joyce suffered the least and won our abbreviated game. &lt;br /&gt;	This is a great game; I'll play it anytime.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1986806-107703866755558483?l=flyingsheep.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://flyingsheep.blogspot.com/feeds/107703866755558483/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1986806&amp;postID=107703866755558483&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/107703866755558483'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/107703866755558483'/><link rel='alternate' type='text/html' href='http://flyingsheep.blogspot.com/2004/02/session-report-february-16-2004-games.html' title=''/><author><name>FlyingSheep</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_uk2q-bc5eAQ/SwW62Duw1nI/AAAAAAAAAAM/6CGYucwKJaA/S220/dsc_6061.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1986806.post-107642743432633260</id><published>2004-02-10T10:37:00.000-05:00</published><updated>2004-02-10T10:39:01.153-05:00</updated><title type='text'></title><content type='html'>Session Report: Unity Games VII (February 7, 2004)&lt;br /&gt;Games Played: Alhambra, Killer Bunnies and the Quest for the Magic Carrot, Quiddler, Coloretto, Lord of the Fries (a bit)&lt;br /&gt;Gamers: Ben, Sara, Joyce, Matt, Chip&lt;br /&gt;&lt;br /&gt;Thanks to Dave and crew for organizing this great day of gaming. &lt;br /&gt;Very special thanks to Craig and his group. The prize table was perfect - don't change a thing for UG8. &lt;br /&gt;&lt;br /&gt;ALHAMBRA (1:10)&lt;br /&gt;	Ben: 	122&lt;br /&gt;	Chip: 	100&lt;br /&gt;	Sara: 	81&lt;br /&gt;	Joyce: 	72&lt;br /&gt;&lt;br /&gt;	One of the great things about UG is playing with friends that you haven't seen since the last convention (: We met up with Ben early and taught him (and Joyce) this game. Despite my initial intentions to play some new games, I couldn't resist the lure of Alhambra!&lt;br /&gt;	After explaining the rules, Ben predicted he would win this game and, lo and behold, he did. See, when I make comments like that, the gods strike me down for my hubris. I don't know how he got away with it. As I've said before, Alhambra is a game that I can enjoy even (on those rare occasions) when I lose. &lt;br /&gt;&lt;br /&gt;KILLER BUNNIES AND THE QUEST FOR THE MAGIC CARROT (1:15)&lt;br /&gt;	Ben: 	won&lt;br /&gt;	Joyce, Sara: lost with bunnies&lt;br /&gt;	Matt, Chip: lost without bunnies&lt;br /&gt;&lt;br /&gt;	Matt brought his collection of Killer Bunny cards, and we managed to convince Joyce and Ben to join us in this random luckfest. They'll probably never play again (: &lt;br /&gt;	Matt complained bitterly early in the game about his lack of bunnies. When he finally started drawing bunnies, he drew nothing but bunnies ("when it rains. . ."). With six healthy bunnies on the table, he proclaimed, "Well, I should be safe now." Sara smirked as his comment and, a few turns later, unleashed a Stray Asteroid that destroyed every last one of his bunnies. &lt;br /&gt;	No bunny is safe in this game, as I found out. I had an angelic halo (or something) on one of my bunnies that protected it from almost anything. But Matt made me wager the bunny away, leaving me pet-less. &lt;br /&gt;	As a result, Matt and I surrendered our hard-earned carrot cards to Sara, who now had 17 or so of the 20 cards. Ben, who had three cards, won. &lt;br /&gt;	Killer Bunnies is fun to play in the same way that a really horrible B-grade movie is fun to watch. &lt;br /&gt;&lt;br /&gt;	At this point, Sara, Joyce, and I went into "short-game" mode before dinner. &lt;br /&gt;&lt;br /&gt;QUIDDLER (0:20)&lt;br /&gt;	Sara: 	91&lt;br /&gt;	Joyce:	29&lt;br /&gt;	Chip:	25&lt;br /&gt;	&lt;br /&gt;	We played three quick rounds of Quiddler. The first two rounds were lopsided, as Sara went out in the first round, leaving Joyce and I vowel-less (and pointless as well). But we all got something out of it - Sara got to beat us soundly, Joyce discovered a new game that she likes (and has added to her collection), and I learned a new word ("cay") which will come in handy in Scrabble and other word games. &lt;br /&gt;&lt;br /&gt;COLORETTO (0:15)&lt;br /&gt;	Chip: 	43&lt;br /&gt;	Sara:	38&lt;br /&gt;	Joyce: 	37&lt;br /&gt;	&lt;br /&gt;	We played a single round of Coloretto, which I think I enjoyed more than Sara or Joyce. With little interest in playing another round, we switched to Lord of the Fries. We got filled two orders before it was time to head to the Naked Fish for dinner. &lt;br /&gt;&lt;br /&gt;	The afternoon flew by fast, and I can't wait for Unity Games VIII!&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1986806-107642743432633260?l=flyingsheep.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://flyingsheep.blogspot.com/feeds/107642743432633260/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1986806&amp;postID=107642743432633260&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/107642743432633260'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/107642743432633260'/><link rel='alternate' type='text/html' href='http://flyingsheep.blogspot.com/2004/02/session-report-unity-games-vii.html' title=''/><author><name>FlyingSheep</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_uk2q-bc5eAQ/SwW62Duw1nI/AAAAAAAAAAM/6CGYucwKJaA/S220/dsc_6061.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1986806.post-107609602732109953</id><published>2004-02-06T14:33:00.000-05:00</published><updated>2004-02-06T14:35:30.186-05:00</updated><title type='text'></title><content type='html'>Session Report: February 5, 2004&lt;br /&gt;Games Played: Domaine&lt;br /&gt;Gamers: Jimmy, Geno, Marianne, Chip&lt;br /&gt;&lt;br /&gt;When I arrived, there was already a game of Risk 2210 AD (or something) at the other table. &lt;br /&gt;&lt;br /&gt;DOMAINE (1:22)&lt;br /&gt;	Jimmy:	22&lt;br /&gt;	Chip:	21&lt;br /&gt;	Marianne: 19&lt;br /&gt;	Geno:	16&lt;br /&gt;&lt;br /&gt;	We went over the rules quickly, placed our castles on the board and started in. &lt;br /&gt;	It wasn't long before I realized that I had placed most of my castles next to the same types of mines, limiting my potential income. Fortunately, everyone else had a similarly unprofitable arrangement. &lt;br /&gt;	As before, I tried to get a mine or two early. With the combined help of Geno (who suggested that Marianne place a border piece to help me) and Marianne (who complied), I was able to complete a domain shortly after Marianne finished hers. &lt;br /&gt;	After establishing my first domain, I was debating between concentrating my efforts on that single area or developing my other castles. My best games have always neglected one or two of my castles. For the sake of trying something different, I spread out, and defined all three domains. In retrospect, it didn't really buy me much. &lt;br /&gt;	Most of the game was very balanced and friendly. We all developed our domains by claiming neutral territory, rather than encroaching upon our neighbors. As such, almost every square was part of some domain, benefiting the players with castles in the center of the board. In fact, Marianne was able to claim a 15-point domain (although most of it was ripped away shortly thereafter). &lt;br /&gt;	The scores varied drastically throughout the game, which adds to the appeal of this game. In addition to Marianne's uber-domain, Geno had a very solid lead on the rest of us for most of the later half of the game. The last few rounds saw some vicious treachery and expansion into others territories, as we all opted to playing some cards (while greedily eying the "most gold" end-game bonus). &lt;br /&gt;	Domaine is my new favorite game, so I was happy when everyone agreed to play it. I'll be bringing it again soon, I'm sure. It seemed to be a hit with Geno and Jimmy, and even Marianne has said that she'd be willing to play it again. &lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1986806-107609602732109953?l=flyingsheep.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://flyingsheep.blogspot.com/feeds/107609602732109953/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1986806&amp;postID=107609602732109953&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/107609602732109953'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/107609602732109953'/><link rel='alternate' type='text/html' href='http://flyingsheep.blogspot.com/2004/02/session-report-february-5-2004-games.html' title=''/><author><name>FlyingSheep</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_uk2q-bc5eAQ/SwW62Duw1nI/AAAAAAAAAAM/6CGYucwKJaA/S220/dsc_6061.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1986806.post-107582325085689902</id><published>2004-02-03T10:47:00.000-05:00</published><updated>2004-02-03T10:49:10.543-05:00</updated><title type='text'></title><content type='html'>Session Report: February 2, 2004&lt;br /&gt;Games Played: Hick Hack in Gackelwack, Domaine&lt;br /&gt;Gamers: Lowell, Marianne, Joyce, Sara, Josh, Chip, (Chris, Vitas, Lewis, Rob, Nancy)&lt;br /&gt;&lt;br /&gt;Thanks to Chris for hosting. &lt;br /&gt;&lt;br /&gt;HICK HACK (0:16)&lt;br /&gt;	Sara:	50&lt;br /&gt;	Lowell: 35&lt;br /&gt;	Chip:	30&lt;br /&gt;	Joyce: 	18&lt;br /&gt;	Josh:	18&lt;br /&gt;	Marianne: 14&lt;br /&gt;&lt;br /&gt;	To get the ball rolling, I pushed for a quick game of Hick Hack. In a karma-induced reversal, I patiently explained the rules as Josh interrupted with questions (: &lt;br /&gt;	Not much to say about this quick light game - Marianne challenged every time, Josh bemoaned his fox-filled hand, and Sara quietly gathered chickens and feed for the win. Good way to start off the night as other gamers arrived. &lt;br /&gt;&lt;br /&gt;DOMAINE (1:15)&lt;br /&gt;	Vitas: 	22 (won)&lt;br /&gt;	Chip:	22 (lost)&lt;br /&gt;	Lowell:	16&lt;br /&gt;	Sara:	 3&lt;br /&gt;&lt;br /&gt;	I really wanted to get a game of Domaine in, so I started it shortly after Hick Hack. It's a good sign of the game that Sara and Vitas (who had just played Domaine two days ago) were anxious to play again. Lowell was vaguely familiar with Lowenherz and picked up the rules quickly. &lt;br /&gt;	I sought out and captured two mines early in the game to get off to a good start. I didn't hold them for long before Lowell took them away from me. Lowell and I dueled over this rich plot of land for most of the game (including, I think, at least three treachery cards), while Vitas and Sara battled over the central city. &lt;br /&gt;	During the last few turns, I realized that my lead would be threatened if I didn't get one of the "most gold" bonuses at the end of the game. As I completed my third domain, I had to choose between spending 3 extra gold to enclose an additional forest or saving my gold for the bonus. I choose poorly. I didn't get the bonus, which allowed Vitas (with the 5 points bonus) to tie my score. As ties are broken my the most gold, Vitas won. &lt;br /&gt;	This is a great game. I hope to play it again soon. &lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1986806-107582325085689902?l=flyingsheep.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://flyingsheep.blogspot.com/feeds/107582325085689902/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1986806&amp;postID=107582325085689902&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/107582325085689902'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/107582325085689902'/><link rel='alternate' type='text/html' href='http://flyingsheep.blogspot.com/2004/02/session-report-february-2-2004-games.html' title=''/><author><name>FlyingSheep</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_uk2q-bc5eAQ/SwW62Duw1nI/AAAAAAAAAAM/6CGYucwKJaA/S220/dsc_6061.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1986806.post-107574274029798981</id><published>2004-02-02T12:25:00.000-05:00</published><updated>2004-02-02T12:27:19.170-05:00</updated><title type='text'></title><content type='html'>Some monthly stats for January 2004&lt;br /&gt;&lt;br /&gt;Total games played:	51&lt;br /&gt;Unique games played:	26&lt;br /&gt;Total gaming sessions:	17&lt;br /&gt;&lt;br /&gt;Total Gaming Time:	32:39&lt;br /&gt;Total Set-up Time:	 3:53&lt;br /&gt;Average Game Length:	 0:38&lt;br /&gt;&lt;br /&gt;Games played more then once this month (other then Magic):&lt;br /&gt;(4 times)&lt;br /&gt;Old Entdecker	&lt;br /&gt;&lt;br /&gt;(3 times)&lt;br /&gt;Wooly Bully	&lt;br /&gt;Rack-O	&lt;br /&gt;&lt;br /&gt;(twice)&lt;br /&gt;Frank's Zoo	&lt;br /&gt;Hick Hack in Gackelwack	&lt;br /&gt;Knights of the Rainbow	&lt;br /&gt;Lost Cities	&lt;br /&gt;nanuuk!	&lt;br /&gt;Scrabble	&lt;br /&gt;Land Unter!	&lt;br /&gt;&lt;br /&gt;New games this month:&lt;br /&gt;&lt;br /&gt;Old Entdecker&lt;br /&gt;Wooly Bully&lt;br /&gt;Samurai&lt;br /&gt;nanuuk!&lt;br /&gt;High Society&lt;br /&gt;Before I Kill You, Mr. Bond&lt;br /&gt;&lt;br /&gt;Game of the month: Old Entdecker&lt;br /&gt;&lt;br /&gt;	I received a copy of the original Entdecker (in German) for Christmas. I've played the new version a few times and was excited about trying the original version to see the differences. The biggest difference, I think, is the settler's race for the huts (in the new version). I don't think I've ever really done well at the huts, so I'm happy to play without that complication. &lt;br /&gt;	The card that tracks money is a bit fiddly, I think, and it's not entirely clear which number corresponds with which hole. On the other hand, this hasn't ever been a problem during the game, so I shouldn't really complain. &lt;br /&gt;	According to my translation of the game, the player that places the friendly natives tile gets to take a discovery disc, but it doesn't say what to do with it. I've suggested that, if the player settles on that tile, than the player can put the discovery disc face-down under his/her token. When that island is completed, the discovery disc is added to the value of the island, and that player gets to keep the disc (even is he/she is not the primary discoverer of the island). This makes the friendly native a bit more valuable (though not as valuable as the ruins, usually). &lt;br /&gt;&lt;br /&gt;PS2 Games played: &lt;br /&gt;	Rachet and Clank: Going Commando. It’s even better than the original. I've put in over 20 hours so far, and I don't want it to end!&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1986806-107574274029798981?l=flyingsheep.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://flyingsheep.blogspot.com/feeds/107574274029798981/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1986806&amp;postID=107574274029798981&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/107574274029798981'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/107574274029798981'/><link rel='alternate' type='text/html' href='http://flyingsheep.blogspot.com/2004/02/some-monthly-stats-for-january-2004.html' title=''/><author><name>FlyingSheep</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_uk2q-bc5eAQ/SwW62Duw1nI/AAAAAAAAAAM/6CGYucwKJaA/S220/dsc_6061.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1986806.post-107523075647144724</id><published>2004-01-27T14:12:00.000-05:00</published><updated>2004-01-27T14:14:09.670-05:00</updated><title type='text'></title><content type='html'>Session Report: January 26, 2003&lt;br /&gt;Games Played: Nanuuk, Frank's Zoo, (Nobody here but us chickens, Entdecker, Clans)&lt;br /&gt;Gamers: Marianne, Chip, Sara, Josh, Mark, Rob, (Vitas, Mike, Lewis)&lt;br /&gt;&lt;br /&gt;Thanks to Rob for hosting. &lt;br /&gt;&lt;br /&gt;NANUUK (0:25, 2 rounds)&lt;br /&gt;	Sara:	17 (won)&lt;br /&gt;	Chip:	17 &lt;br /&gt;	Josh:	12&lt;br /&gt;	Marianne: 12&lt;br /&gt;&lt;br /&gt;	Josh:	17 (won)&lt;br /&gt;	Chip:	17&lt;br /&gt;	Marianne: 11&lt;br /&gt;	Sara:	9&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;	We arrived too late to take part in the Chickens game, but Josh suggested a few games and we settled on Nanuuk. We probably would have stopped after one round, but needed to kill some time while the other half of the table finished up Clans. &lt;br /&gt;	I like the fact that the iceberg breaks up as the game progresses. However, due to the short length of the game and the availability of kayaks, it didn't seem to have that much of an impact on the game. In both rounds, everyone was able to get back to an igloo. &lt;br /&gt;	There was a question about purchasing equipment - did you have to actually give up the scoring token, or could you still count those points at the end of the game. In the first round, we played with the rule that you could keep your scoring tokens, and in the second round, purchasing equipment "cashed in" your scoring tokens. Thus, the scores for the second round were a bit lower. On boardgamegeek.com, there's only one session report for this game in which they "cashed in" their tokens and did not score them at the end of the game. &lt;br /&gt;	I placed second in both rounds because I had one less piece of equipment than the winner. At least I'm consistent. &lt;br /&gt;	I wonder what this game would be like as an exploration game - that is, with all of the tiles face-down (this wouldn't help the Nanuuk tiles or bears, which are different shapes/colors). It would emphasize luck over strategy, of course, but I think it might make the game more fun to play. As a strategy game, I think it's pretty light as it is. &lt;br /&gt;&lt;br /&gt;FRANK'S ZOO (0:55)&lt;br /&gt;	Marianne: 30&lt;br /&gt;	Rob:	19&lt;br /&gt;	Chip:	18&lt;br /&gt;	Josh:	16&lt;br /&gt;	Mark:	14&lt;br /&gt;	Sara:	13&lt;br /&gt;&lt;br /&gt;	While Vitas taught Mike and Lewis (the New) Entdecker, the rest of us settled in for a game of Frank's Zoo. &lt;br /&gt;	Marianne did exceptionally well throughout the game, placing in the top three in each round. Mark, on the other side of the spectrum, placed last and next-to-last in the first two. When they were paired for the last round, we wondered if Mark would drag down Marianne’s score. Surprisingly, Mark placed first in the final round, but equilibrium required Marianne to finish third. Nevertheless, she still won the game by a large margin. &lt;br /&gt;	For me, Frank's Zoo is more of an activity than a game. I don't have any overall strategy, and my tactics are mostly reduced to "can I produce the required cards or not?". If I have more than a single option of how to play (a rare case), I don't have a good sense of what effect my choice will have on my final score. &lt;br /&gt;	As a side note, score keeping for this game is more difficult than most games, which might ever so slightly bias my impression against it.  &lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1986806-107523075647144724?l=flyingsheep.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://flyingsheep.blogspot.com/feeds/107523075647144724/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1986806&amp;postID=107523075647144724&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/107523075647144724'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/107523075647144724'/><link rel='alternate' type='text/html' href='http://flyingsheep.blogspot.com/2004/01/session-report-january-26-2003-games.html' title=''/><author><name>FlyingSheep</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_uk2q-bc5eAQ/SwW62Duw1nI/AAAAAAAAAAM/6CGYucwKJaA/S220/dsc_6061.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1986806.post-107357779367632519</id><published>2004-01-08T11:03:00.000-05:00</published><updated>2004-01-08T11:04:28.013-05:00</updated><title type='text'></title><content type='html'>Here's your article for the day. &lt;a href="http://mama.indstate.edu/users/bones/WhyIHateWebLogs.html"&gt;Why I Hate Web Logs&lt;/a&gt;. It's a good read. &lt;br /&gt;&lt;br /&gt;"This person suffers from a serious personal attention debt. " That's an excellent phrase, right there, "attention debt". While it is probably quite appropriate to web logs, I've noticed this more in real life. Usually while waiting in line.&lt;br /&gt;&lt;br /&gt;I'm probably most likely to fall under the Self-Important Moron category, I think. Not that I think this blog will save the world or anything. &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1986806-107357779367632519?l=flyingsheep.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://flyingsheep.blogspot.com/feeds/107357779367632519/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1986806&amp;postID=107357779367632519&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/107357779367632519'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/107357779367632519'/><link rel='alternate' type='text/html' href='http://flyingsheep.blogspot.com/2004/01/heres-your-article-for-day.html' title=''/><author><name>FlyingSheep</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_uk2q-bc5eAQ/SwW62Duw1nI/AAAAAAAAAAM/6CGYucwKJaA/S220/dsc_6061.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1986806.post-107348752799116200</id><published>2004-01-07T09:58:00.000-05:00</published><updated>2004-01-07T10:00:01.326-05:00</updated><title type='text'></title><content type='html'>Well, we finished the trilogy with Return of the Jedi last night. My sister thought the Ewoks were cute and silly, which should come as a surprise to no one. Her favorite movie is Empire (again, no big surprise). &lt;br /&gt;&lt;br /&gt;As for the other trilogy of movies, we went to see Return of the King last week. I was really surprised at the number of kids at the show (it was an afternoon matinee) but I must admit that they were exceptionally well-behaved. I can't see any reason to bring a young child to a movie that lasts over three hours. However, they weren't disruptive so I can't complain at length (as much as I'd like to *grin*). &lt;br /&gt;&lt;br /&gt;There are a number of reviewers of the Lord of the Rings trilogy who haven't read the books recently (or even at all). Are these reviews valid? Some say that the movies should be viewable by everyone, not just the "select few" that have the patience to read the book. However, I think that it's not uncommon for some forms of entertainment to require pre-requisites. &lt;br /&gt;&lt;br /&gt;Let's take an extreme example - weekly television shows, such as soap operas. If I watched a random soap opera, could I complain if things that happened previously weren't explained sufficiently? Of course not, that would be foolish. Likewise, could I critize Austin Powers 2 for not repeating character development that was done in the previous movie? No. &lt;br /&gt;&lt;br /&gt;But what if the pre-requisite is in a different medium? Let's look at the opposite situation- Could I review the Nitpicker's Guide to Star Trek: The Next Generation without ever having seen an episode of the television show? What value would that review have for you? In my mind, reviews of the Lord of the Rings movies by people who have not read the books should be treated just as lightly. &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1986806-107348752799116200?l=flyingsheep.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://flyingsheep.blogspot.com/feeds/107348752799116200/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1986806&amp;postID=107348752799116200&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/107348752799116200'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1986806/posts/default/107348752799116200'/><link rel='alternate' type='text/html' href='http://flyingsheep.blogspot.com/2004/01/well-we-finished-trilogy-with-return.html' title=''/><author><name>FlyingSheep</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_uk2q-bc5eAQ/SwW62Duw1nI/AAAAAAAAAAM/6CGYucwKJaA/S220/dsc_6061.jpg'/></author><thr:total>0</thr:total></entry></feed>
