<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Mischiefblog</title>
	<atom:link href="http://www.mischiefblog.com/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://www.mischiefblog.com</link>
	<description>I WATN 2 MAEK GAEM!</description>
	<lastBuildDate>Mon, 15 Feb 2010 06:22:18 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>I&#8217;ll be your low Gearscore tank tonight</title>
		<link>http://www.mischiefblog.com/?p=883</link>
		<comments>http://www.mischiefblog.com/?p=883#comments</comments>
		<pubDate>Mon, 15 Feb 2010 06:22:18 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[Games]]></category>

		<guid isPermaLink="false">http://www.mischiefblog.com/?p=883</guid>
		<description><![CDATA[I just got done running my second Heroic on Kadee, my much neglected Paladin:  Violet Hold and Halls of Stone.  Blizzard isn&#8217;t do a great job doing gearscore matching, though:

Thanks to the group that stuck with me through it.  I didn&#8217;t die, but I can&#8217;t say the same for the other melee [...]]]></description>
			<content:encoded><![CDATA[<p>I just got done running my second Heroic on Kadee, my much neglected Paladin:  Violet Hold and Halls of Stone.  Blizzard isn&#8217;t do a great job doing gearscore matching, though:</p>
<p><a href="http://www.mischiefblog.com/uploads/2010/02/low_gearscore.png"><img src="http://www.mischiefblog.com/uploads/2010/02/low_gearscore.png" alt="" title="low_gearscore" width="453" height="700" class="aligncenter size-full wp-image-884" /></a></p>
<p>Thanks to the group that stuck with me through it.  I didn&#8217;t die, but I can&#8217;t say the same for the other melee DPS in the group.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mischiefblog.com/?feed=rss2&amp;p=883</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The Halls of Reflection (Heroic) tax</title>
		<link>http://www.mischiefblog.com/?p=879</link>
		<comments>http://www.mischiefblog.com/?p=879#comments</comments>
		<pubDate>Mon, 28 Dec 2009 04:54:41 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://www.mischiefblog.com/?p=879</guid>
		<description><![CDATA[After my, what, 30th wipe in Halls of Reflection Heroic, this time to a tank that wouldn&#8217;t pull waves back to the group but kept trying to fight on the altar, finally keeping Falric out of my healing range after I was feared in the opposite direction, I&#8217;m convinced Halls of Reflection is actually a [...]]]></description>
			<content:encoded><![CDATA[<p>After my, what, 30th wipe in Halls of Reflection Heroic, this time to a tank that wouldn&#8217;t pull waves back to the group but kept trying to fight on the altar, finally keeping Falric out of my healing range after I was feared in the opposite direction, I&#8217;m convinced Halls of Reflection is actually a gold tax on people using the random group tool.</p>
<p>I&#8217;ve run it <a href="http://www.pugchecker.com/index.php?name=Foulpaw&#038;server=Kirin+Tor-US" target="_blank">successfully</a> despite a lot of bad <abbr title="Pick Up Group">pug</abbr>s but I much prefer doing it with a guild group.  Becky saw how bad it was on normal mode today when she ran it with one of her Hunters.  By comparison, Forge of Souls and Pit of Saron are cakewalks.</p>
<p>Maybe it&#8217;s because Halls of Reflection is a healing test, or maybe it&#8217;s because most pugs can&#8217;t seem to assist.  When I ran it earlier today on Normal mode, I made sure everyone knew to assist off the main tank (a mediocre Death Knight, but it&#8217;s tough to be a good DK tank).  At the least, a successful HoR group can pull 3k DPS per character, minus the healer and maybe the tank &#8212; any less and I&#8217;m out of mana or dead before I can keep the group&#8217;s health up.  I feel like HoR was really built around the Holy Priest, even more so than the Tribunal encounter in Halls of Stone.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mischiefblog.com/?feed=rss2&amp;p=879</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Oculus with four dragons, dismounted healer</title>
		<link>http://www.mischiefblog.com/?p=876</link>
		<comments>http://www.mischiefblog.com/?p=876#comments</comments>
		<pubDate>Sun, 27 Dec 2009 20:00:22 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[Games]]></category>

		<guid isPermaLink="false">http://www.mischiefblog.com/?p=876</guid>
		<description><![CDATA[So we ran heroic Oculus with a dismounted healer (me) today.  It was unintentional:  I got knocked down early and landed on Treasure Island safely, where I healed myself up and started healing the other drakes.  It was much easier to keep the rest of the group up as a T9 Tree [...]]]></description>
			<content:encoded><![CDATA[<p>So we ran heroic Oculus with a dismounted healer (me) today.  It was unintentional:  I got knocked down early and landed on Treasure Island safely, where I healed myself up and started healing the other drakes.  It was much easier to keep the rest of the group up as a T9 Tree than it was on a green drake.  We won with only one other player getting dismounted.</p>
<p><i>Edit:</i> My second Oculus of the day disbanded before I could pick up a drake.  I replaced a healer who quit after a wipe on Eregos:  people are still convinced this is <i>hard</i>, which just goes to show they never tried it before 3.3 nerfed him.  Amber Void, Emerald Void, and Ruby Void are much more attainable now than they were a month ago. </p>
]]></content:encoded>
			<wfw:commentRss>http://www.mischiefblog.com/?feed=rss2&amp;p=876</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The inevitable decline in HPS</title>
		<link>http://www.mischiefblog.com/?p=874</link>
		<comments>http://www.mischiefblog.com/?p=874#comments</comments>
		<pubDate>Sat, 26 Dec 2009 23:05:46 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[Games]]></category>

		<guid isPermaLink="false">http://www.mischiefblog.com/?p=874</guid>
		<description><![CDATA[I&#8217;ve been running a lot of random heroics (10-15 a day on weekends &#8212; I&#8217;m putting together two sets of T9+) and have noticed that as the other players gear up, my HPS has done down faster than my Healing Spellpower has gone up.
In my last run, for instance, I got 1744.7 HPS for a [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been running a <i>lot</i> of random heroics (10-15 a day on weekends &#8212; I&#8217;m putting together two sets of T9+) and have noticed that as the other players gear up, my <abbr title="Heals Per Second">HPS has done down faster than my Healing Spellpower has gone up.</p>
<p>In my last run, for instance, I got 1744.7 HPS for a total of 1,485,319 points of healing on a Halls of Lightning run.  Two weeks ago, my HPS would have been closer to 2200 and I would have had to heal nearly 2 million points.  At the same time, my overhealing has slightly declined (I&#8217;m better about only renewing HOTs when needed), and accounted for more potential healing than healing performed.  Blame the Warlock or blame the HOts, the fact is that other players require less healing as they gear into Tier 9.</p>
<table>
<tr>
<th>Role</th>
<th>DPS</th>
<th>Healing Taken</th>
<th>Gear Score</th>
</tr>
<tr>
<td>Tank (Warrior)</td>
<td>1485.4</td>
<td>923,697</td>
<td>4473</td>
</tr>
<tr>
<td>DPS (Ret Pally)</td>
<td>2712.2</td>
<td>320,807</td>
<td>4850</td>
</tr>
<tr>
<td>DPS (Destro Warlock)</td>
<td>2479.7</td>
<td>265,365</td>
<td>4803</td>
</tr>
<tr>
<td>DPS (Enh Shaman)</td>
<td>3031.3</td>
<td>157,341</td>
<td>4850</td>
</tr>
<tr>
<td>Healer (Resto Druid)</td>
<td></td>
<td>125,574</td>
<td>4629</td>
</tr>
</table>
<p>At this time, I only start finding my maximum HPS on raids where the entire group takes damage as once.</p>
<p>Examining the heal values themselves helps to show how overhealing occurs (ignoring crits):</p>
<ul>
<li>Rejuvenation:  2001 per tick</li>
<li>Regrowth:  4600 hit, 1095 per tick</li>
<li>Lifebloom:  843 tick average, 1487 max tick; 2529 hit average, 8830 hit maximum</li>
<li>Nourish:  6409 average</li>
<li>Living Seed:  2598 average</li>
<li>Wild Growth:  770 average per tick</li>
<li>Glyph of Rejuvenation:  1175 average per tick</li>
</ul>
<p>So as my healing spellpower has gone up from 2000 to 2500, my HPS has gone down from 2200 to 1700 because other players are better geared.</abbr></p>
]]></content:encoded>
			<wfw:commentRss>http://www.mischiefblog.com/?feed=rss2&amp;p=874</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>G13 WoW UI layout</title>
		<link>http://www.mischiefblog.com/?p=870</link>
		<comments>http://www.mischiefblog.com/?p=870#comments</comments>
		<pubDate>Sat, 26 Dec 2009 05:42:13 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://www.mischiefblog.com/?p=870</guid>
		<description><![CDATA[Here&#8217;s my updated UI for World of Warcraft.

Buttons are laid out to match the Logitech G13 &#8212; the exact choice for each button is still being tweaked, but it&#8217;s pretty close to done.  Main chat and Grid are next to each other to watch player health, discussion, and DBM warnings in the chat log.
Tanking [...]]]></description>
			<content:encoded><![CDATA[<p>Here&#8217;s my updated UI for World of Warcraft.</p>
<p><a href="http://www.mischiefblog.com/uploads/2009/12/WoWScrnShot_122509_204418.jpg"><img src="http://www.mischiefblog.com/uploads/2009/12/WoWScrnShot_122509_204418-300x187.jpg" alt="" title="Pit of Saron (Heroic)" width="300" height="187" class="aligncenter size-medium wp-image-871" /></a></p>
<p>Buttons are laid out to match the Logitech G13 &#8212; the exact choice for each button is still being tweaked, but it&#8217;s pretty close to done.  Main chat and Grid are next to each other to watch player health, discussion, and DBM warnings in the chat log.</p>
<p>Tanking is done using the same UI with different buttons (replacing the set by virtue of the extra bar groups with multiple talent specs).</p>
<p><span id="more-870"></span><br />
Addons:
<ul>
<li>Recount</li>
<li>Bartender4 (no reason not to use Dominos)</li>
<li>IceHud</li>
<li>Mik&#8217;s Scrolling Battle Text</li>
<li>Buffalo 3</li>
<li>Grid</li>
<li>Clique</li>
<li>Omen</li>
<li>Atlas</li>
<li>AtlasLoot Enhanced</li>
<li>CT Expense History</li>
<li>CT Mail Mod</li>
<li>CT Map Mod</li>
<li>Bagnon</li>
<li>Auctioneer Suite</li>
<li>oRA2</li>
<li>Deadly Boss Mods</li>
<li>Obituary</li>
<li>RatingBuster</li>
<li>Gearscore</li>
<li>Acki&#8217;s Recipe List</li>
<li>Lil&#8217; Sparky&#8217;s Workshop</li>
<li>GuildGreet</li>
<li>Viewport</li>
</ul>
<p>I haven&#8217;t bothered to deactivate the Blizzard target and group yet.  The group window marks the assigned tank in Random PUG mode.</p>
<p>I also use a macro to relocate and resize the Objectives window.<br />
<code><br />
/run WatchFrame:ClearAllPoints()WatchFrame:SetPoint("TOPLEFT", "UIParent", "TOPLEFT", 1100,-250)WatchFrame:SetHeight(475)WatchFrame.ClearAllPoints = function() end WatchFrame.SetPoint = function() end WatchFrame.SetAllPoints = function() end<br />
</code></p>
]]></content:encoded>
			<wfw:commentRss>http://www.mischiefblog.com/?feed=rss2&amp;p=870</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WoW patch 3.3&#8217;s impact</title>
		<link>http://www.mischiefblog.com/?p=865</link>
		<comments>http://www.mischiefblog.com/?p=865#comments</comments>
		<pubDate>Tue, 08 Dec 2009 15:09:16 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[Games]]></category>

		<guid isPermaLink="false">http://www.mischiefblog.com/?p=865</guid>
		<description><![CDATA[In World of Warcraft, I&#8217;m playing one of two roles lately:  tank and healer.  Patch 3.3 has been released and here are the big impacts on those roles:

Classes: General

Area-of-Effect Damage Caps: We’ve redesigned the way area damage is capped when hitting many targets. Instead of a hard cap on total damage done, the [...]]]></description>
			<content:encoded><![CDATA[<p>In World of Warcraft, I&#8217;m playing one of two roles lately:  tank and healer.  Patch 3.3 has been released and here are the big impacts on those roles:</p>
<blockquote><p>
Classes: General</p>
<ul>
<li>Area-of-Effect Damage Caps: We’ve redesigned the way area damage is capped when hitting many targets. Instead of a hard cap on total damage done, the game now caps the total damage done at a value equal to the damage the spell would do if it hit 10 targets. In other words, if a spell does 1000 damage to each target, it would hit up to 10 targets for 1000 each, but with more than 10 targets, each target would take 1000 damage divided by the number of targets. 20 targets would be hit for 500 damage each in that example.</li>
</ul>
</blockquote>
<p><span id="more-865"></span><br />
This potentially hurts my bear, especially when doing Sholazar dailies.  The mobs have relative low hit points (~6000) but I may not be able to swipe down all 22 Wolvar quickly enough.  This won&#8217;t impact Icecrown/Argent Tournament dailies as I&#8217;m typically only hitting seven or eight scourge at a time.  This will mean low level instance runs need to be handled a little more carefully (no pulling the entire Scarlet Cathedral).</p>
<blockquote><p>
Druids</p>
<ul>
<li>Prowl: This ability no longer has multiple ranks and penalizes movement speed by 30%.</li>
<li>Rebirth: The cooldown on this spell has been lowered from 20 minutes down to 10 minutes. Cannot be used in Arenas.</li>
<li>Rejuvenation: The base duration on all ranks of this spell is now 15 seconds.</li>
<li>Tranquility: The cooldown on this spell has been reduced to 8 minutes, down from 10 minutes.</li>
<li>Talents
<ul>
<li>Balance
<ul>
<li>Eclipse: This effect will not activate again within 15 seconds of either type of Eclipse effect firing, in addition to the existing 30-second cooldown for each type of Eclipse. In addition, Eclipse now grants a 40% critical strike chance to Starfire and 40% increased damage to Wrath, up from 30%.</li>
<li>Force of Nature: Health on the treants has been increased.</li>
</ul>
</li>
<li>Feral Combat
<ul>
<li>Predatory Strikes: The Predatory Swiftness buff from this talent now has an 8-second duration.</li>
</ul>
</li>
<li>Restoration
<ul>
<li>Gift of the Earthmother: Redesigned. This talent now increases spell haste by 2/4/6/8/10% and reduces the base global cooldown of Lifebloom by 2/4/6/8/10% instead of its previous effects.</li>
</ul>
</li>
</ul>
</li>
<li>Pets
<ul>
<li>Avoidance (passive): Now reduces the damage your pets take from area-of-effect damage by 90%, but no longer applies to area-of-effect damage caused by other players.</li>
</ul>
</li>
</ul>
</blockquote>
<p>The Prowl change has no impact at level 80.  Since I&#8217;m not Moonkin spec, Eclipse changes and the treant health buffs don&#8217;t directly impact me but I think it will help other raiding druids.</p>
<p>Predatory Strikes isn&#8217;t a direct nerf to me like it would be to talented PvPer.  Declaring the duration at eight seconds clarifies the buff duration.</p>
<p>The Rejuvenation change won&#8217;t really impact how I heal:  I would usually really Rejuvenation before it expires on the tank.  The Rebirth change is huge for me and my parties and should make encounters like Ony25 or ToC10 easier &#8212; I&#8217;ll end up losing a DPS on about a quarter of the runs (or a tank on raids) and getting Rebirths in faster will make those encounters a lot easier.</p>
<p>I&#8217;m more likely to use Tranquility than before:  now, it&#8217;s only used for encounters I know will stress Wild Growth.  I&#8217;m much more likely to pop it on any AOE boss now, not just the ones that were tougher AOEs.  Honestly, I can count the times I&#8217;ve needed to use Tranquility on one hand (usually in OS25).</p>
<p>Gift of the Earthmother means I will concentrate a little more on Haste when gearing or gemming.  I&#8217;m constantly using Lifebloom in conjunction with Rejuvenation when running heroics or to keep the tanks topped off on raids, so reducing the cooldown is a little better, although I&#8217;d really like to see a reduction in mana cost &#8212; I&#8217;m not running around in Tier 7.  On heroics, when I&#8217;m with a good tank and the group isn&#8217;t taking heavy damage, mana isn&#8217;t usually a problem but on some encounters (ToC 10, for instance) I can blow through my whole bar.  I&#8217;m more likely, with the lower cooldown, to apply Lifebloom to more than just raid tanks.</p>
<p>Finally, I&#8217;ve been looking forward to the dungeon finder.  This has the potential to let me complete Heroic Dailies on weekdays (I log in around 8pm PST) and being able to teleport directly to the instance will save a <i>ton</i> of time, and I like that it supports returning to town to repair or buy reagents.  I&#8217;m <i>not</i> happy about losing the Heroic Daily and Dungeon Daily quests, but understand the new system replaces them.  I&#8217;ll need to make sure that I always have bag space free to hold onto daily random rewards (yes, this can be a problem at times).</p>
<p>Oh happy day:  Looking for Group channel is back by default. <img src='http://www.mischiefblog.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>I&#8217;m curious about the rewards for weekly raids.  I can be assured my guild will be running those every weekend.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mischiefblog.com/?feed=rss2&amp;p=865</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Signature of a Java service</title>
		<link>http://www.mischiefblog.com/?p=861</link>
		<comments>http://www.mischiefblog.com/?p=861#comments</comments>
		<pubDate>Wed, 28 Oct 2009 15:37:52 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://www.mischiefblog.com/?p=861</guid>
		<description><![CDATA[I&#8217;ve dealt with Java services at Amazon too long when I can spot one by the CPU/memory signature.
This is pretty typical of a long-running service garbage collecting with old generation objects.  Note the CPU utilization as the VM removes old generation objects and subsequent drop in memory utilization.
]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve dealt with Java services at Amazon too long when I can spot one by the CPU/memory signature.<br />
<div id="attachment_862" class="wp-caption aligncenter" style="width: 446px"><img src="http://www.mischiefblog.com/uploads/2009/10/java_service.png" alt="The classic signature of a long-running Java service" title="Java service CPU/memory signature" width="436" height="233" class="size-full wp-image-862" /><p class="wp-caption-text">The classic signature of a long-running Java service</p></div><br />
This is pretty typical of a long-running service garbage collecting with old generation objects.  Note the CPU utilization as the VM removes old generation objects and subsequent drop in memory utilization.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mischiefblog.com/?feed=rss2&amp;p=861</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Radar Revisited</title>
		<link>http://www.mischiefblog.com/?p=857</link>
		<comments>http://www.mischiefblog.com/?p=857#comments</comments>
		<pubDate>Wed, 14 Oct 2009 07:08:20 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://www.mischiefblog.com/?p=857</guid>
		<description><![CDATA[I&#8217;ve been snatching 30 and 60 minute blocks of time in the evenings and on the weekends to get back to work on my Radar test in Python with PyGame from nearly four years ago.  PyGame 1.9.1 installed easily on my Windows box and OS X laptop and integrated well with Python 3.1 (on [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been snatching 30 and 60 minute blocks of time in the evenings and on the weekends to get back to work on my <a href="http://www.mischiefblog.com/?p=230" target="_blank">Radar</a> test in Python with PyGame from nearly four years ago.  <a href="http://pygame.org/download.shtml" target="_blank">PyGame 1.9.1</a> installed easily on my Windows box and OS X laptop and integrated well with Python 3.1 (on Windows) and <a href="http://www.stackless.com/" target="_blank">Stackless Python</a> 2.6 (on OS X).  The only significant changes to be made in the code between Python 2 and Python 3 had to do with <a href="http://docs.python.org/dev/3.0/whatsnew/2.6.html#pep-3110" target="_blank">exception handling</a>.<br />
<span id="more-857"></span><br />
So, what&#8217;s new and different in this version?
<ul>
<li>I lost my version of Radar that supported chat, so I had to rewrite it from scratch.  This version only supports standard layout US keyboards (the shift-modifiers are hard-coded) and I haven&#8217;t tweaked the fonts, set up an input box, or limited the input string to make things look nicer.</li>
<li>I likewise lost the code to add names and chat messages above the arrow sprites, so I rewrote that.  This version should be more correct than the one from 2005.</li>
<li>I&#8217;m using the standard Python logger (based on log4j) instead of a custom logging class.</li>
<li>I&#8217;m using a Singleton logger instance for all the arrow sprites.</li>
</ul>
<p>The arrow sprite logic has gotten complicated enough that I need to develop good unit tests for it.  I&#8217;ve been developing with rapid integration tests, but I believe I&#8217;ve hit the point with the sprite where significant changes could break the correct behavior it&#8217;s exhibiting now.  A good suite of unit tests against the sprite will help with later refactoring and will also provide a base for testing sprites in other projects.  Unit tests should be written before I approach anything as complicated as, say, collision detection (which PyGame handles nicely now) or basic AI or pathfinding.</p>
<p><a href="http://www.moviepartners.com/blog/2009/03/20/making-py2exe-play-nice-with-pygame/" target="_blank">I&#8217;ve looked into</a> using <a href="http://www.py2exe.org/" target="_blank">py2exe</a> to package the application as a Windows executable.  It looks like, with a few hours of testing and pruning, it&#8217;ll work well and still produce a relatively small executable.</p>
<p>I&#8217;m considering using <a href="http://incubator.apache.org/thrift/" target="_blank">Thrift</a> to automate generation and interpretation of the client-server messages.  I&#8217;m willing to pay a little more in bandwidth and processing time rather than spending time writing custom binary packing and unpacking code for messages.  Thrift should let me abstract the process a little more, and I&#8217;m very curious to see how well it works for me in practice.</p>
<p>Finally, I&#8217;ll implement the server.  With the minimal prediction in place on the arrow sprites, I&#8217;m very curious to see how well the client runs and how much rubberbanding will take place.</p>
<p>Komodo Edit is still working well for me, although I wonder if the Komodo IDE would help to speed up my develop-test iteration cycle.</p>
<p>Grab the <a href="uploads/Radar2.zip">Radar2.zip</a> file here.  Install Python 3.1 and Pygame 1.9.1 for 3.1, add Python to your path, and test the program with <code>python Main.py</code>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mischiefblog.com/?feed=rss2&amp;p=857</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Notes on Spring development</title>
		<link>http://www.mischiefblog.com/?p=845</link>
		<comments>http://www.mischiefblog.com/?p=845#comments</comments>
		<pubDate>Sun, 16 Aug 2009 04:28:09 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://www.mischiefblog.com/?p=845</guid>
		<description><![CDATA[3.0.0.M3 library problems
I haven&#8217;t tried 3.0.0.M4 with my new development environment yet, but I had missing class and Antlr problems with 3.0.0.M3.  I ended up using 3.0.0.CI-319 at the time to get a working Spring framework.
Creating a logging bean
Create an annotation package with a Log interface:

import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
&#160;&#160;
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
&#160;&#160;
/**
 * [...]]]></description>
			<content:encoded><![CDATA[<p><b>3.0.0.M3 library problems</b><br />
I haven&#8217;t tried 3.0.0.M4 with my new development environment yet, but I had missing class and Antlr problems with 3.0.0.M3.  I ended up using 3.0.0.CI-319 at the time to get a working Spring framework.</p>
<p><b>Creating a logging bean</b><br />
Create an annotation package with a Log interface:<br />
<code><br />
import static java.lang.annotation.ElementType.FIELD;<br />
import static java.lang.annotation.RetentionPolicy.RUNTIME;<br />
&nbsp;&nbsp;<br />
import java.lang.annotation.Documented;<br />
import java.lang.annotation.Retention;<br />
import java.lang.annotation.Target;<br />
&nbsp;&nbsp;<br />
/**<br />
 * Injects a logger of an appropriate type into beans.<br />
 */<br />
@Retention(RUNTIME)<br />
@Target(FIELD)<br />
@Documented<br />
public @interface Log {<br />
&nbsp;&nbsp;<br />
}<br />
</code></p>
<p><b>Create a logger injector:</b><br />
<code><br />
import java.lang.reflect.Field;<br />
import java.util.HashMap;<br />
import java.util.Map;<br />
&nbsp;&nbsp;<br />
import org.apache.log4j.Logger;<br />
import org.springframework.beans.BeansException;<br />
import org.springframework.beans.factory.config.BeanPostProcessor;<br />
import org.springframework.util.ReflectionUtils;<br />
import org.springframework.util.ReflectionUtils.FieldCallback;<br />
&nbsp;&nbsp;<br />
/**<br />
 * Auto injects the commons Log implementation into the bean when a field is annotated<br />
 * with Logger.<br />
 */<br />
public class LoggerInjector implements BeanPostProcessor {<br />
&nbsp;&nbsp;private static Map&gt;String , Logger&lt; loggers = new HashMap&gt;String , Logger&lt;();<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {<br />
&nbsp;&nbsp;&nbsp;&nbsp;return bean;<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;public Object postProcessBeforeInitialization(final Object bean, String beanName) throws BeansException {<br />
&nbsp;&nbsp;&nbsp;&nbsp;ReflectionUtils.doWithFields(bean.getClass(), new FieldCallback() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public void doWith(Field field) throws IllegalArgumentException, IllegalAccessException {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// make the field accessible if defined private<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ReflectionUtils.makeAccessible(field);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (field.getAnnotation(Log.class) != null) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String cls = bean.getClass().getName();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;field.setAccessible(true);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Logger logger = null;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (loggers.containsKey(cls)) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;logger = loggers.get(cls);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} else {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;logger = Logger.getLogger(cls);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;loggers.put(cls, logger);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;field.set(bean, logger);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;});<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;return bean;<br />
&nbsp;&nbsp;}<br />
}<br />
</code></p>
<p><b>Declare your logger bean in your application context:</b><br />
<code><br />
	&lt;bean class="mypackage.annotation.LoggerInjector"/&gt;<br />
</code></p>
<p><b>Attach the Logger to your class:</b><br />
<code><br />
import org.apache.log4j.Logger;<br />
&nbsp;<br />
import mypackage.annotation.Log;<br />
&nbsp;<br />
// in your class fields<br />
&nbsp;<br />
	/**<br />
	 * Logger<br />
	 */<br />
	@Log<br />
	private Logger logger;<br />
&nbsp;<br />
// use it<br />
logger.error("Invalid request type: " + requestType);<br />
</code></p>
<p><b>Interface-oriented design</b><br />
Define your data objects and factories as interfaces (methods), then provide factory implementations to create or retrieve instances of your data objects:<br />
<code><br />
	&lt;bean id="myDaoFactory" class="mypackage.factory.myDaoFactoryImpl"<br />
&nbsp;&nbsp;factory-method="getFactory" scope="singleton"/&gt;<br />
</code></p>
<p><b>Autowiring</b><br />
Use the Autowired annotation to automatically add beans to your consuming classes.<br />
<code><br />
	/**<br />
	 * Storage engine.<br />
	 */<br />
	@Autowired<br />
	private Storage storage;<br />
</code></p>
<p><b>Non-SQL databases</b><br />
Non-SQL databases should be handled through high level &#8220;use case&#8221; calls against a storage engine rather than direct puts and gets.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mischiefblog.com/?feed=rss2&amp;p=845</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>It&#8217;s elementary</title>
		<link>http://www.mischiefblog.com/?p=841</link>
		<comments>http://www.mischiefblog.com/?p=841#comments</comments>
		<pubDate>Fri, 07 Aug 2009 23:37:55 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[Design Journal]]></category>
		<category><![CDATA[Games]]></category>

		<guid isPermaLink="false">http://www.mischiefblog.com/?p=841</guid>
		<description><![CDATA[I&#8217;ve been considering what would make a good, unique quest.  Putting aside Becky&#8217;s concerns about griefing, competition for mobs or clues, etc., and that this is intended for a text game (although it would work in a graphical game), I&#8217;ve got the skeleton of a design for generating mysteries that I&#8217;d like to try [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been considering what would make a good, unique quest.  Putting aside Becky&#8217;s concerns about griefing, competition for mobs or clues, etc., and that this is intended for a text game (although it would work in a graphical game), I&#8217;ve got the skeleton of a design for generating mysteries that I&#8217;d like to try to implement sometime.</p>
<p>We&#8217;ll call it, for lack of a better term, <i>Mystery Quest.</i></p>
<p>One outstanding question remains:  do you believe players need feedback when collecting correctly clues, interviewing witnesses, and assembling evidence?<br />
<span id="more-841"></span><br />
Procedural content is usually dry, obviously generated, and tends to lack any personality.  Consider, for instance, the first episode of <i><a href="http://en.wikipedia.org/wiki/Castle_(TV_series)" target="_blank">Castle</a></i>:  the killer didn&#8217;t just act like a serial killer, he worked to frame a victim, made the killings look like those from the book but with subtle flaws, and left a trail of contradictory evidence that was very hard to pick out from the activities of the obvious suspect.  This would be pretty darn hard to generate procedurally.</p>
<p><b>The Parts of a Mystery</b><br />
A mystery quest is composed of:
<ul>
<li>clues &#8211; items and states that act as evidence of the action and actors</li>
<li>witnesses &#8211; in these terms, NPCs who saw the action/actors or discovered the results of the activity</li>
<li>motive &#8211; the underlying reason that the activity took place</li>
<li>suspect &#8211; the actor(s) responsible for performing that activity</li>
</ul>
<p>Assume for now that I don&#8217;t have any shell actors, that is that I don&#8217;t have plans for a system that creates cut-outs or intermediate actors (someone framed for the crime).</p>
<p><b>Starting a Mystery</b><br />
I&#8217;ll use 20th/21st century terms to describe starting mysteries in the context of crimes.  There&#8217;s no reason mysteries couldn&#8217;t be set in a fantasy medieval, steampunk, 19th century, or far future milieu but I choose to use language and scenarios common to our contemporary period.</p>
<p>Given a mystery (which I&#8217;ll describe shortly), the player needs to be notified of the mystery in some way, in a detective game by notification by the police or a client, for actions such as:
<ul>
<li>crime occurs; the witness notifies the police or authorities</li>
<li>witness finds a body or out-of-place person</li>
<li>victim of crime is admitted to a hospital</li>
<li>victim of crime discovers something is missing (from their <a alt="Used generally to indicate where the NPC spawns or uses as home base while wandering">home</a> or person)</li>
<li>witness finds victim is missing</li>
<li>player character (PC) notices something is odd or incongruous (clue grants the quest)</li>
<li>PC witnesses/notices crime taking place (online or offline)</li>
<li>witness or victim expresses a worry or concern to the PC</li>
</ul>
<p>Within each of these is some cause, such as <i>PC witnesses/notices crime taking place</i> may be caused by a:
<ul>
<li>break-in</li>
<li>mugging</li>
<li>murder</li>
<li>theft</li>
</ul>
<p><b>Causes and Sources</b><br />
The intersection of the cause and source defines the broad mystery.  The source indicates who begins the mystery, while the cause describes what kind of crime or action took place by the actor(s).</p>
<p><i>Sources</i>
<ul>
<li>player character &#8211; the PC was either the victim or witness, or obtained a clue independently</li>
<li>contact &#8211; an NPC with a relationship to the PC starts the mystery, such as a vendor NPC&#8217;s bark, the player asks the NPC for updates, or the player finds a quest indicator (such as a quest board)</li>
<li>victim &#8211; an NPC without a relationship to the PC starts the mystery (if the PC is a detective, the victim contacts the PC for assistance; if the PC is the police, the victim seeks help)</li>
<li>witness &#8211; an NPC without a relationship to the PC starts the mystery (the PC runs into the NPC; the NPC has a quest marker)</li>
</ul>
<p>The role of victim and witness both allow the player to start the mystery but each should fulfill different criteria toward completion of the mystery.</p>
<p><i>Causes</i>
<ul>
<li>missing item</li>
<li>missing stranger &#8211; an NPC without a relationship to the PC is missing</li>
<li>missing contact &#8211; an NPC with a relationship to the PC is missing</li>
<li>theft</li>
<li>burglary</li>
<li>robbery</li>
<li>assault</li>
<li>murder</li>
<li>poisoning</li>
<li>disease</li>
<li>harassment</li>
<li>treason</li>
<li>perjury</li>
<li>arson</li>
<li>property damage</li>
</ul>
<p>For each mystery source, the <i>time, location, witnesses, and clues</i> need to be established.</p>
<p>For each mystery cause, the <i>motive, means, and evidence</i> need to be established.</p>
<p><i>Clues</i> may become <i>evidence,</i> but clues may also be misleading.</p>
<p><i>Motives</i> are generally soft:  they don&#8217;t have a lot of meaning within the game but are needed to provide flavor for the player.  Motives flesh out the NPC actors who are suspected of the crime.
<ul>
<li>conspiracy</li>
<li>passion</li>
<li>poverty or desperation</li>
<li>vengeance</li>
<li>vigilantism</li>
<li>accident</li>
<li>orders or job</li>
</ul>
<p><i>Witnesses</i> are a second form of evidence.  While they aren&#8217;t collected like clues, they are interviewed to provide additional direction (a new location to look for clues, a victim or suspect actor, another witness to continue the narrative).  Witnesses can be described using two axes:</p>
<p><i>Witness Helpfulness</i>
<ul>
<li>Helpful</li>
<li>Neutral</li>
<li>Misleading</li>
<li>Obstructive</li>
<li>Hostile</li>
</ul>
<p><i>Witness Accuracy</i>
<ul>
<li>Accurate</li>
<li>Mostly Correct</li>
<li>Half Correct</li>
<li>Incorrect</li>
</ul>
<p>Witness attributes provide an opportunity for skills use (Interviewing, Charm, Character Reading, etc.) to help the player evaluate whether the witness is accurate and helpful in continuing the investigation.  Likewise, systems with PC reputation may adjust the witness attributes.  Witnesses may need to be found and interviewed more than once:  their statements may change (become more correct or change helpfulness) as the player obtains more clues or speaks to other witnesses.</p>
<p><i>Means</i> depends on the crime committed and will need to be defined individually for each cause.  For a death, means may be one of:</p>
<blockquote><p>
gun, knife, icepick, newspaper, pillow, animal, syringe, food, blanket, bag, telephone, wire, lighter
</p></blockquote>
<p>You should be able to pick out how some are appropriate or inappropriate for particular causes.</p>
<p><i>Time</i> establishes when the action took place and may also impact the decay of clues or witnesses.  Determining the time of the crime can be a reflection of the chosen difficulty of the system (cold cases are harder than recent murders).</p>
<p><i>Location</i> establishes where (in which room) the action took place and can also impact the decay or spread of clues and witnesses.  In a busy game, clues may be picked up by other players and moved from the room, or some clues attached to some objects may be obscured by later, replacement clues to more recent actions.</p>
<p><b>Putting it all together</b><br />
To solve the mystery, the player will need to meet certain criteria:
<ul>
<li>obtain some percentage of the original clues (50% or more)</li>
<li>do not assign any incorrect clues to the mystery (the player should be able to deduce or discover this from in-game evidence or tools)</li>
<li>contacted and received statements from some percentage of the original witnesses (50% or more)</li>
<li>identified the victims of the mystery (100%)</li>
<li>correctly identified the actors (100%)</li>
<li>correctly eliminated innocent suspects (100%)</li>
</ul>
<p>When the mystery is solved, the player can bundle up the results and turn it in for some reward.  It&#8217;s up to the game system to determine how correct the player needs to be and what rewards are appropriate to that setting.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mischiefblog.com/?feed=rss2&amp;p=841</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
