<?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>selene tan</title>
	<atom:link href="http://selenetan.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://selenetan.com</link>
	<description>reaching for the moon and sky</description>
	<lastBuildDate>Sun, 07 Mar 2010 09:21:06 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Simple Sudoku and Modes of Thinking</title>
		<link>http://selenetan.com/2010/02/simple-sudoku-and-modes-of-thinking/</link>
		<comments>http://selenetan.com/2010/02/simple-sudoku-and-modes-of-thinking/#comments</comments>
		<pubDate>Wed, 17 Feb 2010 21:34:00 +0000</pubDate>
		<dc:creator>selene</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[interface design]]></category>
		<category><![CDATA[pattern recognition]]></category>
		<category><![CDATA[puzzle]]></category>
		<category><![CDATA[sudoku]]></category>

		<guid isPermaLink="false">http://selenetan.com/?p=62</guid>
		<description><![CDATA[A while back, I found Simple Sudoku, a freeware Sudoku puzzle maker/solver. It generates puzzles for you to solve, and also has a lot of features to make it easier to solve them. After playing way too much Sudoku in it, I realized why it makes things so much easier. On the surface, Sudoku is [...]]]></description>
			<content:encoded><![CDATA[<p>A while back, I found <a href="http://angusj.com/sudoku/">Simple Sudoku</a>, a freeware <a href="http://en.wikipedia.org/wiki/Sudoku">Sudoku</a> puzzle maker/solver. It generates puzzles for you to solve, and also has a lot of features to make it easier to solve them. After playing way too much Sudoku in it, I realized why it makes things so much easier. On the surface, Sudoku is all about logical deduction&#8211;the 9 in this square means you can eliminate 9&#8242;s elsewhere in the row and column, and so on. However, at higher levels, Sudoku is actually about pattern recognition, and that is what Simple Sudoku reveals.</p>
<p><span id="more-62"></span></p>
<p>One feature of Simple Sudoku is that it automatically shows the candidates for a square. This takes away the tedium of having to manually eliminate the obvious candidates, like 9&#8242;s in a row that already has a 9. Still, the candidates sometimes look like a mess.<br />
Simple Sudoku solves this with a feature called candidate filtering. What it does is highlight all squares that might be a particular number, e.g. all possible 9&#8242;s. This makes it easy to see, for example, when there&#8217;s only one possible 9 left in a column.</p>
<div class="separator" style="clear: both; text-align: center;"><a style="margin-left: 1em; margin-right: 1em;" href="http://selenetan.com/asherarpg/uploaded_images/simple_sudoku_lone_6-782602.jpg"><img src="http://selenetan.com/asherarpg/uploaded_images/simple_sudoku_lone_6-782598.jpg" border="0" alt="A screenshot of Simple Sudoku that shows candidate filtering on 6's. A now-obvious lone 6 in the rightmost column has been circled." width="263" height="320" /></a></div>
<div style="margin-left: auto; margin-right: auto; text-align: center; width: 60%;">A screenshot of Simple Sudoku that shows candidate filtering on 6&#8242;s. A now-obvious lone 6 in the rightmost column has been circled.</div>
<p>Candidate filtering is good for slightly more advanced deductions, as well. Let&#8217;s say you have one 3&#215;3 cell where all the possible 6&#8242;s are in the same row. You can eliminate 6 as a candidate from the rest of the row. Or, visually, you can do this:</p>
<div class="separator" style="clear: both; text-align: center;"><a style="margin-left: 1em; margin-right: 1em;" href="http://selenetan.com/asherarpg/uploaded_images/simple_sudoku_eliminate_row-733225.jpg"><img src="http://selenetan.com/asherarpg/uploaded_images/simple_sudoku_eliminate_row-733217.jpg" border="0" alt="The same screenshot of Simple Sudoku with filtering on 6's. In the upper-right 3x3 cell, an arrow is drawn from the row of 6's across the row, showing that you can eliminate the other 6's." width="263" height="320" /></a></div>
<div style="margin-left: auto; margin-right: auto; text-align: center; width: 60%;">The same screenshot of Simple Sudoku with filtering on 6&#8242;s. In the upper-right 3&#215;3 cell, an arrow is drawn from the row of 6&#8242;s across the row, showing that you can eliminate the other 6&#8242;s.</div>
<p>There is an advanced Sudoku technique called <a href="http://www.sadmansoftware.com/sudoku/technique12.htm">coloring</a> or <a href="http://www.sudoku129.com/puzzles/tips_43.php">linked candidates</a>. It involves forming a chain of candidate squares where you know that some of the squares contain the candidate, and the rest do not. However, which set of squares contains the candidate is unknown at the start. The technique involves &#8220;coloring in&#8221; the candidate squares in an alternating pattern, e.g. with blue and pink. If any pink square contains the number, then all pink squares will contain the same number, and all blue squares will not. The reverse is true as well.</p>
<p>The technique can be difficult to understand from a description, but in Simple Sudoku, it&#8217;s really easy to do. Filter candidates so that, say, all 5&#8242;s are shown. Find a place where there are only two 5 candidates in a row, column, or large cell. Color one of the squares pink, and one blue. Then continue the chain as long as you can find links where there are only two 5&#8242;s. If you see two pink neighboring each other, then the pinks don&#8217;t have 5&#8242;s and the blues are the ones with 5&#8242;s.</p>
<div class="separator" style="clear: both; text-align: center;"><a style="margin-left: 1em; margin-right: 1em;" href="http://selenetan.com/asherarpg/uploaded_images/simple_sudoku_coloring_anim-749095.gif"><img src="http://selenetan.com/asherarpg/uploaded_images/simple_sudoku_coloring_05a-2-716669.jpg" border="0" alt="" width="263" height="320" /></a></div>
<div style="margin-left: auto; margin-right: auto; text-align: center; width: 60%;">A screenshot showing two neighboring pink squares. Click to view an animation of the process.</div>
<p>Coloring turns a painstaking deduction problem into a simple pattern-recognition problem. Going through the chain of logic step-by-step takes a while and can be prone to error, but marking squares as colors is easy. And on the computer, it&#8217;s easily reversible. I&#8217;ll often start coloring squares even when &#8220;simpler&#8221; deductions can be made because in Simple Sudoku, coloring <em>is</em> a simple deduction.</p>
<p>In general, as you get better at a type of logic puzzle, you start recognizing common sequences of deductions. Internally, you formulate a series of rules: &#8220;If <em>this</em>, then do <em>that</em>.&#8221; What Simple Sudoku and other good puzzle interfaces do is 1) Make it easier to notice common deductions, and 2) Make it easier to spot the &#8220;If this&#8221; part of your rules.</p>
]]></content:encoded>
			<wfw:commentRss>http://selenetan.com/2010/02/simple-sudoku-and-modes-of-thinking/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Prototype: Sideliner</title>
		<link>http://selenetan.com/2010/02/prototype-sideliner/</link>
		<comments>http://selenetan.com/2010/02/prototype-sideliner/#comments</comments>
		<pubDate>Sun, 14 Feb 2010 21:06:00 +0000</pubDate>
		<dc:creator>selene</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Lab]]></category>

		<guid isPermaLink="false">http://selenetan.com/?p=61</guid>
		<description><![CDATA[One thing I noticed about the Ludum Dare Flash entries was that most of them were done with flixel. For the competition, I decided not to use it because I didn&#8217;t want to learn a new library in the same 48 hours I had to make a game. Anyway, I&#8217;ve finally gotten around to trying [...]]]></description>
			<content:encoded><![CDATA[<p>One thing I noticed about the Ludum Dare Flash entries was that most of them were done with <a href="http://flixel.org">flixel</a>. For the competition, I decided not to use it because I didn&#8217;t want to learn a new library in the same 48 hours I had to make a game.</p>
<p>Anyway, I&#8217;ve finally gotten around to trying flixel out. I cast around a bit for a game idea that I thought would suit flixel&#8217;s strengths. It&#8217;s a game with 3 tracks where rocks come at you and you have to switch tracks to dodge them.</p>
<p><a href="http://selenetan.com/games/wip/sideliner/index0.5.html">Play the Sideliner prototype</a></p>
<p>Unfortunately, it&#8217;s not really fun. The graphics were also a pain. Rocks I can do; the drill took me at least twice as long.</p>
]]></content:encoded>
			<wfw:commentRss>http://selenetan.com/2010/02/prototype-sideliner/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SEEK*TOR</title>
		<link>http://selenetan.com/2010/01/seektor/</link>
		<comments>http://selenetan.com/2010/01/seektor/#comments</comments>
		<pubDate>Sun, 31 Jan 2010 08:50:05 +0000</pubDate>
		<dc:creator>selene</dc:creator>
				<category><![CDATA[Portfolio]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[game]]></category>
		<category><![CDATA[game design]]></category>
		<category><![CDATA[game development]]></category>
		<category><![CDATA[ludumdare]]></category>
		<category><![CDATA[seektor]]></category>

		<guid isPermaLink="false">http://selenetan.com/?p=113</guid>
		<description><![CDATA[SEEK*TOR is a puzzle game about revealing the single enemy turret on an obscured map. It was created for the 16th Ludum Dare competition, a 48-hour long solo game development challenge. The theme of the competition was &#8220;Explore.&#8221; SEEK*TOR was ranked 5th overall of the 121 entries. Play it below: 
<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
			id="fm_seektor_1277005724"
			class="flashmovie"
			width="480"
			height="300">
	<param name="movie" value="http://selenetan.com/uploads/Games/seektor.swf" />
	<!--[if !IE]>-->
	<object	type="application/x-shockwave-flash"
			data="http://selenetan.com/uploads/Games/seektor.swf"
			name="fm_seektor_1277005724"
			width="480"
			height="300">
	<!--<![endif]-->
		]]></description>
			<content:encoded><![CDATA[<p>SEEK*TOR is a puzzle game about revealing the single enemy turret on   an obscured map. It was created for the <a rel="nofollow" href="http://www.ludumdare.com/compo/">16th Ludum Dare  competition</a>,  a 48-hour long solo game development challenge. The  theme of the  competition was &#8220;Explore.&#8221;</p>
<p>SEEK*TOR was ranked 5th overall of the 121 entries. Play it below:</p>
<p><span>[kml_flashembed publishmethod="static" fversion="9.0.0" movie="<a class="linkifyplus" href="http://selenetan.com/uploads/Games/seektor.swf">http://selenetan.com/uploads/Games/seektor.swf</a>" width="480" height="360" targetclass="flashmovie"]</span><a href="http://adobe.com/go/getflashplayer"><img src="http://www.adobe.com/images/shared/download_buttons/get_flash_player.gif" alt="Get Adobe Flash player" /></a></p>

	<!--[if !IE]>-->
	</object>
	<!--<![endif]-->
</object>
<p>Other links:</p>
<ul>
<li><a rel="nofollow" href="http://www.ludumdare.com/compo/ludum-dare-16/?uid=1550">Ludum  Dare entry page</a></li>
<li><a rel="nofollow" href="http://selenetan.com/dump/ludumdare16/">Original  competition  entry</a> (the version above contains some bugs I fixed after the  end of the  competition)</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://selenetan.com/2010/01/seektor/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Fixed bugs in SEEK*TOR</title>
		<link>http://selenetan.com/2009/12/fixed-bugs-in-seektor/</link>
		<comments>http://selenetan.com/2009/12/fixed-bugs-in-seektor/#comments</comments>
		<pubDate>Sun, 20 Dec 2009 04:57:00 +0000</pubDate>
		<dc:creator>selene</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[debugging]]></category>
		<category><![CDATA[seektor]]></category>

		<guid isPermaLink="false">http://selenetan.com/?p=59</guid>
		<description><![CDATA[I finally tracked down the bug in SEEK*TOR that sometimes makes the red enemy square (and some of the ally turrets) unclickable. While I was at it, I squashed a few more bugs I found along the way.Play SEEK*TOR v 1.2 Changes in this version: Fixes bug where the upper-left turret is unclickable Fixes bug [...]]]></description>
			<content:encoded><![CDATA[<p><span>I <b>finally</b> tracked down the bug in SEEK*TOR that sometimes makes the red  enemy square (and some of the ally turrets) unclickable. While I was at it, I squashed a few more bugs I found along the way.</span><br /><span><br /></span><br /><span><a href="http://selenetan.com/games/seektor/bugfix20091219/">Play SEEK*TOR v 1.2</a></span></p>
<p><span>Changes in this version:</span>
<ol>
<li>Fixes bug where the upper-left turret is unclickable</li>
<li>Fixes bug where sometimes the red enemy square is unclickable</li>
<li>Fixes bug where on very high levels, the level never starts</li>
<li>Turns off debug flag so turret layouts are randomized between 4  choices instead of just one</li>
<li>Background music now loops</li>
</ol>
<p>So what caused the unclickable-things bug, and how did I track it down?</p>
<p>With the help of debug output, I discovered that when a turret or enemy was unclickable, it was because something else on the screen &#8220;stole&#8221; the click event. In the unclickable upper-left turret bug, the click event was going to the flare display in the upper-left. In the unclickable enemy square bug, the click event was going to an object with a name like SpriteXXX. XXX was a number that was larger the later in the game the bug appeared.</p>
<p>The object name was my biggest clue. The number meant that it was a sprite that was created every level. The turrets are created anew every level, but they show up as TurretXXX. So I combed through the code until I found a sprite that was being created every level.</p>
<p>The sprite I found was the little explosion graphic that shows when you click on the enemy turret. In my competition-driven haste, I&#8217;d written code that created a new sprite every time the explosion went off, and didn&#8217;t bother to make it unclickable, or remove it from the stage afterward.&nbsp; To fix the bug, I modified the code so that it created the explosion sprite only once and reused it every level, and I made sure the sprite was unclickable. That fixed the bug.</p>
]]></content:encoded>
			<wfw:commentRss>http://selenetan.com/2009/12/fixed-bugs-in-seektor/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Post-Mortem: SEEK*TOR</title>
		<link>http://selenetan.com/2009/12/post-mortem-seektor/</link>
		<comments>http://selenetan.com/2009/12/post-mortem-seektor/#comments</comments>
		<pubDate>Tue, 15 Dec 2009 03:12:00 +0000</pubDate>
		<dc:creator>selene</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[game design]]></category>
		<category><![CDATA[game development]]></category>
		<category><![CDATA[ludumdare]]></category>
		<category><![CDATA[postmortem]]></category>
		<category><![CDATA[seektor]]></category>

		<guid isPermaLink="false">http://selenetan.com/?p=58</guid>
		<description><![CDATA[So this was my first Ludum Dare. I did the Global Game Jam back in February, so I had some idea of what to expect, although the GGJ was teams rather than solo. One thing I do regret is not interacting more with the community–IRC, Twitter, etc. I could have used more feedback than I [...]]]></description>
			<content:encoded><![CDATA[<p>So this was my first Ludum Dare. I did the Global Game Jam back in  February, so I had some idea of what to expect, although the GGJ was  teams rather than solo. One thing I do regret is not interacting more  with the community–IRC, Twitter, etc. I could have used more feedback  than I got, instead of relying almost entirely on my husband’s comments.<br />
Friday night I spent brainstorming ideas and thinking over mechanics.  Saturday morning I started coding. By late afternoon / early evening, I  had the major mechanics implemented, but it wasn’t fun. At that point  the turrets were just yellow diamonds (and they were warp portals which  your cyan circle teleported between), and the hint circle always  disappeared before you could fire again.</p>
<p><img src="http://www.ludumdare.com/compo/wp-content/uploads/2009/12/screen_old01-300x225.jpg" alt="Screenshot of older version of SEEK*TOR" width="300" height="225" /><br />
Screenshot of older version of SEEK*TOR</p>
<p>The best thing that happened for the game occurred when I sent my  Saturday prototype to a friend for feedback. He told me two very  important things:</p>
<ol>
<li> He had the most fun figuring out where the hint circles intersected</li>
<li>He wanted to know why you had to aim and fire to reveal the map  instead of just placing light bulbs around the “platforms” (yellow  diamonds)</li>
</ol>
<p>So I made the hints persist but fade over time. That means you can  see the hint circle intersections, but the screen doesn’t become  overly-cluttered with old hint circles. It also means the aiming  mechanic is important, since if you take too long, the previous hint  will have faded away. I also changed the theming of the game so that the  portals became turrets and you selected a turret to fire from, rather  than teleporting between them.<br />
Sunday was mostly a day of polish. The big feature changes were  implementing multiple levels, scoring, and flare limits. I also added  the start, game over, and between-level screens, made the graphics,  (such as they are–hooray for GlowFilter!) composed a background track,  and created the sound effects.<br />
In the end, I was successful in terms of having a pretty-much  finished game at the end. On the other hand, seeing some of the other  entries, I kind of wish I’d done something a little more ambitious…<br />
Things that worked out:</p>
<ol>
<li>Using abstract glow-y vector graphics instead of trying to draw. (I  spent about 20 minutes attempting to draw a single turret before  deciding my time was better spent elsewhere.)</li>
<li>The game selects from 4 (hand-crafted) turret layouts and randomizes  the enemy and player locations. That turned out to be enough  randomization that I didn’t need to make a turret layout generator. In  fact, I only just realized that I left the game in debug mode where it  always chooses the same turret layout.</li>
</ol>
<p>Things that didn’t work out:</p>
<ol>
<li>When I started, I implemented everything in one file just to see if  the core mechanic would work. I made such a mess of my code that I spent  hours late Saturday night moving code around so I could add levels.  Spending hours working on code without actually adding new  functionality–even regressing at times–was very hard on my morale.</li>
<li>I spent too long trying to make my git history tidy. I’d keep  forgetting to add a file to the commit or not commit for a while and  wind up with a gigantic commit that involved 3 features and all the  source files. Then I’d try to figure out how to break up or revise the  commits. (And how to use vim, since that’s the default git editor…)  Given that I never had to revert to a previous version, it was kind of  silly of me.</li>
</ol>
<p>Tools and Libraries Used:</p>
<ol>
<li>FlashDevelop</li>
<li>TweenLite</li>
<li>git</li>
<li>ACID Music Studio</li>
<li>Free VSTi soft synths: <a href="http://www.greenoak.com/crystal/">Crystal</a>,  <a href="http://www.bostreammail.net/ers/lazysnake.html">LazySnake</a>,  and <a href="http://www.bostreammail.net/ers/ersdrums.html">ErsDrums</a></li>
<li>Audacity</li>
<li>sfxr</li>
</ol>
<p>(cross-posted from <a href="http://www.ludumdare.com/compo/2009/12/14/post-mortem-seektor/">Ludum Dare</a>)</p>
]]></content:encoded>
			<wfw:commentRss>http://selenetan.com/2009/12/post-mortem-seektor/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Finished my first Ludum Dare!</title>
		<link>http://selenetan.com/2009/12/finished-my-first-ludum-dare/</link>
		<comments>http://selenetan.com/2009/12/finished-my-first-ludum-dare/#comments</comments>
		<pubDate>Mon, 14 Dec 2009 03:28:00 +0000</pubDate>
		<dc:creator>selene</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[game development]]></category>
		<category><![CDATA[ludumdare]]></category>
		<category><![CDATA[seektor]]></category>

		<guid isPermaLink="false">http://selenetan.com/?p=57</guid>
		<description><![CDATA[Sweet, I managed to complete my first Ludum Dare! I was thinking of learning Push Button Engine for it, but after going through a couple of tutorials I decided I’d go for straight-up Actionscript instead. PBE has some neat features, but I need more time to get my head around its component-based programming model.Anyway, SEEK*TOR [...]]]></description>
			<content:encoded><![CDATA[<div class="entry">Sweet, I managed to complete my first Ludum Dare! I was thinking  of learning <a href="http://pushbuttonengine.com/">Push Button Engine</a>  for it, but after going through a couple of tutorials I decided I’d go  for straight-up Actionscript instead. PBE has some neat features, but I  need more time to get my head around its component-based programming  model.<br />Anyway, SEEK*TOR is a game where you’re trying to locate the enemy by  firing search flares from turrets. You have limited flares, and turrets  have a limited range, so you need to carefully choose where you aim.  It’s in Flash.</p>
<p><a href="http://www.ludumdare.com/compo/ludum-dare-16/?action=preview&amp;uid=1550">SEEK*TOR  Voting page</a><br />
<style type="text/css">   #gallery-1 {    margin: auto;   }   #gallery-1 .gallery-item {    float: left;    margin-top: 10px;    text-align: center;    width: 33%;   }   #gallery-1 img {    border: 2px solid #cfcfcf;   }   #gallery-1 .gallery-caption {    margin-left: 0;   }  </style>
<p>
<div class="gallery galleryid-13810" id="gallery-1">
<dl class="gallery-item">
<dt class="gallery-icon">     <a href="http://www.ludumdare.com/compo/wp-content/uploads/2009/12/screen01.jpg" title="screen01"><img alt="" class="attachment-thumbnail" height="150" src="http://www.ludumdare.com/compo/wp-content/uploads/2009/12/screen01-150x150.jpg" title="screen01" width="150" /></a>    </dt>
</dl>
<dl class="gallery-item">
<dt class="gallery-icon">     <a href="http://www.ludumdare.com/compo/wp-content/uploads/2009/12/screen02.jpg" title="screen02"><img alt="" class="attachment-thumbnail" height="150" src="http://www.ludumdare.com/compo/wp-content/uploads/2009/12/screen02-150x150.jpg" title="screen02" width="150" /></a>    </dt>
</dl>
<dl class="gallery-item">
<dt class="gallery-icon">     <a href="http://www.ludumdare.com/compo/wp-content/uploads/2009/12/screen03.jpg" title="screen03"><img alt="" class="attachment-thumbnail" height="150" src="http://www.ludumdare.com/compo/wp-content/uploads/2009/12/screen03-150x150.jpg" title="screen03" width="150" /></a>    </dt>
</dl>
<p><br style="clear: both;" /></div>
<p>Incidentally, I’m annoyed with Audacity because it added an initial  silence to all the mp3 files I encoded with it. So all the sounds come  in late. <img alt=":(" class="wp-smiley" src="http://www.ludumdare.com/compo/wp-includes/images/smilies/icon_sad.gif" />  Also, I just realized that I forgot to  have the background music loop…</p>
<p>(Cross-posted from <a href="http://www.ludumdare.com/compo/2009/12/13/finished-my-first-ludum-dare/">Ludum Dare</a>) </div>
]]></content:encoded>
			<wfw:commentRss>http://selenetan.com/2009/12/finished-my-first-ludum-dare/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Git on Dreamhost</title>
		<link>http://selenetan.com/2009/10/git-on-dreamhost/</link>
		<comments>http://selenetan.com/2009/10/git-on-dreamhost/#comments</comments>
		<pubDate>Wed, 14 Oct 2009 08:43:00 +0000</pubDate>
		<dc:creator>selene</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[dreamhost]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[version control]]></category>

		<guid isPermaLink="false">http://selenetan.com/?p=51</guid>
		<description><![CDATA[Though my website is hosted on Dreamhost, these days I mostly use them for version control hosting. So I was very happy when they set up git on their servers. Casper Fabricius&#8217; Keeping git repositories on Dreamhost using SSH has some instructions and a handy script for automating the process. Thing is, I tend to [...]]]></description>
			<content:encoded><![CDATA[<p>Though my website is hosted on <a href="http://www.dreamhost.com">Dreamhost</a>, these days I mostly use them for version control hosting. So I was very happy when they set up <a href="http://git-scm.com">git</a> on their servers.</p>
<p>Casper Fabricius&#8217; <a href="http://casperfabricius.com/site/2008/09/21/keeping-git-repositories-on-dreamhost-using-ssh/">Keeping git repositories on Dreamhost using SSH</a> has some instructions and a handy script for automating the process. Thing is, I tend to create the folders and files for a project before I set up the git repository. Casper&#8217;s script assumes you want to create the folder and repository at the same time.</p>
<p>So here&#8217;s my version of the script. If you call it without arguments, it assumes you want to make a repository for the current directory.</p>
<div class="codesnip-container" >
<div class="bash codesnip" style="font-family:monospace;">
<ol>
<li class="li1">
<div class="de1"><span class="re2">DREAMGIT_DOMAIN</span>=user<span class="sy0">@</span>yourdomain.com</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">if</span> <span class="br0">&#91;</span> <span class="re4">$#</span> <span class="re5">-lt</span> 1 <span class="br0">&#93;</span>; <span class="kw1">then</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re2">PROJECT_DIR</span>=<span class="co1">${PWD##*/}</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">else</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re2">PROJECT_DIR</span>=$1</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">mkdir</span> <span class="re1">$PROJECT_DIR</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw3">cd</span> <span class="re1">$PROJECT_DIR</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">fi</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">ssh</span> <span class="re1">$DREAMGIT_DOMAIN</span> <span class="st_h">&#8216;mkdir -p ~/git/&#8217;</span><span class="re1">$PROJECT_DIR</span><span class="st_h">&#8216;.git &amp;amp;&amp;amp; cd ~/git/&#8217;</span><span class="re1">$PROJECT_DI</span><span class="re1">$git</span> init</div>
</li>
<li class="li1">
<div class="de1">git remote add origin <span class="kw2">ssh</span>:<span class="sy0">//</span><span class="re1">$DREAMGIT_DOMAIN</span><span class="sy0">/</span>~<span class="sy0">/</span>git<span class="sy0">/</span><span class="re1">$PROJECT_DIR</span>.git</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">touch</span> .gitignore</div>
</li>
<li class="li1">
<div class="de1">git add .</div>
</li>
<li class="li1">
<div class="de1">git commit <span class="re5">-m</span> <span class="st_h">&#8216;Created new repo&#8217;</span></div>
</li>
<li class="li1">
<div class="de1">git push origin master</div>
</li>
<li class="li1">
<div class="de1"><span class="kw3">echo</span> <span class="st0">&quot;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0">[branch <span class="es1">\&quot;</span>master<span class="es1">\&quot;</span>]</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0">remote = origin</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0">merge = refs/heads/master&quot;</span> <span class="sy0">&amp;</span>gt;<span class="sy0">&amp;</span>gt;.git<span class="sy0">/</span>config</div>
</li>
<li class="li1">
<div class="de1"><span class="kw3">echo</span> <span class="st0">&quot;Your new git repo &#8216;<span class="es2">$PROJECT_DIR</span>&#8216; is ready and initialized at</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0"><span class="es2">$DREAMGIT_DOMAIN</span>/~/git/<span class="es2">$PROJECT_DIR</span>.git&quot;</span></div>
</li>
</ol>
</div>
</div>
<p>Note: both Casper&#8217;s and my scripts still work if you call them with a directory that exists, e.g. <strong>dreamgit dir_that_exists</strong>. You&#8217;ll see <strong>mkdir</strong> spout an error, but the rest will execute.</p>
]]></content:encoded>
			<wfw:commentRss>http://selenetan.com/2009/10/git-on-dreamhost/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Scrambling Words for Maximum Fun</title>
		<link>http://selenetan.com/2009/09/scrambling-words-for-maximum-fun/</link>
		<comments>http://selenetan.com/2009/09/scrambling-words-for-maximum-fun/#comments</comments>
		<pubDate>Thu, 03 Sep 2009 13:07:00 +0000</pubDate>
		<dc:creator>selene</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[algorithm]]></category>
		<category><![CDATA[game design]]></category>
		<category><![CDATA[puzzle]]></category>
		<category><![CDATA[word scrambling]]></category>

		<guid isPermaLink="false">http://selenetan.com/?p=50</guid>
		<description><![CDATA[A while back, I worked on an online Flash version of the game show Don&#8217;t Forget the Lyrics. It&#8217;s a game show where contestants get up and sing along to some music until the music stops dead and they have to fill in the rest of the line. They have three lifelines (a la Who [...]]]></description>
			<content:encoded><![CDATA[<p>A while back, I worked on an online Flash version of the game show Don&#8217;t Forget the Lyrics. It&#8217;s a game show where contestants get up and sing along to some music until the music stops dead and they have to fill in the rest of the line. They have three lifelines (a la Who Wants to be a Millionaire) they can use: show the first three words, turn the question into a multiple-choice question, or get their pre-appointed friend to answer for them. The first two are easy to code up, the third not so much. We didn&#8217;t have the budget to record people singing the missing lyrics, so it had to be text-based. We thought of randomly selecting one of the multiple choice answers, but realized that people would probably feel cheated at being given a wrong answer. And it would be too easy to just always give them the right answer.</p>
<p>At some point, I came up with the idea of showing the player a scrambled version of the correct answer. That would leave it up to the player&#8217;s skill to get the correct answer from it, so it wasn&#8217;t a guaranteed success but would still seem fair. Then I had to come up with an algorithm for scrambling words that wasn&#8217;t too easy, but wasn&#8217;t too hard for anyone to solve in the time limit.</p>
<p><span id="more-50"></span><strong>Try 1:</strong> Scramble the whole string, including spaces.<br />
<strong>Sample:</strong> UM  LOYDE L AYEYO HHIAS LSRT MNP OTIM NOPKATSFOHA EEFEN</p>
<p>This was dead easy to code and incredibly hard to solve. Scrambling the spaces in with the rest of the letters made it especially hard, since people automatically read them as word boundaries.</p>
<p><strong>Try 2:</strong> Split the string into words, then scramble each word<br />
<strong>Sample:</strong> I DEAM ITSH AHFL YPNO LAFH MENYKO MTOENSR TO SEAEPL UOY</p>
<p>This was much better, but still pretty hard. The time limit on answering meant that people often ran out of time while trying to unscramble the string. But then I remembered an e-mail forward I&#8217;d seen which claimed that if you leave the first and last letters of a word intact but scramble the rest, people can still pretty much read it.</p>
<p><strong>Try 3:</strong> Split the string into words, freeze the first and last letters, and scramble the middle ones. (For 2-letter words, give a 50% chance of swapping the order.)<br />
<strong>Sample:</strong> I MDAE THIS HALF PONY HLAF MEKONY MSOETNR TO PAESLE YOU</p>
<p>This was too easy. 3-letter words were always in order, since freezing the first and last letters left a 1-letter string to scramble. 4-letter words would stay in order half the time since their inner length-2 string got scrambled.</p>
<p><strong>Try 4:</strong> This had a lot of special cases.</p>
<ol>
<li>Split the string into words. For each word longer than 1 letter:</li>
<li>If the word is 2 letters long, 50% chance of swapping the letters</li>
<li>If the word is 3 letters long, scramble it</li>
<li>If the word is 4 letters long, freeze the first letter and scramble the rest</li>
<li>If the word is 5 or more letters, freeze the first and last letter and scramble the inner letters</li>
</ol>
<p><strong>Sample:</strong> I MEAD THSI HFLA PYON HLFA MEONKY MOESNTR OT PAESLE OUY</p>
<p>The results were really good! Easy enough to solve within the time limit most of the time, and just hard enough to feel good about solving. The computer science geek in me wishes there were some way to do it with fewer special cases and a continuous difficulty scale, but short words really need to be treated differently because of their length. Still, it was a pretty interesting problem. Who knew an e-mail forward would come in so handy?</p>
<p>(Incidentally, the phrase is &#8220;I made this half-pony half-monkey monster to please you&#8221;, which is from the song <a href="http://www.jonathancoulton.com/songdetails/Skullcrusher%20Mountain">Skullcrusher Mountain</a> by Jonathan Coulton. Check it out!)</p>
]]></content:encoded>
			<wfw:commentRss>http://selenetan.com/2009/09/scrambling-words-for-maximum-fun/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>eFusjon RAD Game</title>
		<link>http://selenetan.com/2009/07/efusjon-rad-game/</link>
		<comments>http://selenetan.com/2009/07/efusjon-rad-game/#comments</comments>
		<pubDate>Sun, 19 Jul 2009 01:21:03 +0000</pubDate>
		<dc:creator>selene</dc:creator>
				<category><![CDATA[Portfolio]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[game]]></category>
		<category><![CDATA[game design]]></category>
		<category><![CDATA[game development]]></category>

		<guid isPermaLink="false">http://selenetan.com/?p=128</guid>
		<description><![CDATA[eFusjon RAD is a game promoting the eFusjon energy drink, launched in July 2009. In RAD you control the Efusjonaut, and must absorb eFusjon to neutralize free radicals while avoiding toxins. The Efusjonaut is controlled with the mouse, and can switch between an offensive toxin-eliminating mode and a passive free radical-neutralizing mode. I came up [...]]]></description>
			<content:encoded><![CDATA[<p><a rel="nofollow" href="http://www.efusjongaming.com/games/">eFusjon  RAD</a> is a game promoting the eFusjon energy  drink, launched in July  2009.</p>
<p>In RAD you control the Efusjonaut, and must absorb  eFusjon to  neutralize free radicals while avoiding toxins. The  Efusjonaut is  controlled with the mouse, and can switch between an  offensive  toxin-eliminating mode and a passive free radical-neutralizing  mode.</p>
<p>I came up with the gameplay concept and led  the  project. A graphic designer came up with the look and feel for the  menus  and an animator/artist created the main game art and sprites. I   incorporated everything into Flash, set up the overarching code   structure, and programmed the gameplay and scoring. Other developers   worked on the leaderboard score submission, some of the menus, and the   instructions. After some testing showed that people were confused about   how to play, I came up with and implemented the idea of adding pop-up   tutorial messages in-game explaining things.</p>
<p>Links:</p>
<ul>
<li> <a rel="nofollow" href="http://www.efusjongaming.com/">eFusjon  Gaming</a> is the official game website,  including details about the  promotion</li>
<li><a rel="nofollow" href="http://www.efusjongaming.com/games/">eFusjon  RAD</a> is the page where you can play the game.  Registration is  required because the game is part of a contest.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://selenetan.com/2009/07/efusjon-rad-game/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Information Access in Avalon Code</title>
		<link>http://selenetan.com/2009/05/information-access-in-avalon-code/</link>
		<comments>http://selenetan.com/2009/05/information-access-in-avalon-code/#comments</comments>
		<pubDate>Wed, 27 May 2009 06:27:00 +0000</pubDate>
		<dc:creator>selene</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[information design]]></category>
		<category><![CDATA[interface design]]></category>

		<guid isPermaLink="false">http://selenetan.com/?p=49</guid>
		<description><![CDATA[Recently I&#8217;ve been playing a DS RPG called Avalon Code. It&#8217;s an action RPG where the world is about to end, and you&#8217;re the Chosen One who&#8217;s been granted the Book of Prophecy to populate the new world. It&#8217;s your duty to use the Book to gather information about all the things that will be [...]]]></description>
			<content:encoded><![CDATA[<p>Recently I&#8217;ve been playing a DS RPG called Avalon Code. It&#8217;s an action RPG where the world is about to end, and you&#8217;re the Chosen One who&#8217;s been granted the Book of Prophecy to populate the new world. It&#8217;s your duty to use the Book to gather information about all the things that will be in the new world by &#8220;code scanning&#8221; them, which you do by hitting them with the Book of Prophecy. (Apparently the new world is going to have a lot of monsters.)</p>
<p>When you code scan something, it adds a page to the book that describes the object and shows its &#8220;codes&#8221;. Codes are blocks of different shapes and sizes that represent various qualities, such as Fire, Snake, or Justice. The codes are arranged on a grid (the &#8220;mental map&#8221;), and you can &#8220;rewrite&#8221; the codes by swapping them around.</p>
<div style="text-align: center;"><a href="http://selenetan.com/asherarpg/uploaded_images/avaloncode_codesgrid-743936.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img style="cursor: pointer; display: block; height: 153px; margin: 0px auto 10px; text-align: center; width: 220px;" src="http://selenetan.com/asherarpg/uploaded_images/avaloncode_codesgrid-743930.jpg" border="0" alt="The Sword page and the 4 hot-swap code slots" /></a><em><span style="font-size: x-small;">The Sword page and the 4 hot-swap code slots.</span></em></p>
</div>
<p>You&#8217;ll find item bases scattered through the game, and you modify them by swapping codes. The above picture shows the Sword base with one Fire code, making it a &#8220;Fire Sword&#8221;. There are also recipes for specific items, e.g. the set of codes you&#8217;ll need to make the Sword into a &#8220;Champion Gladius&#8221;.</p>
<p>Making the recipes is a painstaking process. You have 4 slots of &#8220;holding&#8221; space to transfer codes between pages &#8212; all other codes have to be on a page. So if you decide you want that Champion Gladius, you have to:<span id="more-49"></span></p>
<ol>
<li>Look through all of your pages to see if you have enough codes to make it</li>
<li>Empty the Sword of codes not in the recipe and dump them on other pages</li>
<li>Transfer the desired codes onto the Sword, 4 at a time</li>
</ol>
<p>Like I said, painful. I wound up entering a list of all my codes and their pages into a spreadsheet with columns for code type, size, and which page it&#8217;s on. Basically, a database. For step 1, I sort the columns by code type and size, and look through them to see if I have sufficient codes. Then comes the transfer process.</p>
<p>There are two issues with transferring: keeping the database synchronized, and locating the pages referenced in the database. The first is just tedious. The &#8220;proper&#8221; way would be to update the database for each transfer between page and hot-swap bar, but I usually skip recording the transfer to the swap bar and just change the code&#8217;s location from source page to destination page.</p>
<p>When attempting to locate pages, I often find myself wishing the book were a densely-linked website.</p>
<div style="text-align: center;"><a href="http://selenetan.com/asherarpg/uploaded_images/avaloncode_toc-797978.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img style="cursor: pointer; display: block; height: 155px; margin: 0px auto 10px; text-align: center; width: 220px;" src="http://selenetan.com/asherarpg/uploaded_images/avaloncode_toc-797970.jpg" border="0" alt="The Table of Contents" /></a><em><span style="font-size: x-small;">The Table of Contents</span></em></div>
<p>There are a few ways to navigate the book:</p>
<ol>
<li>Click on either of the bottom corners (where the page numbers are) to turn the page in that direction. Hold down the corner to make the pages keep turning until you let go.</li>
<li>Click on one of the labeled buttons at the top of the screen: &#8220;Index&#8221; goes to the table of contents, &#8220;Player&#8221; goes to the player info page, &#8220;Data&#8221; goes to the save/load screen, and &#8220;Map&#8221; goes to the map of the current area.</li>
<li>The Table of Contents page has a list of links to broad sections, like &#8220;Monsters&#8221; and &#8220;Weapons&#8221;. The first page of each section is a table of contents with links to sub-sections, e.g. &#8220;Sword&#8221; and &#8220;Bomb&#8221; for Weapons.</li>
<li>The four colored buttons at the top are &#8220;Spirit Bookmarks&#8221; which you can place on any page that doesn&#8217;t already have a bookmark. Clicking the button will take you directly to that page. By default the Spirit Bookmarks are placed on the pages of their respective spirits.</li>
</ol>
<p>Some issues:</p>
<ol>
<li>When holding down a corner to keep flipping pages, the pages don&#8217;t load until you let go &#8212; all you see is a blank page. I can understand not loading all the information, but at least loading the page titles would have been helpful.</li>
<li>There&#8217;s no button to go to the section table of contents from a page.</li>
<li>Pages don&#8217;t indicate which subsection they&#8217;re in. This is largely an issue with the monsters, since it&#8217;s not immediately obvious whether something like the &#8220;Wood Bone&#8221; monster is a &#8220;Construct&#8221;, &#8220;Undead&#8221;, or &#8220;Humanoid&#8221;. (The number of monsters doesn&#8217;t help.)</li>
</ol>
<p>So what would my ideal user interface for this system look like? There would be more views of the data, for one:</p>
<ol>
<li>Text-only lists of pages (items, codes, monsters, etc.), with options to sort alphabetically or by page type. Entries would link to the page.</li>
<li>Lists of available codes, sortable by code type, size, or assigned page. A bonus would be small images of the code blocks, since they have different shapes.</li>
<li>Breadcrumbs or tree-style navigation, so you can always see what category a page is in and quickly navigate up and down the hierarchy.</li>
</ol>
<p>Here&#8217;s a mockup of one way to make code browsing more pleasant:</p>
<div style="text-align: center;"><a href="http://selenetan.com/asherarpg/uploaded_images/codebrowsemockup01-774942.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img style="cursor: pointer; display: block; height: 225px; margin: 0px auto 10px; text-align: center; width: 320px;" src="http://selenetan.com/asherarpg/uploaded_images/codebrowsemockup01-774940.jpg" border="0" alt="An item page with an added pop-up code browser" /></a><span style="font-style: italic;">An item page with an added pop-up code browser<br />
</span></div>
<p>This is an item page. I&#8217;ve added a window with a scrollable list of available size 3 Silver codes. Breadcrumbs let you go up to search for a different size of Silver codes, or a different code type altogether. Each entry in the list states what page it&#8217;s on, and shows the shape of the code. The idea is that you can drag a code straight from the list onto the page you&#8217;re viewing. There&#8217;s still a swap area so you can rotate the code before placing it.</p>
<p>As for browsing, I think the game would benefit from (at least) one level of &#8220;go back&#8221;, so you can always return to the page you were just looking at. With that functionality available, clicking on a page name in the code browser list should take you to the page. This is useful if there&#8217;s more than one code of a particular type on a page and you&#8217;re wondering which one to take. Then you can just click the back button and go back to the page for the item you&#8217;re trying to assemble.</p>
<p>And here&#8217;s a mockup of page browser:</p>
<div class="separator" style="clear: both; text-align: center;"><a style="margin-left: 1em; margin-right: 1em;" href="http://selenetan.com/asherarpg/uploaded_images/pagebrowsemockup01-751880.jpg"><img src="http://selenetan.com/asherarpg/uploaded_images/pagebrowsemockup01-751877.jpg" border="0" alt="" width="320" height="240" /></a></div>
<div class="separator" style="clear: both; text-align: center;"><em>An item page with added page browser</em></div>
<p>I&#8217;ve added a page browser window that pops up like the code browser. It&#8217;s a simple, scrollable tree-style navigation list. There are headings for the major categories; double-click one of them, or click on the &#8220;expand&#8221; icon next to it, and the list will expand to show the subcategories. Double-click a subcategory or click its &#8220;expand&#8221; icon, and it&#8217;ll show a list of pages. Click on a page name to go to that page.</p>
<p>This strays pretty far from the book interface model that Avalon Code is trying to use, but you do a lot of things with the Book of Prophecy that you would never do with a real book. If I did want to stick closer to the book model for browsing, just two improvements would go a long way:</p>
<ol>
<li><span style="font-weight: bold;">Alphabetize the pages within categories.</span> Dictionaries and encyclopedias are easy to browse because they use a well-known, easy-to-remember ordering. You know if you open a dictionary to the middle you&#8217;ll be in the M&#8217;s. I do wonder if the pages have a similarly meaningful order in the original Japanese, that wasn&#8217;t carried over during the localization.</li>
<li><span style="font-weight: bold;">When flipping pages by holding down one of the corners, show page titles.</span> The flipping-pages action is similar to &#8220;leafing&#8221; through a book, but with no information during the page-flipping, it&#8217;s like leafing through a book with your eyes closed. Sure, you might get to the right page if you&#8217;re lucky, but it&#8217;s more likely you&#8217;ll have to stop and peek several times.</li>
</ol>
<p>In the end, Avalon Code has some pretty neat game elements, but I can&#8217;t help but wish for a better interface.</p>
]]></content:encoded>
			<wfw:commentRss>http://selenetan.com/2009/05/information-access-in-avalon-code/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
