<?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>Tapir Games Blog</title>
	<atom:link href="http://blog.tapirgames.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.tapirgames.com</link>
	<description>make fun online games</description>
	<lastBuildDate>Tue, 03 Jan 2012 15:50:49 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.5</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>The future of WWW, the Virtual World Transfer Protocol and the Virtual World Traveler</title>
		<link>http://blog.tapirgames.com/2011/12/26/the-future-of-www-the-virtual-world-transfer-protocol-and-the-virtual-world-traveler/</link>
		<comments>http://blog.tapirgames.com/2011/12/26/the-future-of-www-the-virtual-world-transfer-protocol-and-the-virtual-world-traveler/#comments</comments>
		<pubDate>Mon, 26 Dec 2011 22:27:14 +0000</pubDate>
		<dc:creator>Tapir</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://blog.tapirgames.com/?p=189</guid>
		<description><![CDATA[With more than 2 decades development, the internet industry advanced hugely, at many aspects. But in general life, browsing 2D WWW pages rendered in browsers is still the main user experience. Although there are many rich media types embedded, the experience is still not very engaged.  It is really the time to welcome a more [...]]]></description>
			<content:encoded><![CDATA[<p>With more than 2 decades development, the internet industry advanced hugely, at many aspects. But in general life, browsing 2D WWW pages rendered in browsers is still the main user experience. Although there are many rich media types embedded, the experience is still not very engaged.  It is really the time to welcome a more impressive web surfing implementation. It is very possible the new implementation is the very old concept &#8211; Virtual World. Thanks to Linden Lab for bringing us the Second Life world, which surely is the <span>early prototype of the future WWW. But the implementation of Second Life is far from the ideal.</span></p>
<h3>What Second Life has done bad?</h3>
<ul>
<li>closed ecosystem. Although the client development is open, but the server side is closed. Especially, the world is closed.</li>
<li>Linden Lab is too ambitious. They want to build all aspects of the next generation of WWW.</li>
<li>the world is flat. Not that bad, but really not real.</li>
<li>lame avatar animations and controls</li>
</ul>
<h3>What Second Life has done good?</h3>
<ul>
<li>one world instance. This is great comparing to WoW.</li>
<li>the world is being modified continuously by users. This is another important good point comparing to WoW.</li>
<li>embed 2D pages in 3D world.</li>
</ul>
<h3>What is an ideal implementation?</h3>
<p>I really don&#8217;t know it clearly, but I think the most important point is to keep the world open. At the server side, any companies/communities/people can create and manage a subset of the world. We can call this role as land service provider, just as nowadays&#8217; page hosting service provider. A sub world may be a small planet, a shopping mall or other weird models.</p>
<p>At the client side, all developers can contribute to Virtual World Traveler, just as nowadays&#8217; browsers. Certainly, there will be many technology standard proposals born and vanish. But surely some will be the winners, just as nowadays&#8217; HTML and CSS.</p>
<p>The HTTP protocol is not good enough for the Virtual World, we need a new protocol, Virtual World Transfer Protocol (VWTP) is a good name, which will keep the connection state alive between the server and clients. The domain system still works, and the coordinate will be important part in URL, such as vwtp://example.com/(x,y). There will be many type of coordinates. The coordinates may have 2, 3 or 4 and more dimensions. </p>
<p>What is the corresponding concepts of HTML/CSS in the Virtual World, maybe they will be the triangle meshes and textures used in nowadays&#8217; 3D games, maybe they are others, hybrid model formats showing in one scene is not a bad idea. Renderer will be a important component in the Virtual World Traveler. Multiple renderers functioning at the same time will be very possible.</p>
<p>AI has not counterpart in nowdays&#8217; browsers.</p>
<p>There will be many creative application types in the Virtual World, such as virtual play fields, virtual theatre, etc.</p>
<p>The Virtual World even will affect the development of future operating systems.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tapirgames.com/2011/12/26/the-future-of-www-the-virtual-world-transfer-protocol-and-the-virtual-world-traveler/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The age of NoCompiler languages will come.</title>
		<link>http://blog.tapirgames.com/2011/12/04/the-age-of-nocompiler-languages-will-come/</link>
		<comments>http://blog.tapirgames.com/2011/12/04/the-age-of-nocompiler-languages-will-come/#comments</comments>
		<pubDate>Sun, 04 Dec 2011 22:14:51 +0000</pubDate>
		<dc:creator>Tapir</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[NoCompiler]]></category>

		<guid isPermaLink="false">http://blog.tapirgames.com/2011/12/04/the-age-of-nocompiler-languages-will-come/</guid>
		<description><![CDATA[The mobile age is coming, with a very fast pace. But most people today still think mobile devices will not replace PC completely. One reason may be programming is difficult on mobile devices. This is right, if we will always program by typing texts.
The &#8220;Text Typing -&#62; Compile -&#62; Link&#8221; model is so successful in [...]]]></description>
			<content:encoded><![CDATA[<p>The mobile age is coming, with a very fast pace. But most people today still think mobile devices will not replace PC completely. One reason may be programming is difficult on mobile devices. This is right, if we will always program by typing texts.</p>
<p>The &#8220;Text Typing -&gt; Compile -&gt; Link&#8221; model is so successful in the past decades so that other models fall into the shade. But with the coming of mobile age, the situation will change.</p>
<p>Text programming obviously is not a good model in mobile age. How about visual programming? Visual programming really has more natural advantages than text programming. They will surely get a larger market share on mobile devices than PC. But I don&#8217;t think traditional visual programmings will be the final winner on mobile devices. If it will, it has defeated text programming on PC already. The reasons why it didn&#8217;t win on PC are exact the reasons why it will not will win on mobile device.</p>
<p><em>(Here, I mean the narrow visual programming definition, for example, LabView. In a wider visual programming definition, using Adobe Flash CS even PhotoShop can also be viewed as visual programming. Artists are programmers, programmers are also artists. :))</em></p>
<p>What programming language model will win on mobile devices? I really don&#8217;t know. But I have a candidate solution, which is a combination of traits from both text programming and traditional visual programming. Finger Programming is a good name for it. But I would call it NoCompiler Programming or YouComiler Programming language. Yes, this type languages need NOT compiler. You, the programmer, is the compiler. When a program is coded done, it is already compiled. We just need a linker to create the final execute program or a no-compiler VM to run it.</p>
<p>It is hard for me to describe clearly how to use NoCompiler languages to program here. If you ever used Phyard Builder&#8217;s script editor, you know what I say above. Now the Piapia language, Phyard Builder&#8217;s script language, is still far to the perfect implementation of a good NoCompiler language. I will improve it continuously. In fact, the current implementation is much like the script editor of Flash MX Studio (I really don&#8217;t know what it is like in Flash CS), but there will be more and more differences.</p>
<p>If NoCompiler programming model, or another model for mobile age,  wins text programming, the PC age will be over.<br />
Another impact of NoCompiler languages is the current predicted future Cloud Compilers will become Cloud Linkers.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tapirgames.com/2011/12/04/the-age-of-nocompiler-languages-will-come/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>mobile internet age is coming, cloud app age is coming</title>
		<link>http://blog.tapirgames.com/2011/09/05/mobile-internet-age-is-coming-cloud-app-age-is-coming/</link>
		<comments>http://blog.tapirgames.com/2011/09/05/mobile-internet-age-is-coming-cloud-app-age-is-coming/#comments</comments>
		<pubDate>Mon, 05 Sep 2011 00:57:58 +0000</pubDate>
		<dc:creator>Tapir</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://blog.tapirgames.com/?p=169</guid>
		<description><![CDATA[what these mean for game 2.0?
need to think.
]]></description>
			<content:encoded><![CDATA[<p>what these mean for game 2.0?<br />
need to think.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tapirgames.com/2011/09/05/mobile-internet-age-is-coming-cloud-app-age-is-coming/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Load local image and get its pixels in actionscript</title>
		<link>http://blog.tapirgames.com/2011/09/05/load-local-image-and-get-its-pixels-in-actionscript/</link>
		<comments>http://blog.tapirgames.com/2011/09/05/load-local-image-and-get-its-pixels-in-actionscript/#comments</comments>
		<pubDate>Mon, 05 Sep 2011 00:32:26 +0000</pubDate>
		<dc:creator>Tapir</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[2148]]></category>
		<category><![CDATA[actionscript]]></category>
		<category><![CDATA[actionscript3]]></category>
		<category><![CDATA[load local image]]></category>

		<guid isPermaLink="false">http://blog.tapirgames.com/?p=157</guid>
		<description><![CDATA[After some researches, I found this problem only occurs for local swfs with url starts with &#8220;file:///&#8221;. So this article would be not useful for you if you run your swfs on the web.
Flash player 10 introduces FileReference, which makes load local files possible. But for unknown secure reason, you can only display a local [...]]]></description>
			<content:encoded><![CDATA[<p><b>After some researches, I found this problem only occurs for local swfs with url starts with &#8220;file:///&#8221;. So this article would be not useful for you if you run your swfs on the web.</b></p>
<p>Flash player 10 introduces FileReference, which makes load local files possible. But for unknown secure reason, you can only display a local image but can&#8217;t get the pixels of local images. When you try to cast the Loader.content to a Bitmap instance, a #2148 security error will be thrown. Here is a solution for how to <span>bypass this secure restriction.</span> This solution also works for loading any image file data embedded with ByteArray forms.</p>
<p>Firstly, a template.swf needs to be created for embedding:</p>
<pre>package
{
   import flash.display.Sprite;
   import flash.display.Bitmap;

   public class Template extends Sprite
   {
      [Embed(source="small.jpg")]
      public var BitmapClass:Class;

      public function GetBitmap ():Bitmap
      {
         return new BitmapClass ();
      }
   }
}</pre>
<p>Note there is a <strong>GetBitmap</strong> function in it. And you MUST embed a jpg file so that the solution supports 3 image formats: jpg, png and gif. If you are lazy to compile this file, here is one: <a href="http://blog.tapirgames.com/wp-content/uploads/2011/09/template.swf">template.swf</a></p>
<p>Now you can use the following LocalImageLoader class to replace the core Loader class.</p>
<pre>package com.tapirgames.util
{
   import flash.utils.ByteArray;
   import flash.utils.Endian;
   import flash.display.Loader;
   import flash.system.LoaderContext;
   import flash.events.Event;
   import flash.events.ProgressEvent;
   import flash.events.IOErrorEvent;
   import flash.events.SecurityErrorEvent;

   public class LocalImageLoader extends Loader
   {
   // template swf file

      [Embed(source="template.swf", mimeType="application/octet-stream")]
      private static var SwfFile:Class;

   // original data

      private var mOriginalData:ByteArray = null;
      private var mIsBadSwfFile:Boolean; // valid when mOriginalData != null

      private var mStartOffset_TagDefineBitsJPEG2:int;
      private var mEndOffset_TagDefineBitsJPEG2:int;
      private var mCharacterID_TagDefineBitsJPEG2:int;

   // load

      override public function loadBytes (imageFileData:ByteArray, context:LoaderContext = null):void
      {
         try
         {

         // parse

            if (mOriginalData == null)
            {
               var swfFile:ByteArray = new SwfFile ();
               swfFile.endian = Endian.LITTLE_ENDIAN;
               swfFile.position = 8;
               mOriginalData = new ByteArray ();
               mOriginalData.endian = Endian.LITTLE_ENDIAN;
               swfFile.readBytes (mOriginalData);
               mOriginalData.uncompress ();

               var numBits:int = (mOriginalData [0] &amp; 0xFF) &gt;&gt; 3;
               mOriginalData.position = (((numBits &lt;&lt; 2) + 5 + 7) &gt;&gt; 3) + 4;

               while (true)
               {
                  var startOffset:int = mOriginalData.position;
                  var tagTypeAndLength:int = mOriginalData.readUnsignedShort ();
                  var tagType:int = tagTypeAndLength &gt;&gt; 6;
                  if (tagType == 0) // end tag
                  {
                     mIsBadSwfFile = true;
                     break;
                  }

                  var tagLength:int = tagTypeAndLength &amp; 0x3f;
                  if (tagLength == 0x3f)
                  {
   	               tagLength = mOriginalData.readInt ();
                  }

                  var endOffset:int = mOriginalData.position + tagLength;

                  if (tagType == 21) // tag DefineBitsJPEG2
                  {
                     mCharacterID_TagDefineBitsJPEG2 = mOriginalData.readShort ();
                     mStartOffset_TagDefineBitsJPEG2 = startOffset;
                     mEndOffset_TagDefineBitsJPEG2 = endOffset;

                     mIsBadSwfFile = false;
                     break;
                  }

                  mOriginalData.position = endOffset;
               }
            }

            mOriginalData.position = 0;

            if (mIsBadSwfFile)
               throw new Error ("bad template swf file");

         // write

            var newData:ByteArray = new ByteArray ();
            newData.endian = Endian.LITTLE_ENDIAN;
            newData.writeBytes (mOriginalData, 0, mStartOffset_TagDefineBitsJPEG2);
            newData.writeShort ((21 &lt;&lt; 6) | 0x3f);
            newData.writeInt (2 + imageFileData.length); // 2 for CharacterID
            newData.writeShort (mCharacterID_TagDefineBitsJPEG2);
            if (imageFileData.length &gt; 0)
            {
               newData.writeBytes (imageFileData);
            }
            newData.writeBytes (mOriginalData, mEndOffset_TagDefineBitsJPEG2);
            var newFileLength:int = newData.length + 8;
            newData.compress ();

            var newSwfFile:ByteArray = new ByteArray ();
            newSwfFile.endian = Endian.LITTLE_ENDIAN;
            newSwfFile.writeByte (0x43);
            newSwfFile.writeByte (0x57);
            newSwfFile.writeByte (0x53);
            newSwfFile.writeByte (10);
            newSwfFile.writeUnsignedInt (newFileLength);
            newSwfFile.writeBytes (newData);
            newSwfFile.position = 0;
         }
         catch (error:Error)
         {
            dispatchEvent(new IOErrorEvent(IOErrorEvent.IO_ERROR, false, false, error.message));
         }

      // load, now, no secure errors. Why adobe makes some troubles for developers?

         super.loadBytes (newSwfFile, context);
      }
   }
}</pre>
<p>Here is the example on how to use it:</p>
<pre>public function LoadLocalImage  (imageFileData:ByteArray):void
{
   //var loader:Loader = new Loader(); // Don't use this
   var loader:LocalImageLoader = new LocalImageLoader ();
   loader.contentLoaderInfo.addEventListener (Event.COMPLETE, OnLoadLocalImageComplete);
   loader.loadBytes (imageFileData);
}

private function OnLoadLocalImageComplete (event:Event):void
{
   // var newBitmap:Bitmap = event.target.content as Bitmap; // Don't use this
   var newBitmap:Bitmap = ((event.target.content.GetBitmap as Function) ()) as Bitmap;
   mBitmap = new Bitmap (newBitmap.bitmapData); // done! no error #2148 will be thrown
}</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.tapirgames.com/2011/09/05/load-local-image-and-get-its-pixels-in-actionscript/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>actionscript 3 base64</title>
		<link>http://blog.tapirgames.com/2011/09/05/actionscript-3-base64/</link>
		<comments>http://blog.tapirgames.com/2011/09/05/actionscript-3-base64/#comments</comments>
		<pubDate>Mon, 05 Sep 2011 00:04:05 +0000</pubDate>
		<dc:creator>Tapir</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[actionscript]]></category>
		<category><![CDATA[actionscript3]]></category>
		<category><![CDATA[base64]]></category>

		<guid isPermaLink="false">http://blog.tapirgames.com/?p=152</guid>
		<description><![CDATA[Didn&#8217;t get satisfied actionscript base64 code snippet by google. So made one by self.

package
{
   public class Base64
   {
      public static const Base64Chars:String = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";

      private static var Base64Char2Index:Array = null;
      private static function GetBase64Char2IndexTable ():Array
  [...]]]></description>
			<content:encoded><![CDATA[<p>Didn&#8217;t get satisfied actionscript base64 code snippet by google. So made one by self.</p>
<pre>
package
{
   public class Base64
   {
      public static const Base64Chars:String = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";

      private static var Base64Char2Index:Array = null;
      private static function GetBase64Char2IndexTable ():Array
      {
         if (Base64Char2Index == null)
         {
            Base64Char2Index = new Array (128); // all char codes in Base64Chars are smaller than 128

            for (var i_char:int = Base64Chars.length - 2; i_char >= 0; -- i_char) // "Base64Chars.length - 2" is to ignore the "=" cahr
            {
               Base64Char2Index [Base64Chars.charCodeAt (i_char)] = i_char;
            }
         }

         return Base64Char2Index;
      }

      public static function DecodeString2ByteArray (text:String):ByteArray
      {
         if (text == null)
         {
            return null;
         }

         var num_chars:int = text.length;
         var num_triples:int = num_chars / 4;
         var num_extras:int = num_chars - num_triples * 4;

         if (num_extras != 0)
         {
            return null;
         }

         var data:ByteArray = new ByteArray ();

         var b0:int, b1:int, b2:int, b3:int;

         var table_char2index:Array = GetBase64Char2IndexTable ();
         var i_char:int = 0;
         data.position = 0;

         while (i_char < num_chars)
         {
            b0 = table_char2index [text.charCodeAt (i_char ++)];
            b1 = table_char2index [text.charCodeAt (i_char ++)];
            b2 = table_char2index [text.charCodeAt (i_char ++)];
            b3 = table_char2index [text.charCodeAt (i_char ++)];

            data.writeByte ((b0 << 2) | ((b1 &#038; 0x30) >> 4));
            data.writeByte (((b1 &#038; 0x0f) << 4) | ((b2 &#038; 0x3c) >> 2));
            data.writeByte (((b2 &#038; 0x03) << 6) | b3);
         }

         data.position = 0;
         return data;
      }

      public static function EncodeByteArray2String(data:ByteArray):String
      {
         if (data == null)
         {
            return null;
         }

         var num_triples:int = data.length / 3;
         var num_extras:int = data.length - num_triples * 3;

         var num_chars:int = (num_extras > 0 ? num_triples + 1 : num_triples) * 4;
         var char_indexes:ByteArray = new ByteArray ();
         char_indexes.length = num_chars;

         var b0:int, b1:int, b2:int;

         data.position = 0;
         char_indexes.length = 0;

         for (var i_triple:int = 0; i_triple < num_triples; ++ i_triple)
         {
            b0 = data.readByte () &#038; 0xFF; // "&#038; 0xFF" is essential for negative values
            b1 = data.readByte () &#038; 0xFF;
            b2 = data.readByte () &#038; 0xFF;

            char_indexes.writeByte ((b0 &#038; 0xFC) >> 2);
            char_indexes.writeByte (((b0 &#038; 0x03) << 4) | (b1 >> 4));
            char_indexes.writeByte (((b1 &#038; 0x0F) << 2) | (b2 >> 6));
            char_indexes.writeByte (b2 &#038; 0x3F);
         }

         if (num_extras > 0)
         {
            b0 = data.readByte () &#038; 0xFF; // "&#038; 0xFF" is essential for negative values

            if (num_extras == 2)
            {
               b1 = data.readByte () &#038; 0xFF; // "&#038; 0xFF" is essential for negative values

               char_indexes.writeByte ((b0 &#038; 0xFC) >> 2);
               char_indexes.writeByte (((b0 &#038; 0x03) << 4) | (b1 >> 4));
               char_indexes.writeByte ((b1 &#038; 0x0F) << 2);
               char_indexes.writeByte (64); // "="
            }
            else // num_extras == 1
            {
               char_indexes.writeByte ((b0 &#038; 0xFC) >> 2);
               char_indexes.writeByte ((b0 &#038; 0x03) << 4);
               char_indexes.writeByte (64); // "="
               char_indexes.writeByte (64); // "="
            }
         }

         var char_index:int;

         for (var i_char:int = 0; i_char < num_chars; ++ i_char)
         {
            char_index = char_indexes [i_char];
            char_indexes [i_char] = Base64Chars.charCodeAt(char_index);
         }

         char_indexes.position = 0;
         return char_indexes.readUTFBytes (num_chars);
      }
   }
}</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.tapirgames.com/2011/09/05/actionscript-3-base64/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Color Infection 3</title>
		<link>http://blog.tapirgames.com/2011/08/15/color-infection-3/</link>
		<comments>http://blog.tapirgames.com/2011/08/15/color-infection-3/#comments</comments>
		<pubDate>Mon, 15 Aug 2011 02:16:57 +0000</pubDate>
		<dc:creator>Tapir</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://blog.tapirgames.com/?p=135</guid>
		<description><![CDATA[Color Infection 3 is released about one month ago. I just realized I haven&#8217;t write a blog post for it. If you haven&#8217;t played it. Here is a pertinent review for it: http://www.fettspielen.de/blog/online-game-test-color-infection-3/. Thanks Niklas for making this review.
This new sequel removed almost all timing factors in levels.
New elements in this sequel: spring, bomb, water [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://tapirgames.com/Games/ColorInfection3">Color Infection 3</a> is released about one month ago. I just realized I haven&#8217;t write a blog post for it. If you haven&#8217;t played it. Here is a pertinent review for it: <a href="http://www.fettspielen.de/blog/online-game-test-color-infection-3/">http://www.fettspielen.de/blog/online-game-test-color-infection-3/</a>. Thanks Niklas for making this review.</p>
<p>This new sequel removed almost all timing factors in levels.<br />
New elements in this sequel: spring, bomb, water and friction.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tapirgames.com/2011/08/15/color-infection-3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Color Infection 2</title>
		<link>http://blog.tapirgames.com/2008/11/05/color-infection-2/</link>
		<comments>http://blog.tapirgames.com/2008/11/05/color-infection-2/#comments</comments>
		<pubDate>Wed, 05 Nov 2008 07:18:07 +0000</pubDate>
		<dc:creator>Tapir</dc:creator>
				<category><![CDATA[Dev Log]]></category>

		<guid isPermaLink="false">http://blog.tapirgames.com/?p=95</guid>
		<description><![CDATA[All level designs are done. The sequel is much more challenging than the first one. But it will be released after the online level editor is finished. So please wait. If everything is ok, it should be released in a month.
(Update: The release of Color Infection 2 will be delayed. I will try my best [...]]]></description>
			<content:encoded><![CDATA[<p>All level designs are done. The sequel is much more challenging than the first one. But it will be released after the online level editor is finished. So please wait. <span style="text-decoration: line-through;">If everything is ok, it should be released in a month</span>.</p>
<p>(<em><strong>Update</strong></em>: The release of Color Infection 2 will be delayed. I will try my best make it out before Christmas. In fact, the editor almost done, but I want to make the editor more powerful. )</p>
<p>It is released. <strong><a href="http://www.tapirgames.com/Games/ColorInfection2">Hope you enjoy it</a></strong>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tapirgames.com/2008/11/05/color-infection-2/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>The Mystery of Math Solitaire</title>
		<link>http://blog.tapirgames.com/2008/11/05/the-mystery-of-math-solitaire/</link>
		<comments>http://blog.tapirgames.com/2008/11/05/the-mystery-of-math-solitaire/#comments</comments>
		<pubDate>Wed, 05 Nov 2008 07:07:09 +0000</pubDate>
		<dc:creator>Tapir</dc:creator>
				<category><![CDATA[Game Design]]></category>
		<category><![CDATA[Math Solitaire]]></category>

		<guid isPermaLink="false">http://blog.tapirgames.com/?p=90</guid>
		<description><![CDATA[Long long ago, I learned a solitaire game:

first remove the Jokers from the 54 cards,
then you will be given 4 solitaire cards randomly in the remaining 52 cards.
your goal is to get 24 by operating the 4 cards with addition, subtraction, multiplication, division. Each cards must be used once and only once.

For example, give you [...]]]></description>
			<content:encoded><![CDATA[<p>Long long ago, I learned a solitaire game:</p>
<ol>
<li>first remove the Jokers from the 54 cards,</li>
<li>then you will be given 4 solitaire cards randomly in the remaining 52 cards.</li>
<li>your goal is to get 24 by operating the 4 cards with addition, subtraction, multiplication, division. <strong>Each cards must be used once and only once</strong>.</li>
</ol>
<p>For example, give you 4 cards: 1, 3, 9, 7, you can get 24 from (1 + 7) × (9 ÷ 3). There are exactly some cases without solutions, for example: 5, 5, 7, 9. But the success rate is very high. In all 1820 cases, there are only 474 cases without solutions (<em>here fraction is not supported</em>). This means about 74% of all cases are solvable.</p>
<p>One week ago, I decided to implement this game with flash. When it is almost done, an idea arised suddenly: how about change the rule to &#8220;<strong>give you 5 cards randomly, then your goal is to get the value of one card by operating the the other 4 cards with addition, subtraction, multiplication and division, each of the other 4 cards must be used once and only once</strong>&#8220;. Then I try it. Surprisingly, the success rate is even higher than the old one. In all 6188 cases, only 860 cases have no solutions, which means about 86% of all cases are solvable (solvable turns, see definitions below). Now I have decided to adopt the new rule for this game (named Math Solitaire).</p>
<p>Below, we name <strong>Case</strong> as <strong>Turn</strong>. A turn is represented as <em>(a, b, c, d, e)</em>. For each turn there are 5 <strong>puzzle</strong>s: <em>(a, b, c, d)=&gt;e, (a, b, c, e)=&gt;d</em>,  <em>(a, b, e, d)=&gt;c,</em> <em> (a, e, c, e)=&gt;b</em> and <em>(e, b, c, e)=&gt;a</em>.</p>
<p>Above statistics is get under 2 more minor rules:</p>
<ul>
<li>It is valid if the 5 numbers in a turn are a same value. In reality, with only one solitaire set, this is impossible.</li>
<li>The intermediate results must not be a fraction, for example, (1/3 + 3) × 3 = 10 is not a valid solution for <em>(3, 3, 3, 1) =&gt;10</em>.</li>
</ul>
<p>Generally, if one of the 5 puzzles in a turn is solvable, then others are also solvable. But sometimes, it is not true. For example, <em> (13, 13, 2, 10) =&gt; 2</em> has solutions, but (<em>13, 13, 2, 2) =&gt; 10</em> has no solutions <a href="http://www.math.utah.edu/~pa/math/0by0.html">if 0 divide 0 is not valid or not defined</a>. We call a turn as <strong>Solvable Turn</strong> once one puzzle in the turn is solvable. We call a turn as <strong>Good Solvable Turn</strong> if all the 5 puzzles in the turn are solvable. We call a solvable turn as <strong>Bad Solvable Turn</strong> if one puzzle in the turn is unsolvable. We call a turn as <strong>Simple Turn</strong> if the turn can be  represented as <em>(a, a, c, c, e)</em>, in other words, b=a, d=c. A simple turn at least has one solution (a &#8211; a) × e + c = c for puzzle <em>(a, a, c, e)=&gt;c</em>.  So a simple turn is absolutely a solvable turn. A bad solvable turn must be a simple turn. But a simple turn is not always a bad solvable turn. If a simple turn is not a bad solvable turn, then it must be a good solvable turn.</p>
<p>As mentioned above, there are 6188 turns and 5328 solvable turns. Among these solvable turns, there are 392 bad solvable turns, 1183 simple turns, 4936 good solvable turns.</p>
<p>Only good solvable turns are packed In this game.</p>
<p>Some variations for this game:</p>
<ul>
<li> support extraction and power operations.</li>
<li> support fraction as the intermediate results, for example, (1 / 3 + 3) × 3 = 10.</li>
<li> the operands must be less than 10 (Jacks, Queens and Kings are also removed).</li>
<li> set the result value as a specified number (4 randoms + 24 is one case of this variation).</li>
</ul>
<p>The game will be released in this month.</p>
<p>Not only can this game be played online, but also can be played with friends in a party or in camping.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tapirgames.com/2008/11/05/the-mystery-of-math-solitaire/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Faq about Color Infection</title>
		<link>http://blog.tapirgames.com/2008/09/13/faq-about-color-infection/</link>
		<comments>http://blog.tapirgames.com/2008/09/13/faq-about-color-infection/#comments</comments>
		<pubDate>Sat, 13 Sep 2008 18:01:59 +0000</pubDate>
		<dc:creator>Tapir</dc:creator>
				<category><![CDATA[Dev Log]]></category>

		<guid isPermaLink="false">http://blog.tapirgames.com/?p=67</guid>
		<description><![CDATA[Q: Did you use Box2d?
A: Yes.  I use the actionscript 3 port. Box2d physics engine is very cool!
Q: Do u use phun to do this?
A: No. I use my in-house editor. But the editor is much like phun. The editor is very not mature now. I will open source it later when it is a [...]]]></description>
			<content:encoded><![CDATA[<p>Q: <strong>Did you use <a href="http://box2d.org/">Box2d</a>?</strong></p>
<p>A: Yes.  I use the <a href="http://box2dflash.sourceforge.net/">actionscript 3 port</a>. Box2d physics engine is very cool!</p>
<p>Q: <strong>Do u use <a href="http://www.phunland.com">phun</a> to do this?</strong></p>
<p>A: No. I use my in-house editor. But the editor is much like <a href="http://www.phunland.com">phun</a>. The editor is very not mature now. I will open source it later when it is a bit mature. BTW, I learned many from <a href="http://www.phunbox.net/">phunbox</a>.</p>
<p>Q. <strong>Game&#8217;s well made enough, but way too slow. </strong></p>
<p>A: Now the time scale element has been intrduced. You can press 0-9 to set time scale factor as the corresponding number. You can also press ~ or / in numpad to set the time scale factor as 0.5. Time scale with value of 0.5 means slow motion. Value 0 means pause the simulation. Value larger than 1 means fast lens</p>
<p>Q: <strong>Why only one level has green ball?</strong></p>
<p>A: In later series, there will be more green ball levels. In the first version, I just make this design element claimed.</p>
<p>Q: <strong>Major flaw: the balls do not bounce. How do you have games that claim to be physics but the balls do not bounce? at all?</strong></p>
<p>A: Most of them are steel balls. Only a few elastic balls in the game. And yes, sorry for the poor gfx representing. Now all balls looks the same. :(</p>
<p>Q: <strong>Its not loading for me.</strong></p>
<p>A: Sorry. I really don&#8217;t know what is the cause. But it seems most people haven&#8217;t encountered this problem. Maybe you should update your flash player.</p>
<p>Q: <strong>Will you add a lvl creator?</strong></p>
<p>A: Yes.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tapirgames.com/2008/09/13/faq-about-color-infection/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Color Infection is listed on frontpage of kongregate</title>
		<link>http://blog.tapirgames.com/2008/09/13/color-infection-is-listed-on-frontpage-of-kongregate/</link>
		<comments>http://blog.tapirgames.com/2008/09/13/color-infection-is-listed-on-frontpage-of-kongregate/#comments</comments>
		<pubDate>Sat, 13 Sep 2008 18:01:53 +0000</pubDate>
		<dc:creator>Tapir</dc:creator>
				<category><![CDATA[Dev Log]]></category>

		<guid isPermaLink="false">http://blog.tapirgames.com/?p=64</guid>
		<description><![CDATA[It is some surprised. Never except my current games can be listed on frontpage of kongregate. Now the gfx and sfx of my games are very poor.

Very thanks, kong.
]]></description>
			<content:encoded><![CDATA[<p>It is some surprised. Never except my current games can be listed on frontpage of kongregate. Now the gfx and sfx of my games are very poor.</p>
<p><a href="http://blog.tapirgames.com/wp-content/uploads/2008/09/color_infection_on_kong_front_page-sep-13.jpg"><img class="size-full wp-image-66" title="color_infection_on_kong_front_page-sep-13" src="http://blog.tapirgames.com/wp-content/uploads/2008/09/color_infection_on_kong_front_page-sep-13.jpg" alt="Color Infection on Kongregate Front Page" width="606" height="444" /></a></p>
<p>Very thanks, <a href="http://www.kongregate.com/games/tapir/color-infection">kong</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tapirgames.com/2008/09/13/color-infection-is-listed-on-frontpage-of-kongregate/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Color Infection</title>
		<link>http://blog.tapirgames.com/2008/09/09/color-infection/</link>
		<comments>http://blog.tapirgames.com/2008/09/09/color-infection/#comments</comments>
		<pubDate>Tue, 09 Sep 2008 17:44:21 +0000</pubDate>
		<dc:creator>Tapir</dc:creator>
				<category><![CDATA[Games]]></category>
		<category><![CDATA[Color Infection]]></category>
		<category><![CDATA[physics]]></category>
		<category><![CDATA[puzzle]]></category>

		<guid isPermaLink="false">http://blog.tapirgames.com/?p=34</guid>
		<description><![CDATA[Color Infection is physics puzzle game. The game is based on the same framework of pDecathlon. Like pDecathlon, the goal of the game is to infect all yellow balls with brown color by colliding them with brown balls. But there is one more rule, keep green balls from being infected. Not like pDecathlon, the game [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.tapirgames.com/Games/ColorInfection"><em><strong>Color Infection</strong></em></a> is physics puzzle game. The game is based on the same framework of <a href="http://www.tapirgames.com/Games/PDecathlon"><em>pDecathlon</em></a>. Like <em>pDecathlon</em>, the goal of the game is to infect all yellow balls with brown color by colliding them with brown balls. But there is one more rule, keep green balls from being infected. Not like <em>pDecathlon</em>, the game focuses on puzzle solving. Although the puzzles in most levels are very easy, there are exactly some levels need hard thinking.</p>
<p style="text-align: center;"><span style="text-decoration: underline;"><strong><a href="http://www.tapirgames.com/Games/ColorInfection">Play Color Infection</a></strong></span></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tapirgames.com/2008/09/09/color-infection/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>pDecathlon</title>
		<link>http://blog.tapirgames.com/2008/09/09/pdecathlon/</link>
		<comments>http://blog.tapirgames.com/2008/09/09/pdecathlon/#comments</comments>
		<pubDate>Tue, 09 Sep 2008 17:23:21 +0000</pubDate>
		<dc:creator>Tapir</dc:creator>
				<category><![CDATA[Games]]></category>
		<category><![CDATA[hardest]]></category>
		<category><![CDATA[pDecathlon]]></category>
		<category><![CDATA[physics]]></category>

		<guid isPermaLink="false">http://blog.tapirgames.com/?p=23</guid>
		<description><![CDATA[pDecthlon is a physics skill game. There are 10 game modes in it. Each mode is assigned an athletic event name (although some namings are not very relevant). The goal of the game is to infect all yellow balls with brown color by colliding them with brown balls. There are some puzzle elements in the [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.tapirgames.com/Games/PDecathlon"><em><strong>pDecthlon</strong></em></a> is a physics skill game. There are 10 game modes in it. Each mode is assigned an athletic event name (although some namings are not very relevant). The goal of the game is to infect all yellow balls with brown color by colliding them with brown balls. There are some puzzle elements in the game, but the puzzles are very simple and easy.</p>
<p>The difficulties (skill not puzzle) become harder and harder with levels going forward. The latter levels are almost impossible missions. You need luck to finish them.</p>
<p>The game is based on <a href="http://box2d.org/" target="_blank">Box2d physics engine</a> (<a href="http://box2dflash.sourceforge.net/" target="_blank">as3 port</a>).</p>
<p style="text-align: center;"><strong><span style="text-decoration: underline;"><a href="http://www.tapirgames.com/Games/PDecathlon">Play pDecthlon</a></span></strong></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tapirgames.com/2008/09/09/pdecathlon/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Gravity Flip</title>
		<link>http://blog.tapirgames.com/2008/09/09/gravity-flip/</link>
		<comments>http://blog.tapirgames.com/2008/09/09/gravity-flip/#comments</comments>
		<pubDate>Tue, 09 Sep 2008 16:47:12 +0000</pubDate>
		<dc:creator>Tapir</dc:creator>
				<category><![CDATA[Games]]></category>
		<category><![CDATA[Gravity Flip]]></category>
		<category><![CDATA[puzzle]]></category>

		<guid isPermaLink="false">http://blog.tapirgames.com/?p=13</guid>
		<description><![CDATA[Gravity Flip is a by-product of Teleporter Twins. The game control is same as Teleporter Twins. Instead of the function of teleporters, gravity controller is introduced. From level 3, the direction of the gravity can be flipped by pressing the S key or DOWN arrow key. This makes some impossible missions can be finished now.
Because [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.tapirgames.com/Games/GravityFlip"><em><strong>Gravity Flip</strong></em></a> is a by-product of <a href="http://www.tapirgames.com/Games/TeleporterTwins"><em>Teleporter Twins</em></a>. The game control is same as <em>Teleporter Twins</em>. Instead of the function of teleporters, gravity controller is introduced. From level 3, the direction of the gravity can be flipped by pressing the S key or DOWN arrow key. This makes some impossible missions can be finished now.</p>
<p>Because this is not a formal game. There are only 13 levels. Please <strong><span style="text-decoration: underline;"><a href="http://www.tapirgames.com/Games/GravityFlip">enjoy it</a></span></strong>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tapirgames.com/2008/09/09/gravity-flip/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Teleporter Twins</title>
		<link>http://blog.tapirgames.com/2008/09/09/teleporter-twins/</link>
		<comments>http://blog.tapirgames.com/2008/09/09/teleporter-twins/#comments</comments>
		<pubDate>Tue, 09 Sep 2008 16:31:43 +0000</pubDate>
		<dc:creator>Tapir</dc:creator>
				<category><![CDATA[Games]]></category>
		<category><![CDATA[puzzle]]></category>
		<category><![CDATA[Teleporter Twins]]></category>

		<guid isPermaLink="false">http://blog.tapirgames.com/?p=7</guid>
		<description><![CDATA[Teleporter Twins is the first official game developed by TapirGames. It is a puzzle game. The mechanism of the game is very simple. A teleporter twins pair can transport boxes from the back of one of the twins to the front of the other. With this special ability, teleporter twins pairs can finish many impossible [...]]]></description>
			<content:encoded><![CDATA[<p><strong><a href="http://www.tapirgames.com/Games/TeleporterTwins"><em>Teleporter Twins</em></a> </strong>is the first official game developed by TapirGames. It is a puzzle game. The mechanism of the game is very simple. A teleporter twins pair can transport boxes from the back of one of the twins to the front of the other. With this special ability, teleporter twins pairs can finish many impossible tasks. This is also the reason for why the original name of the game is called <a href="http://www.kongregate.com/games/tapir/box-heroes-telporter" target="_blank"><em><strong>Box Heros &#8211; Telporter</strong></em></a>.</p>
<p>To play the game, use mouse to select the target box, then use AD keys or LEFT-RIGHT arrow keys to roll the target box. The target box can also be rolled by left-clicking (then either hold the mouse or not) an area without be occupied by boxes in the game field.</p>
<p>Now there are some <a href="http://www.youtube.com/results?search_query=&quot;teleporter+twins&quot;" target="_blank">level solutions on youtube</a>. But please notice, the design of some levels have been modified since the solution videos were uploaded.</p>
<p style="text-align: center;"><span style="text-decoration: underline;"><strong><a href="http://www.tapirgames.com/Games/TeleporterTwins">Play Teleporter Twins</a></strong></span></p>
<p><em><strong>Warning</strong></em>: <em>Some levels are very hard. To finish the game, IQ must be higher than average level</em>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tapirgames.com/2008/09/09/teleporter-twins/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Hello world!</title>
		<link>http://blog.tapirgames.com/2008/07/13/hello-world/</link>
		<comments>http://blog.tapirgames.com/2008/07/13/hello-world/#comments</comments>
		<pubDate>Sun, 13 Jul 2008 13:20:32 +0000</pubDate>
		<dc:creator>Tapir</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[tapirgames]]></category>
		<category><![CDATA[welcome]]></category>

		<guid isPermaLink="false">http://blog.tapirgames.com/?p=1</guid>
		<description><![CDATA[Welcome to TapirGames. TapirGames is a game studio dedicated to making fun online games.
]]></description>
			<content:encoded><![CDATA[<p>Welcome to TapirGames. TapirGames is a game studio dedicated to making fun online games.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tapirgames.com/2008/07/13/hello-world/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

