<?xml version='1.0' encoding='UTF-8'?><rss xmlns:atom='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' version='2.0'><channel><atom:id>tag:blogger.com,1999:blog-2096306182498867614</atom:id><lastBuildDate>Sat, 20 Feb 2010 12:59:13 +0000</lastBuildDate><title>Boardgame Development</title><description></description><link>http://www.mindthemove.com/blog/</link><managingEditor>noreply@blogger.com (Ema)</managingEditor><generator>Blogger</generator><openSearch:totalResults>12</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-2096306182498867614.post-2289521077310354404</guid><pubDate>Sun, 03 Jan 2010 13:17:00 +0000</pubDate><atom:updated>2010-01-14T00:53:31.359-08:00</atom:updated><title>Come2Play multiplayer API</title><description>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.mindthemove.com/blog/uploaded_images/image1-760869.jpg"&gt;&lt;br /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.come2play.com/images/come2play_logo2.gif"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 439px; height: 47px;" src="http://www.come2play.com/images/come2play_logo2.gif" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;After the development of my first two games &lt;a href="http://www.mindthemove.com/portal/mtm/playonline"&gt;Tokyo Train and Haunted house&lt;/a&gt; I am interested in development of a multiplayer game. For this reason I started to study the Come2Play API.  &lt;p class="MsoNormal" style="text-align: auto;margin-bottom: 0.0001pt; "&gt;Links to the project: &lt;a href="http://www.come2play.com/developer.asp"&gt;http://www.come2play.com/developer.asp&lt;/a&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;The goal of the tutorial is to show how to build a Tic Tac Toe game using these API.&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;The project can be downloaded from &lt;a href="http://www.mindthemove.com/blog/projects/TicTacToeC2P.zip"&gt;www.mindthemove.com/blog/projects/TicTacToeC2P.zip&lt;/a&gt; &lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;These API are basically used to have a communication between one or more clients (in Flash AS3) and the Come2Play server to allow a multiplayer game.&lt;/p&gt;&lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;There are 2 type of functions: operations and callbacks.&lt;/p&gt;&lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.mindthemove.com/blog/uploaded_images/image2-704580.jpg"&gt;&lt;img src="http://www.mindthemove.com/blog/uploaded_images/image2-704576.jpg" border="0" alt="" style="float: left; margin-top: 0px; margin-right: 10px; margin-bottom: 10px; margin-left: 0px; cursor: pointer; width: 320px; height: 127px; " /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;I am going to use two classes.&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-top:0in;margin-right:0in;margin-bottom:0in; margin-left:.5in;margin-bottom:.0001pt;text-indent:-.25in;mso-list:l0 level1 lfo1"&gt;&lt;span style="mso-bidi-;font-family:Calibri;"&gt;&lt;span style="mso-list:Ignore"&gt;-&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;          &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;MainTTTC2P that extends ClientGameAPI. This is the main class the acts as controller&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-top:0in;margin-right:0in;margin-bottom:0in; margin-left:.5in;margin-bottom:.0001pt;text-indent:-.25in;mso-list:l0 level1 lfo1"&gt;&lt;span style="mso-bidi-;font-family:Calibri;"&gt;&lt;span style="mso-list:Ignore"&gt;-&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;          &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;TTTC2PViewer that is the viewer class. In some way, because the game is simple and it is for tutorial purpose, this will work as model as well.&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;I am not using an event driven approach as in the tutorials from come2play project because I found this confusing the main focus that is to learn how to use the basic API by come2play.&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;For any reference to the API this is the link: &lt;/span&gt;&lt;span class="Apple-style-span"  style="  border-collapse: collapse; font-family:arial, sans-serif;"&gt;&lt;a href="http://come2play.com/API_inner.asp?f=1&amp;amp;newsid=357" target="_blank" style="color: rgb(92, 69, 32); "&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;http://come2play.com/API_&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;wbr&gt;inner.asp?f=1&amp;amp;newsid=357&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;Let’s start from MainTTTC2P class.&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;This class is created in the first frame of the FLA file:&lt;/p&gt;&lt;br /&gt;&lt;table class="MsoNormalTable" border="1" cellspacing="0" cellpadding="0" style="border-collapse:collapse;border:none;mso-border-alt:solid black .5pt;  mso-yfti-tbllook:1184;mso-padding-alt:0in 5.4pt 0in 5.4pt;mso-border-insideh:  .5pt solid black;mso-border-insidev:.5pt solid black"&gt;  &lt;tbody&gt;&lt;tr style="mso-yfti-irow:0;mso-yfti-firstrow:yes;mso-yfti-lastrow:yes"&gt;   &lt;td width="638" valign="top" style="width:6.65in;border:solid black 1.0pt;   mso-border-alt:solid black .5pt;padding:0in 5.4pt 0in 5.4pt"&gt;   &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;var   game:MainTTTC2P = new MainTTTC2P(this)&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 238); -webkit-text-decorations-in-effect: underline; "&gt;&lt;img src="http://www.mindthemove.com/blog/uploaded_images/image3-727706.jpg" border="0" alt="" style="float: left; margin-top: 0px; margin-right: 10px; margin-bottom: 10px; margin-left: 0px; cursor: pointer; width: 320px; height: 269px; " /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;The class is declared as:&lt;/p&gt;  &lt;table class="MsoNormalTable" border="1" cellspacing="0" cellpadding="0" style="border-collapse:collapse;border:none;mso-border-alt:solid black .5pt;  mso-yfti-tbllook:1184;mso-padding-alt:0in 5.4pt 0in 5.4pt;mso-border-insideh:  .5pt solid black;mso-border-insidev:.5pt solid black"&gt;  &lt;tbody&gt;&lt;tr style="mso-yfti-irow:0;mso-yfti-firstrow:yes;mso-yfti-lastrow:yes"&gt;   &lt;td width="638" valign="top" style="width:6.65in;border:solid black 1.0pt;   mso-border-alt:solid black .5pt;padding:0in 5.4pt 0in 5.4pt"&gt;   &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;public   class MainTTTC2P extends &lt;b style="mso-bidi-font-weight:normal"&gt;&lt;span style="color:#548DD4;"&gt;ClientGameAPI&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;In the constructor I am going to get the calling movieclip and calling the super constructor (the constructor of the basic class ClientGameAPI.&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;Moreover I pass this movieclip to my viewer class that is created here.&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;The call to doRegisterOnServer is the way for the client to enter the lobby for this game. The call to this function should be done using AS3_vs_AS2.waitForStage function.&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;table class="MsoNormalTable" border="1" cellspacing="0" cellpadding="0" style="border-collapse:collapse;border:none;mso-border-alt:solid black .5pt;  mso-yfti-tbllook:1184;mso-padding-alt:0in 5.4pt 0in 5.4pt;mso-border-insideh:  .5pt solid black;mso-border-insidev:.5pt solid black"&gt;  &lt;tbody&gt;&lt;tr style="mso-yfti-irow:0;mso-yfti-firstrow:yes;mso-yfti-lastrow:yes"&gt;   &lt;td width="638" valign="top" style="width:6.65in;border:solid black 1.0pt;   mso-border-alt:solid black .5pt;padding:0in 5.4pt 0in 5.4pt"&gt;   &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;public   function MainTTTC2P(stageMovieClip:MovieClip)&lt;/p&gt;   &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;{&lt;/p&gt;   &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;span style="mso-tab-count:1"&gt;                &lt;/span&gt;super(stageMovieClip);&lt;/p&gt;   &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;span style="mso-tab-count:1"&gt;                &lt;/span&gt;theViewer = new TTTC2PViewer   (stageMovieClip);&lt;span style="mso-tab-count:1"&gt;         &lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;span style="mso-tab-count:1"&gt;                &lt;/span&gt;keyMove= 0;&lt;/p&gt;&lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;span class="Apple-style-span" style="color: rgb(84, 141, 212); font-weight: bold; "&gt;AS3_vs_As2.waitForStage&lt;/span&gt;(this,constructGame);&lt;/p&gt;   &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;span style="mso-tab-count:1"&gt;                &lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;}//   constructor&lt;/p&gt;&lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; "&gt;private function constructGame(){&lt;/p&gt;&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; "&gt;&lt;span class="Apple-style-span"  style="color:#548DD4;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 0); font-weight: normal; "&gt;&lt;b&gt;&lt;span style="color:#548DD4;"&gt;doRegisterOnServer&lt;/span&gt;&lt;/b&gt;();//registers your game on the server&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; "&gt;}&lt;/p&gt;&lt;p&gt;&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;The first callback function that is called is gotCustomInfo. You need to remember that the callback functions inherited by the basic class ClientGameAPI must be declared as “override”.&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;table class="MsoNormalTable" border="1" cellspacing="0" cellpadding="0" style="border-collapse:collapse;border:none;mso-border-alt:solid black .5pt;  mso-yfti-tbllook:1184;mso-padding-alt:0in 5.4pt 0in 5.4pt;mso-border-insideh:  .5pt solid black;mso-border-insidev:.5pt solid black"&gt;  &lt;tbody&gt;&lt;tr style="mso-yfti-irow:0;mso-yfti-firstrow:yes;mso-yfti-lastrow:yes"&gt;   &lt;td width="638" valign="top" style="width:6.65in;border:solid black 1.0pt;   mso-border-alt:solid black .5pt;padding:0in 5.4pt 0in 5.4pt"&gt;   &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;override   public function &lt;b style="mso-bidi-font-weight:normal"&gt;&lt;span style="color:#548DD4;"&gt;gotCustomInfo&lt;/span&gt;&lt;/b&gt; (infoEntries:Array):void&lt;/p&gt;   &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;{&lt;/p&gt;   &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;span style="mso-tab-count:1"&gt;                &lt;/span&gt;this.myUserId =   T.custom(CUSTOM_INFO_KEY_myUserId,null) as int;&lt;span style="mso-tab-count:   1"&gt;   &lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;}&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;On this function you get back some custom information. Calling the helper class T you can get some information back from the server. One simple example is to use the constant string “CUSTOM_INFO_KEY_myUserId” to get your user id. Because this is a important information it’s useful to get this stored.&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;Remember that each player will receive from the server a unique id to be identified. It’s critical for the client flash game to know the user id. In some how this is telling the program who is it.&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;The second callback function the client will receive is gotMatchStarted. This is triggered as soon as the game is started.&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;In this function the most important information is the list of the user ids for all the players. Again this is critical to know so this is stored in an internal variable.&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;I found useful as well store immediately where in this array the client is. This is done using the already stored information about my id.&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;Let’s have an example. If myUserId =41 and the array received is allPlayerIds=[41,42], this client has index 0 in the array while my opponent will have index 1. Therefore myUserIndex=0; This is another way to know who the client is, in terms of index in the array of all players.&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;This is the time where to start the new board using theViewer.startNewGame. The viewer class should also know what is myUserIndex, therefore I am going to store this on that class.&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;table class="MsoNormalTable" border="1" cellspacing="0" cellpadding="0" style="border-collapse:collapse;border:none;mso-border-alt:solid black .5pt;  mso-yfti-tbllook:1184;mso-padding-alt:0in 5.4pt 0in 5.4pt;mso-border-insideh:  .5pt solid black;mso-border-insidev:.5pt solid black"&gt;  &lt;tbody&gt;&lt;tr style="mso-yfti-irow:0;mso-yfti-firstrow:yes;mso-yfti-lastrow:yes"&gt;   &lt;td width="638" valign="top" style="width:6.65in;border:solid black 1.0pt;   mso-border-alt:solid black .5pt;padding:0in 5.4pt 0in 5.4pt"&gt;   &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;override   public function &lt;b style="mso-bidi-font-weight:normal"&gt;&lt;span style="color:#548DD4;"&gt;gotMatchStarted&lt;/span&gt;&lt;/b&gt; (allPlayerIds:Array/*int*/,   finishedPlayerIds:Array/*int*/, serverEntries:Array/*ServerEntry*/):void&lt;/p&gt;   &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;{&lt;/p&gt;   &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;span style="mso-tab-count:1"&gt;                &lt;/span&gt;this.allPlayerIds =   allPlayerIds;&lt;/p&gt;   &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;span style="mso-tab-count:1"&gt;                &lt;/span&gt;this.myUserIndex =   allPlayerIds.indexOf(myUserId);&lt;/p&gt;   &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;span style="mso-tab-count:1"&gt;                &lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;span style="mso-tab-count:1"&gt;                &lt;/span&gt;theViewer.startNewGame(this.myUserIndex);&lt;/p&gt;   &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;   &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;span style="mso-tab-count:1"&gt;                &lt;/span&gt;addEventListener(Event.ENTER_FRAME,timerHandler);&lt;/p&gt;   &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;span style="mso-tab-count:1"&gt;                &lt;/span&gt;setupFirstPlayer();&lt;/p&gt;   &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;}&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;In this function I also start a loop using the ENTER_FRAME event. This is a function that will be called periodically with the fps set up in the FLA. This is a way to check if the viewer class has set up any new moves. This is an alternative to the event driven solution found in the come2play tutorials.&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;We will discuss this later.&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;br /&gt;The last function is used to define the first player. Because the game is in turns, only one player can make a move. Therefore this information must be set up.&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;A simple way is to define as starting player the first player in the index of all user ids. This information is stored in the currentturnIndexPlayer&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;in the viewer class.&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;You need to think to the 2 clients that received the same array of the player ids (allPlayerIds). Therefore both clients have the user ids in order in this array: the first element of the array (allPlayerIds[0]) will be the same for both clients.&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;The serve must be notified by all clients about the current player. To do this each client must call the doAllSetTurn function. This is the way the server can be sure that all clients agreed to have one current player. &lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;table class="MsoNormalTable" border="1" cellspacing="0" cellpadding="0" style="border-collapse:collapse;border:none;mso-border-alt:solid black .5pt;  mso-yfti-tbllook:1184;mso-padding-alt:0in 5.4pt 0in 5.4pt;mso-border-insideh:  .5pt solid black;mso-border-insidev:.5pt solid black"&gt;  &lt;tbody&gt;&lt;tr style="mso-yfti-irow:0;mso-yfti-firstrow:yes;mso-yfti-lastrow:yes"&gt;   &lt;td width="638" valign="top" style="width:6.65in;border:solid black 1.0pt;   mso-border-alt:solid black .5pt;padding:0in 5.4pt 0in 5.4pt"&gt;   &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;private   function setupFirstPlayer() {&lt;/p&gt;   &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;span style="mso-tab-count:1"&gt;                &lt;/span&gt;var firstPlayerIndex: int = 0;&lt;/p&gt;   &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;span style="mso-tab-count:1"&gt;                &lt;/span&gt;theViewer.currentturnIndexPlayer&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;= firstPlayerIndex;&lt;/p&gt;&lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;b&gt;&lt;span style="color:#548DD4;"&gt;doAllSetTurn&lt;/span&gt;&lt;/b&gt;(allPlayerIds[firstPlayerIndex],-1);&lt;/p&gt;&lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;}&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;It is time now to see the viewer class.&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;In the constructor the movieclip is stored.&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;Then the board is created. I found useful to have a linear array of 9 elements instead of a double array 3x3. The index of the linear array will be: &lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;0 1 2&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;3 4 5&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;6 7 8&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;In order to display an empty square or a square filled with the “x” or with the “o” I have created a Movie Clip symbol called Square and I have exported for Actionscript.&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;In the frame=1 there is an empty square. In frame=2 there is the “x”, while in frame=3 there is the “o”.&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;img src="http://www.mindthemove.com/blog/uploaded_images/image4-796851.jpg" border="0" alt="" style="float: left; margin-top: 0px; margin-right: 10px; margin-bottom: 10px; margin-left: 0px; cursor: pointer; width: 216px; height: 66px; " /&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;br /&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.mindthemove.com/blog/uploaded_images/image1-760869.jpg"&gt;&lt;img src="http://www.mindthemove.com/blog/uploaded_images/image1-760453.jpg" border="0" alt="" style="float: left; margin-top: 0px; margin-right: 10px; margin-bottom: 10px; margin-left: 0px; cursor: pointer; width: 320px; height: 162px; " /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;div style="text-align: center; "&gt;&lt;span class="Apple-style-span"  style="color:#0000EE;"&gt;&lt;span class="Apple-style-span" style="text-decoration: underline; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: center; "&gt;&lt;span class="Apple-style-span"  style="color:#0000EE;"&gt;&lt;span class="Apple-style-span" style="text-decoration: underline;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: center; "&gt;&lt;span class="Apple-style-span"  style="color:#0000EE;"&gt;&lt;span class="Apple-style-span" style="text-decoration: underline;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: center; "&gt;&lt;span class="Apple-style-span"  style="color:#0000EE;"&gt;&lt;span class="Apple-style-span" style="text-decoration: underline;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: center; "&gt;&lt;span class="Apple-style-span"  style="color:#0000EE;"&gt;&lt;span class="Apple-style-span" style="text-decoration: underline;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: center; "&gt;&lt;span class="Apple-style-span"  style="color:#0000EE;"&gt;&lt;span class="Apple-style-span" style="text-decoration: underline;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.come2play.com/images/come2play_logo2.gif"&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.come2play.com/images/come2play_logo2.gif"&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.come2play.com/images/come2play_logo2.gif"&gt;&lt;/a&gt;&lt;p&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;To create a new symbol it’s just enough to create a new instance of the class Square:&lt;/p&gt;  &lt;table class="MsoNormalTable" border="1" cellspacing="0" cellpadding="0" style="border-collapse:collapse;border:none;mso-border-alt:solid black .5pt;  mso-yfti-tbllook:1184;mso-padding-alt:0in 5.4pt 0in 5.4pt;mso-border-insideh:  .5pt solid black;mso-border-insidev:.5pt solid black"&gt;  &lt;tbody&gt;&lt;tr style="mso-yfti-irow:0;mso-yfti-firstrow:yes;mso-yfti-lastrow:yes"&gt;   &lt;td width="638" valign="top" style="width:6.65in;border:solid black 1.0pt;   mso-border-alt:solid black .5pt;padding:0in 5.4pt 0in 5.4pt"&gt;   &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;var   squareNew = new Square();&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;The I set up the Square movieclip in the right position and to the right frame (squareNew.gotoAndStop(EMPTYFRAME);). Then I add this new symbol to the stage and to an arrayOfSquares that I use to keep track of the clicked squares.&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;To be noted I have used a dynamic property called “myBoardIndex” to store the index of the movie clip in the board. For example the first movie clip (on the left top corner) will have myBoardIndex=0. The one in the center of the board will have myBoardIndex=4, etc.&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;table class="MsoNormalTable" border="1" cellspacing="0" cellpadding="0" style="border-collapse:collapse;border:none;mso-border-alt:solid black .5pt;  mso-yfti-tbllook:1184;mso-padding-alt:0in 5.4pt 0in 5.4pt;mso-border-insideh:  .5pt solid black;mso-border-insidev:.5pt solid black"&gt;  &lt;tbody&gt;&lt;tr style="mso-yfti-irow:0;mso-yfti-firstrow:yes;mso-yfti-lastrow:yes"&gt;   &lt;td width="638" valign="top" style="width:6.65in;border:solid black 1.0pt;   mso-border-alt:solid black .5pt;padding:0in 5.4pt 0in 5.4pt"&gt;   &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;public   function TTTC2PViewer (stageMovieClip:MovieClip)&lt;/p&gt;   &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;{&lt;/p&gt;   &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;span style="mso-tab-count:1"&gt;                &lt;/span&gt;this.stageMovieClip =   stageMovieClip;&lt;/p&gt;   &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;span style="mso-tab-count:1"&gt;                &lt;/span&gt;arrayOfSquares = new Array(9);&lt;/p&gt;   &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;span style="mso-tab-count:1"&gt;                &lt;/span&gt;for(i=0;i&lt;9;i++){&lt;/p&gt;   &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;span style="mso-tab-count:2"&gt;                                &lt;/span&gt;var squareNew   = new Square();&lt;/p&gt;   &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;span style="mso-tab-count:2"&gt;                                &lt;/span&gt;squareNew.x=SQUAREPOSITION[i].x;&lt;/p&gt;   &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;span style="mso-tab-count:2"&gt;                                &lt;/span&gt;squareNew.y=SQUAREPOSITION[i].y;&lt;/p&gt;   &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;span style="mso-tab-count:2"&gt;                                &lt;/span&gt;squareNew.myBoardIndex=   i;&lt;/p&gt;   &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;span style="mso-tab-count:2"&gt;                                &lt;/span&gt;squareNew.gotoAndStop(EMPTYFRAME);&lt;/p&gt;   &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;span style="mso-tab-count:2"&gt;                                &lt;/span&gt;squareNew.addEventListener(MouseEvent.MOUSE_DOWN,   clickHandler);&lt;/p&gt;   &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;span style="mso-tab-count:2"&gt;                                &lt;/span&gt;arrayOfSquares[i]   = squareNew;&lt;/p&gt;   &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;span style="mso-tab-count:2"&gt;                                &lt;/span&gt;stageMovieClip.addChild(squareNew);&lt;/p&gt;   &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;span style="mso-tab-count:2"&gt;                                &lt;/span&gt;squareClickedIndex   = NOCLICKEDSQUARE;&lt;/p&gt;   &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;span style="mso-tab-count:1"&gt;                &lt;/span&gt;}&lt;/p&gt;   &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;}//   constructor&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;Each movieclip is registered with a MOUSE_DOWN event. The called function is clickHandler.&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;table class="MsoNormalTable" border="1" cellspacing="0" cellpadding="0" style="border-collapse:collapse;border:none;mso-border-alt:solid black .5pt;  mso-yfti-tbllook:1184;mso-padding-alt:0in 5.4pt 0in 5.4pt;mso-border-insideh:  .5pt solid black;mso-border-insidev:.5pt solid black"&gt;  &lt;tbody&gt;&lt;tr style="mso-yfti-irow:0;mso-yfti-firstrow:yes;mso-yfti-lastrow:yes"&gt;   &lt;td width="638" valign="top" style="width:6.65in;border:solid black 1.0pt;   mso-border-alt:solid black .5pt;padding:0in 5.4pt 0in 5.4pt"&gt;   &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;public   function clickHandler(event:MouseEvent){&lt;/p&gt;   &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;span style="mso-tab-count:1"&gt;                &lt;/span&gt;if (!isMyTurn()) return;&lt;/p&gt;   &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;span style="mso-tab-count:1"&gt;                &lt;/span&gt;var clicked:Square =   event.target as Square;&lt;/p&gt;   &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;   &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;span style="mso-tab-count:1"&gt;                &lt;/span&gt;if ((arrayOfSquares[clicked.myBoardIndex].currentFrame)==EMPTYFRAME){&lt;/p&gt;   &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;span style="mso-tab-count:2"&gt;                                &lt;/span&gt;setSquare(myUserIndex,clicked.myBoardIndex);&lt;/p&gt;   &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;span style="mso-tab-count:2"&gt;                                &lt;/span&gt;squareClickedIndex   = clicked.myBoardIndex;&lt;/p&gt;   &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;span style="mso-tab-count:1"&gt;                &lt;/span&gt;}&lt;span style="mso-tab-count:   1"&gt;              &lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;}&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;This function is immediately exit if it is not the turn of this client. This is done comparing the myUserIndex value with the currentturnIndexPlayer value.&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;table class="MsoNormalTable" border="1" cellspacing="0" cellpadding="0" style="border-collapse:collapse;border:none;mso-border-alt:solid black .5pt;  mso-yfti-tbllook:1184;mso-padding-alt:0in 5.4pt 0in 5.4pt;mso-border-insideh:  .5pt solid black;mso-border-insidev:.5pt solid black"&gt;  &lt;tbody&gt;&lt;tr style="mso-yfti-irow:0;mso-yfti-firstrow:yes;mso-yfti-lastrow:yes"&gt;   &lt;td width="638" valign="top" style="width:6.65in;border:solid black 1.0pt;   mso-border-alt:solid black .5pt;padding:0in 5.4pt 0in 5.4pt"&gt;   &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;public   function isMyTurn():Boolean{&lt;/p&gt;   &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;span style="mso-spacerun:yes"&gt;   &lt;/span&gt;return   (this.currentturnIndexPlayer==this.myUserIndex);&lt;/p&gt;   &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;}&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;Then the target of the event is used to know which square was clicked. Only if the square is empty (that is checked using the currentFrame of the MovieClip then the square is changed calling the function setSquare (this function will be called to set the square also to set an opponent move). This is done simply using the procedure gotoAndStop to the playerIndex value (added by 2 because the first symbol “x” is to the frame 2 as you can see in the timeline for Square).&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;table class="MsoNormalTable" border="1" cellspacing="0" cellpadding="0" style="border-collapse:collapse;border:none;mso-border-alt:solid black .5pt;  mso-yfti-tbllook:1184;mso-padding-alt:0in 5.4pt 0in 5.4pt;mso-border-insideh:  .5pt solid black;mso-border-insidev:.5pt solid black"&gt;  &lt;tbody&gt;&lt;tr style="mso-yfti-irow:0;mso-yfti-firstrow:yes;mso-yfti-lastrow:yes"&gt;   &lt;td width="638" valign="top" style="width:6.65in;border:solid black 1.0pt;   mso-border-alt:solid black .5pt;padding:0in 5.4pt 0in 5.4pt"&gt;   &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;public   function setSquare(playerIndex:int, squareIndex:int){&lt;/p&gt;   &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;span style="mso-tab-count:1"&gt;                &lt;/span&gt;arrayOfSquares[squareIndex].gotoAndStop(playerIndex+OFFSETFIRSTSYMBOL);&lt;/p&gt;   &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;}&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;The last action on the clickHandler function is to set the variable squareClickedIndex to the index of the board (value from 0 to 8). Normally this variable is set to -1 to indicate that no click is yet made. As soon as this variable is set to a different value, this indicates the place in the board where the click was performed.&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;This is the signal that the main class will check in the polling cycle inside the timerHandler. Actually there are 2 condition must be fulfilled: must be my turn and the theViewer.squareClickedIndex must be different than -1 (=theViewer.NOCLICKEDSQUARE). &lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;table class="MsoNormalTable" border="1" cellspacing="0" cellpadding="0" style="border-collapse:collapse;border:none;mso-border-alt:solid black .5pt;  mso-yfti-tbllook:1184;mso-padding-alt:0in 5.4pt 0in 5.4pt;mso-border-insideh:  .5pt solid black;mso-border-insidev:.5pt solid black"&gt;  &lt;tbody&gt;&lt;tr style="mso-yfti-irow:0;mso-yfti-firstrow:yes;mso-yfti-lastrow:yes"&gt;   &lt;td width="638" valign="top" style="width:6.65in;border:solid black 1.0pt;   mso-border-alt:solid black .5pt;padding:0in 5.4pt 0in 5.4pt"&gt;   &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;public   function timerHandler(event:Event):void {&lt;/p&gt;   &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;span style="mso-spacerun:yes"&gt;   &lt;/span&gt;if ( theViewer.isMyTurn() &amp;amp;&amp;amp;   (theViewer.squareClickedIndex!=theViewer.NOCLICKEDSQUARE)&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;)&lt;span style="mso-tab-count:1"&gt;       &lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;span style="mso-tab-count:5"&gt;                                                                                &lt;/span&gt;sendMoveToServer();&lt;/p&gt;   &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;}&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;If so the sendMoveToServer is called. The main purpose of this function is to send to the server the message that a move was made by the current player using the function doStoreState.&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;table class="MsoNormalTable" border="1" cellspacing="0" cellpadding="0" style="border-collapse:collapse;border:none;mso-border-alt:solid black .5pt;  mso-yfti-tbllook:1184;mso-padding-alt:0in 5.4pt 0in 5.4pt;mso-border-insideh:  .5pt solid black;mso-border-insidev:.5pt solid black"&gt;  &lt;tbody&gt;&lt;tr style="mso-yfti-irow:0;mso-yfti-firstrow:yes;mso-yfti-lastrow:yes"&gt;   &lt;td width="638" valign="top" style="width:6.65in;border:solid black 1.0pt;   mso-border-alt:solid black .5pt;padding:0in 5.4pt 0in 5.4pt"&gt;   &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;public   function sendMoveToServer(){&lt;/p&gt;   &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;span style="mso-tab-count:1"&gt;                &lt;/span&gt;var myKey =   this.myUserId+"_"+this.keyMove;&lt;/p&gt;   &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;span style="mso-tab-count:1"&gt;                &lt;/span&gt;var userEntry:UserEntry =   UserEntry.create(myKey,theViewer.squareClickedIndex,false);&lt;/p&gt;   &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;span style="mso-tab-count:1"&gt;                &lt;/span&gt;var userEntries:Array = new   Array();&lt;/p&gt;   &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;span style="mso-tab-count:1"&gt;                &lt;/span&gt;userEntries.push(userEntry);&lt;/p&gt;   &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;   &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;span style="mso-tab-count:1"&gt;                &lt;/span&gt;&lt;b style="mso-bidi-font-weight:   normal"&gt;&lt;span style="color:#548DD4;"&gt;doStoreState&lt;/span&gt;&lt;/b&gt;(userEntries);&lt;/p&gt;   &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;span style="mso-tab-count:1"&gt;                &lt;/span&gt;theViewer.squareClickedIndex =   theViewer.NOCLICKEDSQUARE;&lt;/p&gt;   &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;span style="mso-tab-count:1"&gt;                &lt;/span&gt;keyMove++;&lt;/p&gt;   &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;}&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;The doStoreState function needs only one parameter that must be an Array of type UserEntry. Actually the array can contain only one element.&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;To create a variable of type UserEntry the static function create is used:&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;UserEntry.create(theKey,theValue,isSecret) where:&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-top:0in;margin-right:0in;margin-bottom:0in; margin-left:.5in;margin-bottom:.0001pt;text-indent:-.25in;mso-list:l0 level1 lfo1"&gt;&lt;span style="mso-bidi-;font-family:Calibri;"&gt;&lt;span style="mso-list:Ignore"&gt;-&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;          &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;theKey must be unique if you want to store a new message. If you use a key already present this will override the previous one.&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-top:0in;margin-right:0in;margin-bottom:0in; margin-left:.5in;margin-bottom:.0001pt;text-indent:-.25in;mso-list:l0 level1 lfo1"&gt;&lt;span style="mso-bidi-;font-family:Calibri;"&gt;&lt;span style="mso-list:Ignore"&gt;-&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;          &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;theValue is the actual message that you want to send&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-top:0in;margin-right:0in;margin-bottom:0in; margin-left:.5in;margin-bottom:.0001pt;text-indent:-.25in;mso-list:l0 level1 lfo1"&gt;&lt;span style="mso-bidi-;font-family:Calibri;"&gt;&lt;span style="mso-list:Ignore"&gt;-&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;          &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;isSecret indicates if the other clients will be allowed to see the message sent&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;Both theKey and theValue can be any Object. There are different way to choose how to create the key and the value. My choise was the following:&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;For the key I created a String of this type “myUserId_keyMove” where keyMove is incremented at each move (at each click). So for example with player with id=41 the first key sent will be “41_0”, the second “41_1” etc... While for the opponent (with id=42 for example) will be “42_0”, “42_1”, etc…&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;The value will be simply the index of the board where the click was performed. This is the critical information to send to the opponent so that the opponent can display the square with the right symbol.&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;After sending the message to the server , the incremental keyMove variable is updated. And the theViewer.squareClickedIndex variable is set to -1 so that next time (and when it will be again my turn) it will be possible to click again.&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;Now that the message is sent let’s suppose to move to the opponent client. This client must receive the message and display the opponent’s symbol on the board on the right position (board index).&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;This is done in the gotStateChanged function where the server sends to the client the serverEntries array containing the moves in terms of ServerEntry elements.&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;Because we sent only 1 message, only the first element serverEntries[0] will be used.&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;In this variable the property storedByUserId is the id of the client who sent this message. Because the client who actually sent the message is also receiving this information, we need to check if the message was sent by the client itself. Only if this was sent by the opponent the function theViewer.setSquare is called to display the opponent symbol. &lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;While the client who sent the message is not doing this simply because we already set this on the clickHandler function. That was a choice. An alternative would have been to set the symbol for the client itself after he received back the gotStateChange event from the server.&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;table class="MsoNormalTable" border="1" cellspacing="0" cellpadding="0" style="border-collapse:collapse;border:none;mso-border-alt:solid black .5pt;  mso-yfti-tbllook:1184;mso-padding-alt:0in 5.4pt 0in 5.4pt;mso-border-insideh:  .5pt solid black;mso-border-insidev:.5pt solid black"&gt;  &lt;tbody&gt;&lt;tr style="mso-yfti-irow:0;mso-yfti-firstrow:yes;mso-yfti-lastrow:yes"&gt;   &lt;td width="638" valign="top" style="width:6.65in;border:solid black 1.0pt;   mso-border-alt:solid black .5pt;padding:0in 5.4pt 0in 5.4pt"&gt;   &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;override   public function &lt;b style="mso-bidi-font-weight:normal"&gt;&lt;span style="color:#548DD4;"&gt;gotStateChanged&lt;/span&gt;&lt;/b&gt;(serverEntries:Array):void&lt;/p&gt;   &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;{&lt;/p&gt;   &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;span style="mso-spacerun:yes"&gt;   &lt;/span&gt;var serverEntry:ServerEntry =   serverEntries[0];&lt;/p&gt;   &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;span style="mso-tab-count:1"&gt;                &lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;span style="mso-spacerun:yes"&gt;   &lt;/span&gt;if (serverEntry.storedByUserId !=   this.myUserId){&lt;span style="mso-tab-count:5"&gt;                                                                        &lt;/span&gt;&lt;span style="mso-tab-count:1"&gt;                &lt;/span&gt;theViewer.setSquare(allPlayerIds.indexOf(serverEntry.storedByUserId),serverEntry.value);&lt;span style="mso-tab-count:1"&gt;     &lt;/span&gt;&lt;span style="mso-tab-count:1"&gt;                &lt;/span&gt;   }&lt;/p&gt;   &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;setNextPlayerTurn();&lt;/p&gt;   &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;span style="mso-tab-count:1"&gt;                &lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;span style="mso-spacerun:yes"&gt;   &lt;/span&gt;// CHECK if the game is over&lt;/p&gt;   &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;var winnerIndex:int =   theViewer.winnerPlayer();&lt;span style="mso-tab-count:3"&gt;                                           &lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;if (winnerIndex&gt;-1) {&lt;span style="mso-tab-count:2"&gt;                    &lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;span style="mso-tab-count:1"&gt;                &lt;/span&gt;setupWinner(winnerIndex);&lt;/p&gt;   &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;}&lt;/p&gt;   &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;}&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;In any case the setNextPlayerTurn is called. First thing the currentIndexPlayer is updated with the next player. This is simply done adding 1 and set back to 0 the index in case it’s greater than the allPlayerIds array length.&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;table class="MsoNormalTable" border="1" cellspacing="0" cellpadding="0" style="border-collapse:collapse;border:none;mso-border-alt:solid black .5pt;  mso-yfti-tbllook:1184;mso-padding-alt:0in 5.4pt 0in 5.4pt;mso-border-insideh:  .5pt solid black;mso-border-insidev:.5pt solid black"&gt;  &lt;tbody&gt;&lt;tr style="mso-yfti-irow:0;mso-yfti-firstrow:yes;mso-yfti-lastrow:yes"&gt;   &lt;td width="638" valign="top" style="width:6.65in;border:solid black 1.0pt;   mso-border-alt:solid black .5pt;padding:0in 5.4pt 0in 5.4pt"&gt;   &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;private   function setNextPlayerTurn(){&lt;/p&gt;   &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;span style="mso-tab-count:1"&gt;                &lt;/span&gt;theViewer.currentturnIndexPlayer++;&lt;/p&gt;   &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;span style="mso-tab-count:1"&gt;                &lt;/span&gt;if   (theViewer.currentturnIndexPlayer &gt;= allPlayerIds.length)&lt;/p&gt;   &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;span style="mso-tab-count:3"&gt;                                                &lt;/span&gt;theViewer.currentturnIndexPlayer   = 0;&lt;/p&gt;   &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;span style="mso-tab-count:3"&gt;                                                &lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;span style="mso-tab-count:1"&gt;                &lt;/span&gt;&lt;b style="mso-bidi-font-weight:   normal"&gt;&lt;span style="color:#548DD4;"&gt;doAllSetTurn&lt;/span&gt;&lt;/b&gt;(allPlayerIds[theViewer.currentturnIndexPlayer],-1);&lt;span style="mso-tab-count:1"&gt;          &lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;}&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;Then the doAllSetTurn is sent to the server with the id of the new active player. It is also possible to set a maximum number of millisecond for the move (or -1 to ignore this).&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;br /&gt;This soAllSetTurn function must be called by all the clients to have any effect. And this is the reason why the gotStateChange function this is called from both clients. This is also useful to have both clients updated in terms of current player index.&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;The last action in the gotStateChange is to check if the game is over. If so the setupWinner function is called.&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;The main purpose of this function is to call the doAllEndMatch function to inform the server the game is ended. Again, as all the doAll…. functions, this must be called by all the players.&lt;b style="mso-bidi-font-weight:normal"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;table class="MsoNormalTable" border="1" cellspacing="0" cellpadding="0" style="border-collapse:collapse;border:none;mso-border-alt:solid black .5pt;  mso-yfti-tbllook:1184;mso-padding-alt:0in 5.4pt 0in 5.4pt;mso-border-insideh:  .5pt solid black;mso-border-insidev:.5pt solid black"&gt;  &lt;tbody&gt;&lt;tr style="mso-yfti-irow:0;mso-yfti-firstrow:yes;mso-yfti-lastrow:yes"&gt;   &lt;td width="638" valign="top" style="width:6.65in;border:solid black 1.0pt;   mso-border-alt:solid black .5pt;padding:0in 5.4pt 0in 5.4pt"&gt;   &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;private   function setupWinner(winnerIndex:int){&lt;/p&gt;   &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;span style="mso-tab-count:1"&gt;                &lt;/span&gt;var finishedPlayers:Array =   new Array();&lt;/p&gt;   &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;span style="mso-tab-count:1"&gt;                &lt;/span&gt;var   playerMatchOver:PlayerMatchOver;&lt;/p&gt;   &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;span style="mso-tab-count:1"&gt;                &lt;/span&gt;for (var i:int=0;   i&lt;allplayerids.length;i++){&gt;&lt;/allplayerids.length;i++){&gt;&lt;/p&gt;   &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;span style="mso-tab-count:2"&gt;                                &lt;/span&gt;if (   i==winnerIndex ){&lt;/p&gt;   &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;span style="mso-tab-count:3"&gt;                                                &lt;/span&gt;playerMatchOver=   PlayerMatchOver.create(allPlayerIds[i],100,100);&lt;/p&gt;   &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;span style="mso-tab-count:2"&gt;                                &lt;/span&gt;}else{&lt;/p&gt;   &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;span style="mso-tab-count:3"&gt;                                                &lt;/span&gt;playerMatchOver=   PlayerMatchOver.create(allPlayerIds[i],0,0);&lt;/p&gt;   &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;span style="mso-tab-count:2"&gt;                                &lt;/span&gt;}&lt;/p&gt;   &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;span style="mso-tab-count:2"&gt;                                &lt;/span&gt;finishedPlayers.push(playerMatchOver);&lt;/p&gt;   &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;span style="mso-tab-count:1"&gt;                &lt;/span&gt;}&lt;/p&gt;   &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;span style="mso-tab-count:11"&gt;                                                                                                                                                                                &lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;span style="mso-tab-count:1"&gt;                &lt;/span&gt;&lt;b style="mso-bidi-font-weight:   normal"&gt;&lt;span style="color:#548DD4;"&gt;doAllEndMatch&lt;/span&gt;&lt;/b&gt;(finishedPlayers);&lt;/p&gt;   &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;}&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;The parameter sent to the server must be an array of type PlayerMatchOver. Each element must contain the id of all players that have finished the game. In our case both players end the game simultaneously. &lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;Therefore there is a loop in the allPlayeIds array to create a variable of type PlayerMatchOver. Again the static method “create” is used with 3 parameters:&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-top:0in;margin-right:0in;margin-bottom:0in; margin-left:.5in;margin-bottom:.0001pt;text-indent:-.25in;mso-list:l0 level1 lfo1"&gt;&lt;span style="mso-bidi-;font-family:Calibri;"&gt;&lt;span style="mso-list:Ignore"&gt;-&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;          &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;userId&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-top:0in;margin-right:0in;margin-bottom:0in; margin-left:.5in;margin-bottom:.0001pt;text-indent:-.25in;mso-list:l0 level1 lfo1"&gt;&lt;span style="mso-bidi-;font-family:Calibri;"&gt;&lt;span style="mso-list:Ignore"&gt;-&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;          &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;theScore. Set to 100 if the player wins and 0 if the player looses.&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-top:0in;margin-right:0in;margin-bottom:0in; margin-left:.5in;margin-bottom:.0001pt;text-indent:-.25in;mso-list:l0 level1 lfo1"&gt;&lt;span style="mso-bidi-;font-family:Calibri;"&gt;&lt;span style="mso-list:Ignore"&gt;-&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;          &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;thePot. The pot is used if the game allows players to bet during the game. In our case this will be 100% if the player wins, and 0% if the player looses. &lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2096306182498867614-2289521077310354404?l=www.mindthemove.com%2Fblog' alt='' /&gt;&lt;/div&gt;</description><link>http://www.mindthemove.com/blog/2010/01/come2play-multiplayer-api.html</link><author>noreply@blogger.com (Ema)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-2096306182498867614.post-2836794103100630764</guid><pubDate>Fri, 04 Apr 2008 14:39:00 +0000</pubDate><atom:updated>2008-04-05T04:44:19.868-07:00</atom:updated><title></title><description>Bruno Faidutti wrote an editorial on his &lt;a href="http://www.faidutti.com/"&gt;website&lt;/a&gt; about the language in which he wrote the rules of his prototypes.&lt;br /&gt;Basically he says that "&lt;span style="font-size:100%;color:#000066;"&gt;I’ve                 even found out that even French publishers prefer English language                 prototypes, since they make easier to playtest the game with                 foreign publishers".&lt;br /&gt;This is certainly a good point. But I think that there is another good reason: it easier to involve foreign playtesters.&lt;br /&gt;I like to have the chance to send mine prototypes to a complete different gaming group, possibly in different country.&lt;br /&gt;I remember that for Oltre Mare in the first version I sent to Henning Kropke in Germay. He planned to visit Mik Svellov in Copenahagen for some gaming sessions. So the proto of Oltre Mare received some playtests in the north of Europe before to be released. I had also a good preview from Mik in his website &lt;a href="http://brettboard.dk/"&gt;brettboard.dk&lt;/a&gt;&lt;/span&gt; before the fair!&lt;br /&gt;&lt;br /&gt;At the moment I have a prototype who was sent to the Gathering of Friends and hopefully will be playtested. Moreover I will attendee the Bruno Faidutti's Ludophatic Gathering during the next weekend. In both case an english rule is a good point.&lt;br /&gt;&lt;br /&gt;I have to admit, anyway, that the language in which I write new ideas that come out from playtesting sessions are just in Italian. I found easier to formilize these ideas in my native language. At least for the moment.&lt;br /&gt;It maybe also depends of the fact that I usually share these ideas with my gaming group members that are Italian.&lt;br /&gt;&lt;br /&gt;Emanuele&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2096306182498867614-2836794103100630764?l=www.mindthemove.com%2Fblog' alt='' /&gt;&lt;/div&gt;</description><link>http://www.mindthemove.com/blog/2008/04/bruno-faidutti-wrote-editorial-on-his.html</link><author>noreply@blogger.com (Ema)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-2096306182498867614.post-4682341785951152117</guid><pubDate>Fri, 04 Apr 2008 14:02:00 +0000</pubDate><atom:updated>2008-04-04T07:34:35.795-07:00</atom:updated><title>Ideas strike back</title><description>Some game ideas come backs, sometimes.&lt;br /&gt;&lt;br /&gt;It's the case of a game I designed more than 2 years ago. I presented to a big publisher during the Essen fair. But it was reject in the same meeting during the explanation!&lt;br /&gt;"It's a good theme, I like it. But there is too much components, and I do not like ..." (follows some explanations).&lt;br /&gt;Well, things that happens!&lt;br /&gt;&lt;br /&gt;I had a similar experience with another publisher who first said: "This game seems too similar to one we already got in our program. Please verify and let me know!". In this occasion at least I got a new game for my collection. I really never played that game, and it really was not so similar! Well, both games use an auction mechanism and have cards. But there are many others out there that are similar in this way! :-)&lt;br /&gt;Almost one year later the same publisher decided to give it a try, after my assurance the game was not so similar! And after some tests they decided they like it and they will produce!&lt;br /&gt;&lt;br /&gt;A very happy ending. But for the "too much components" prototype it was not the same!...&lt;br /&gt;... Until few weeks ago when another publisher asked me if I have ready a game with some particular characteristics (I am not authorized to give any details for the moment)... They were not worried about the components, because in very few time of playtest they decide it was a good game...&lt;br /&gt;&lt;br /&gt;Well, I have to admit that I worked hard during the Easter weekend (I forced my father to play it just after the Easter lunch :-P&lt;br /&gt;I changed enough things to have a really better game... with the same components anyway! I was much more soddisfy than before, so in this case time elapsed without thinking of it was a good point! And let me have a more exciting game that hopefully will be published.&lt;br /&gt;&lt;br /&gt;There is another prototype, for which I had very good feedback from my playtesters. But it was rejected from 3 different publishers... I think this project is almost 5 years old.&lt;br /&gt;I have worked a lot to find a good solution to problems arose.&lt;br /&gt;I think some months ago I found the real problem. My opinion is that, during the years, I changed several things without focusing on the real problem.&lt;br /&gt;That problem give only one way to play for the best strategy removing a lot of fun to a quite complex game!&lt;br /&gt;Now that I have, hopefully,  found the right issue, I'm confident I can find the solution to have a nice game!&lt;br /&gt;&lt;br /&gt;Sometime ideas come back... sometime we only need time...&lt;br /&gt;&lt;br /&gt;Emanuele&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2096306182498867614-4682341785951152117?l=www.mindthemove.com%2Fblog' alt='' /&gt;&lt;/div&gt;</description><link>http://www.mindthemove.com/blog/2008/04/ideas-strike-back.html</link><author>noreply@blogger.com (Ema)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-2096306182498867614.post-4391395490505613957</guid><pubDate>Wed, 05 Mar 2008 17:08:00 +0000</pubDate><atom:updated>2008-05-23T08:40:59.203-07:00</atom:updated><title>Theme and Mechanisms</title><description>This post is a kind of reply to the very interesting post by Jonathan Degann "What is this boardgame about" I suggest to read &lt;a href="http://jbdgames.blogspot.com/2008/02/what-is-this-game-about.html"&gt;here&lt;/a&gt;.&lt;br /&gt;Several times we consider Eurogames to have a theme pasted up to a set of mechanisms. It is so easy to change the theme because what a game is about, in my opinion, &lt;span style="font-weight: bold;"&gt;is&lt;/span&gt; the set of rules defined for it.&lt;br /&gt;One friend of mine called the physic class, during the highschool period, as "the most detailed role play game".&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://images.boardgamegeek.com/images/pic51968_t.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 83px; height: 110px;" src="http://images.boardgamegeek.com/images/pic51968_t.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://images.boardgamegeek.com/images/pic218443_t.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 77px; height: 109px;" src="http://images.boardgamegeek.com/images/pic218443_t.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;So we can see Tychoon theme completely changed into El Capitan. Or Ra changed in Razzia (by the way I found the Mafia theme that suites better than the egyptian one).&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://images.boardgamegeek.com/images/pic224426_t.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 124px; height: 174px;" src="http://images.boardgamegeek.com/images/pic224426_t.jpg" alt="" border="0" /&gt;&lt;/a&gt;I compare Amytis to Amune-Re (just to stay with the same authors and similar themes :-) because in order to win  you need to have a look to all the aspects you try to manage. In Amyitis you have several ways to score (even if it is essential to plant and to irrigate as Cyril said) and several things to do in order to score! I am not sure about the so called "star structure", but it is not the focus of the design in my opinion and it was introduced by Cyril to reply to the BGG post.&lt;br /&gt;In Amun-Re you also have several ways to score.. "too much" someone can say, and who said that it doesn't matter what you do because you score for everything, I supposed have not clear the game (or miserably loose :-).&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://images.boardgamegeek.com/images/pic146430_t.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 115px; height: 160px;" src="http://images.boardgamegeek.com/images/pic146430_t.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;But I have to admit that in Amun-Re is easier to play than Amytis because it is simply more easy to have a one to one match for a rule to the theme.&lt;br /&gt;In Amun-Re you bid to conquer territories. You buy bricks for building pyramids and you blind-bid for offer to the god. It is probably more "linear" than "star", but it surely easier to grab when you learn the game.&lt;br /&gt;Maybe in Amytis there is only a problem with the theme and how it doesn't find an immediatly correpond to the rules. It is not so easy to remember that the carovan is used for the plantion. Why do I need to move the carovan in order to have a new platation? Even because with the carovan you can also gain one of the special cards as building the Babylon gate. So what have in common to build the gate with the creation of a platation portion of the garden? Apparently nothing, and most of all has no thematic approach to the carovan!&lt;br /&gt;In my opinion these missed associations between rules and theme let some players find diffucult to grab the rules.&lt;br /&gt;You can find the same easy approach to the theme association to the rule to other mentioned (in the Jonathan article)  games such as Puerto Rico and Caylus.&lt;br /&gt;In my Hermagor some players were disappointed to the fact that the fantasy theme was not well suited to the game mechanism. They probaly expected sheep and wood instead of egg's dragon and relic.&lt;br /&gt;When I am asked about "first theme or first mechanism" during the design process, I surely reply with "first mechanism". So I start from one or more mechanisms I would like to have in my new game.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://images.boardgamegeek.com/images/pic159502_t.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 92px; height: 133px;" src="http://images.boardgamegeek.com/images/pic159502_t.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://images.boardgamegeek.com/images/pic158548_t.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 42px; height: 60px;" src="http://images.boardgamegeek.com/images/pic158548_t.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://images.boardgamegeek.com/images/pic69356_t.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 49px; height: 63px;" src="http://images.boardgamegeek.com/images/pic69356_t.jpg" alt="" border="0" /&gt;&lt;/a&gt;For instance in Il Principe I wanted to use the roles (as in Puerto Rico), while the Building Cards selection mechanism was inspired by King Breakfast.&lt;br /&gt;But when I develop a game I try to think about the theme as soon as possible. Sometime I also change the theme not only rules during the playtesting.&lt;br /&gt;Thinking to the theme helps me to develop the rules. In fact if I have to add or remove some rules, or if I need to round out some rule mechanisms or some score systems the theme helps me a lot. And this process gives a more chance to have a good connection between rules and the theme itself.&lt;br /&gt;&lt;br /&gt;Emanuele&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2096306182498867614-4391395490505613957?l=www.mindthemove.com%2Fblog' alt='' /&gt;&lt;/div&gt;</description><link>http://www.mindthemove.com/blog/2008/03/theme-and-mechanisms.html</link><author>noreply@blogger.com (Ema)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>5</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-2096306182498867614.post-8458271873923629636</guid><pubDate>Fri, 22 Feb 2008 16:47:00 +0000</pubDate><atom:updated>2008-02-25T04:32:57.121-08:00</atom:updated><title>Solutions not Pathces</title><description>Last evening I playtested one prototype of mine with my friend Stefano.&lt;br /&gt;It is a game from 2 to 4 players, so we tried a 2 player game. It was the second playtest (the first one was in 4).&lt;br /&gt;&lt;br /&gt;I'm not going to describe the game here, but I would like to point out about an aspect of the game that was not working and how I want to try to solve it.&lt;br /&gt;The problem is about the mechanism of the combat: it is the first time I'm working on a game where it is possible to have a fight between players.&lt;br /&gt;So I am a little bit worried about, even because fighting is not excatly a typical german game mechanism...&lt;br /&gt;&lt;br /&gt;During the playtest simply the combat doesn't occur. The main reason was that it was not neccessary to figth because we had enough space where to expand our villages whithout moving in conflict. Maybe the board was too big for 2 players, so that it could be resolved by a fine tuning of the dimension. Or maybe both our nature let us finding alternative strategy other than a fight.&lt;br /&gt;&lt;br /&gt;Because the combat did not occur we also avoid to choose the "warrior cards" during all the game. Warrior cards were an option during a specific phase of the game where a player is prompted to choose between different actions. One of these actions is to "hire" warriors and it was never used. From a design point of view this phase were weaker because of the reduced number of choices.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://ecx.images-amazon.com/images/I/41FQ926J0DL._AA240_.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 200px;" src="http://ecx.images-amazon.com/images/I/41FQ926J0DL._AA240_.jpg" alt="" border="0" /&gt;&lt;/a&gt;As Knizia wrote in an interesting interview reported into the book "&lt;a href="http://www.amazon.com/Rules-Play-Game-Design-Fundamentals/dp/0262240459/ref=sr_1_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1203698493&amp;amp;sr=1-1"&gt;Rule of play&lt;/a&gt;" when something goes wrong during a playtest, you have to search for a good solution, not for a patch. He was talking about the playtest of his "The Lord of the Ring" collaborative game and how he found good solutions to resolve several problems all in once instead of applying a patch for each issue.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;In my situation I had 2 main problems:&lt;br /&gt;- the combat never occured&lt;br /&gt;- the choice in a certain phase is less interesting (due to the avoiding of combat)&lt;br /&gt;&lt;br /&gt;But the game was quite good even without fights! And Stefano convinced me to remove from the rules the possibility of a combat.&lt;br /&gt;&lt;br /&gt;Instead of trying to make a patch for the two problems I would like to search an alternative solution where these problems are simply no more reported!&lt;br /&gt;&lt;br /&gt;Let's assume that it is possible to play, with fun, without any combat as Stefano suggested.&lt;br /&gt;In this case I still have the second problem to resolve: infact if I have no more combat I have no more "Warrior cards". So I have less choice.&lt;br /&gt;I need more choices during this phase in order to give more spice to the game.&lt;br /&gt;&lt;br /&gt;Another thing I had notice  is the lack of a final score system. Up now I have a scoring during the end of each turn and an intermediate scoring during specific rounds, but still have no final score (for the end of the game).&lt;br /&gt;&lt;br /&gt;I would like to resolve both lacks in once single way, as Dr Knizia teachs.  So if I am able to introduce some actions useful for the final (or intermediate) score I maybe fix these problems.&lt;br /&gt;&lt;br /&gt;Let's see in future playtests.&lt;br /&gt;&lt;br /&gt;Emanuele&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2096306182498867614-8458271873923629636?l=www.mindthemove.com%2Fblog' alt='' /&gt;&lt;/div&gt;</description><link>http://www.mindthemove.com/blog/2008/02/solutions-not-pathces.html</link><author>noreply@blogger.com (Ema)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-2096306182498867614.post-6257456161961610636</guid><pubDate>Thu, 14 Feb 2008 14:26:00 +0000</pubDate><atom:updated>2008-02-25T04:41:29.395-08:00</atom:updated><title>Client side technology</title><description>Let's talk a bit about technology.&lt;br /&gt;In this post I will talk only about the client part.&lt;br /&gt;I have started my idea last year when I started a new job in Padova in Java web application. It was surely for me a return to a job I did several years ago (I worked with Microsoft tecnology in the meantime for non-web applications).&lt;br /&gt;It was an opportunity to update my knowledge in the web development world.&lt;br /&gt;I surprsly found something new: it was called Ajax. I don't want to talk in detail about Ajax because you can find a lot of tutorial on the web. I would only to note that the Asyncronous concept (the "A" from Ajax) is excatly what surprise me simply because it was what a normal web application lacked in order to become a game application!&lt;br /&gt;Infact the "rough" of a web application (against the non-web applications) is that normally when you perform an action (a click on an image, or on a link) you see a page reload. That means a window flickering! That is excatly what makes a video game on web unplayable in terms of good feeling.&lt;br /&gt;Moreover I learned about JavaScript framework such as Prototype and Scriptacolous and Mootools. These frameworks introduced a set of functions (a library) for specific grafic effects! The result is something unseen on a traditional web application. It is what now is called RIA: Rich Interent Application.&lt;br /&gt;This was also possible thanks to the fact the main browsers (Internet Explorer 7, Firefox and Safari) became quite standard in interpreting JS and HTML.&lt;br /&gt;So I started to learn these frameworks and the power of JavaScript and decided to try to develop a simply game using only JavaScript.&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://mootools.net/assets/images/header/logo.gif"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 200px;" src="http://mootools.net/assets/images/header/logo.gif" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;After almost a year I found this tecnology too difficult to use. I need to know a lot of CSS and DHTML other than JavaScript and the frameworks (I foucused on &lt;a href="http://mootools.net/"&gt;Mootools&lt;/a&gt; because seems really better than Scriptacolous).&lt;br /&gt;Moreover debug JavaScript can become a nightmare!&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.adobe.com/devnet/images/160x160/flash_cs3_logo.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 102px; height: 102px;" src="http://www.adobe.com/devnet/images/160x160/flash_cs3_logo.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;In the meantime I discovery ActionScript 3.0 that is also known as Flash 9 and is included in the new Adobe Creative Suite. ActionScript 3.0 is a great evolution respect his preceding mainly because it is full Object Oriented. For a programmer who worked for more than 8 years using Object Oriented languages such as Java, C++ and C#, learning AS 3.0 is a joke!&lt;br /&gt;AS 3.0 has also other advantages: the Flash player is a plugin that is mainly present in almost all the browser (and it is easy to install in any case). It easier to debug and to develop. And has a complete set of native objects really useful for videogames (but this is not a news of the 3.0 version).&lt;br /&gt;&lt;br /&gt;So my target now is ActionScript 3.0. I worked for less than half time to have the same result I add in JavaScript.&lt;br /&gt;&lt;br /&gt;Next time I will talk about the server side technology.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2096306182498867614-6257456161961610636?l=www.mindthemove.com%2Fblog' alt='' /&gt;&lt;/div&gt;</description><link>http://www.mindthemove.com/blog/2008/02/client-side-technology.html</link><author>noreply@blogger.com (Ema)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-2096306182498867614.post-8515727623430721162</guid><pubDate>Wed, 13 Feb 2008 14:25:00 +0000</pubDate><atom:updated>2008-02-13T06:30:03.671-08:00</atom:updated><title>The effects of broken rules in a political game</title><description>In this post I would like to point out how a bad rule development can let the game be a disaster.&lt;br /&gt;I am just using a methafor in order to talk about political facts.&lt;br /&gt;If you didn't know anything about the political crisis of Italian governement you can read this &lt;a href="http://www.cnn.com/2008/WORLD/europe/02/05/italy.vinci/index.html?iref=newssearch"&gt;CNN article&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;It's really a drama!&lt;br /&gt;And this instability on the Italian governement is due to the election rules.&lt;br /&gt;Rules, that we do not need to forgot, was acted by Berlusconi in the last weeks of his last   governament. And we do not need to forget that Prodi's governament in 2 years was not able (or lack of will) to change these rules.&lt;br /&gt;&lt;br /&gt;The final effect of this instability is that Italy governament is not working for people needs!&lt;br /&gt;Because of we have not new rules,  we are asked to go to the election day next 12 and 13 of April to play such a game with so broken rules! With a result that will be something unchanged, at least from the point of view of people needs.&lt;br /&gt;&lt;br /&gt;I thanks Bruno Faidutti that invited me to his Ludophatic Gathering for the same weekend. At least I will the pleasure to play a lot of good games instead!&lt;br /&gt;&lt;br /&gt;PS.: I suggest you to read about Italian disaster rules in the &lt;a href="http://www.beppegrillo.it/eng/"&gt;Beppe Grillo's english blog&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2096306182498867614-8515727623430721162?l=www.mindthemove.com%2Fblog' alt='' /&gt;&lt;/div&gt;</description><link>http://www.mindthemove.com/blog/2008/02/effects-of-broken-rules-in-political.html</link><author>noreply@blogger.com (Ema)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-2096306182498867614.post-4281727513102804307</guid><pubDate>Tue, 29 Jan 2008 12:47:00 +0000</pubDate><atom:updated>2008-01-29T14:02:51.982-08:00</atom:updated><title>Prototyping</title><description>The games I design passes two different phase.&lt;br /&gt;The first one is the born of the idea. This, as said in a precedent post, should come from an already played game.&lt;br /&gt;The second one is the devolopment of this idea.&lt;br /&gt;&lt;br /&gt;Usually there are more ideas than games. And that's fine because should be impossible to fit all the ideas in a good game.&lt;br /&gt;I use two different medias to annotate an idea: an excercise book and a word processor.&lt;br /&gt;I prefer a big excercise book with  small squares. Small squares are useful to draw some draft schema.&lt;br /&gt;As word processor I'm using Google Doc mainly because I can easly share my ideas to playtesters or friends.&lt;br /&gt;I have to admit that I tend to share a document mainly for the rules instead of the ideas....&lt;br /&gt;The idea so written will never remain the same one. But writing the idea is a way to focus on the idea itself.&lt;br /&gt;The idea is the source for the second phase.&lt;br /&gt;&lt;br /&gt;The second phase is more long and harder to achive. Infact if this second phase will successfully end I have a game that can be played. This is what I called the development of the idea. It should be also called prototyping.&lt;br /&gt;It is nice to note that in the software engineering field the prototyping is one of the phase on the software production lifecyle. So there is a good parallel between making computer programs and making a boardgame. We can assume the during this phase the game is in alfa testing (it is a software term).&lt;br /&gt;&lt;br /&gt;The main task during prototyping is the test.&lt;br /&gt;Usually I iterate through the following steps:&lt;br /&gt;1. I prepare or modify a prototype&lt;br /&gt;2. I test it for myself&lt;br /&gt;3. The game was not good? I quit! I consider this idea not good enough!&lt;br /&gt;4. Something to change? Come back to point 1.&lt;br /&gt;5. Is the development of the idea good enough?&lt;br /&gt;6. I prepare a better prototype.&lt;br /&gt;7. I test it with real players. I also send the prototype to players who are not from my gaming group&lt;br /&gt;8. There is some good feedback so that it can be changes somethin? I come back to point 1.&lt;br /&gt;9. If I am really soddisfied I can consider the development phase finished.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;There are a lot to discuss about these points, and I will in future posts.&lt;br /&gt;What I want to highlight now is that there are 2 loops on this phase.&lt;br /&gt;The first is on point 3 and the second on point 8. Both let the process go back to point 1.&lt;br /&gt;But point 1. is to prepare a new prototype, with some relevant changes in order to test these changes.&lt;br /&gt;&lt;br /&gt;Sometimes you don't really need to change the prototype, but only some rules (if you consider rules part of the prototype, you can say that each time you change a rule, you just change the prototype!).&lt;br /&gt;&lt;br /&gt;When I first start with a prototype I try to quick create one. Usually I&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_jb8OelLGbdE/R5-iOPViIsI/AAAAAAAAADo/c8tzj_DA0So/s1600-h/DSCN3041.JPG"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer;" src="http://4.bp.blogspot.com/_jb8OelLGbdE/R5-iOPViIsI/AAAAAAAAADo/c8tzj_DA0So/s200/DSCN3041.JPG" alt="" id="BLOGGER_PHOTO_ID_5161022063508595394" border="0" /&gt;&lt;/a&gt; re-use pieces from other games (there are some boxes on my collection almost empty :-). I have some "preferred" pieces. For instance as score track I tend to use the one from Carcassonne! If I need some colored cards I use them from my Il Principe or I uses some very common Land Cards from Magic the Gathering (they are freely provided by my friend Stefano Rampazzo who owns the boardgame shop &lt;a href="http://www.tempusgames.com/"&gt;Tempus Fugit&lt;/a&gt;).&lt;br /&gt;Because of the proto should be transformed several times, and maybe it will be dismissed because of the idea wasn't good enough, it is a waste of time to prepare a very detailed prototype.&lt;br /&gt;Moreover in the first steps I will be the only one who test the game: I have my ideas in my mind (and in my excercise book) so I should survive to a collage of pieces as prototype!&lt;br /&gt;&lt;br /&gt;In point 6., before to try the game with real players, I try to have a bett&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.faidutti.com/castel/alchimiste.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 200px;" src="http://www.faidutti.com/castel/alchimiste.jpg" alt="" border="0" /&gt;&lt;/a&gt;er proto. This means trying to have not an abstract game, but with a theme (maybe a not definitive one). Anyway I try to focus to have a pretty good playable proto.&lt;br /&gt;This is important, in my opinion, because I want to be sure that problems that will come out can be assign to the game mechanics itself and not to a poor rappresentation of the game.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_jb8OelLGbdE/R58hvfViIrI/AAAAAAAAADg/wwgqm3b7giw/s1600-h/sheeps.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://1.bp.blogspot.com/_jb8OelLGbdE/R58hvfViIrI/AAAAAAAAADg/wwgqm3b7giw/s200/sheeps.jpg" alt="" id="BLOGGER_PHOTO_ID_5160880797739262642" border="0" /&gt;&lt;/a&gt;Again Google Images is coming in help. You just need to search for a "sheep picture" in order to have several good symbols for your Catan like prototype.&lt;br /&gt;Sometime I re-uses artwork from other games (not only mine). I remember I tested Fantasy Pub before the publishing to the Bruno Faidutti's gathering many years ago! And I used some pictures from a Bruno's game! He came close to the table and said smiling: "I think I know this wizard!".&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;So the proto is improved in two different ways:&lt;br /&gt;- the changes of mechanics and rules that must be naturally followed by the change of proto;&lt;br /&gt;- the improvement of the pictures, symbols, components of the proto itself.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2096306182498867614-4281727513102804307?l=www.mindthemove.com%2Fblog' alt='' /&gt;&lt;/div&gt;</description><link>http://www.mindthemove.com/blog/2008/01/prototyping.html</link><author>noreply@blogger.com (Ema)</author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_jb8OelLGbdE/R5-iOPViIsI/AAAAAAAAADo/c8tzj_DA0So/s72-c/DSCN3041.JPG' height='72' width='72'/><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-2096306182498867614.post-8460089935931195222</guid><pubDate>Fri, 25 Jan 2008 12:43:00 +0000</pubDate><atom:updated>2008-01-25T05:12:52.059-08:00</atom:updated><title>What does development means?</title><description>Sometimes I am asked how the ideas for a boardgame comes in my mind.&lt;br /&gt;My answer is that the idea is not the most important thing in order to design a boardgame.&lt;br /&gt;The most difficult and time consuming activity to goal a good boardgame is the playtesting phase.&lt;br /&gt;&lt;br /&gt;It requires a lot of time and tuning of the initial "idea".&lt;br /&gt;I call this phase the development of the idea.&lt;br /&gt;This term is sometimes used for person who is working inside a publisher company and who is responsable of the final release of the game. Probably the most known developer is Stefan Bruek from Alea. I think the german term is "Redaktion".&lt;br /&gt;&lt;br /&gt;There are 2 different meaning for development:&lt;br /&gt;- the development of the playing of the game, that is the development of the idea, the mechanism, the theme;&lt;br /&gt;- the phisic development of the boardgame in order to have a published product, that means the decision on the artwork, on the components, on the package, on the rules.&lt;br /&gt;&lt;br /&gt;Stefan Bruek job is doing both  activities: he first evalute the prototypes, then try to develop with the author the mechanics, the flow of the game. Then when the game concept is ok, he manages the production aspect.&lt;br /&gt;&lt;br /&gt;When I design a game for Mind the Move, I did the same job (helped by my wife Barbara) with the difference that I am the author too!&lt;br /&gt;&lt;br /&gt;As several players already have noticed my games are a good mix of mechanism already seen in other games. So I can answer to the initial question "where comes ideas comes in mind?" with a more precise answers: "playing other games!".&lt;br /&gt;&lt;br /&gt;But after that the development phase starts... And that's the hardest part of this nice hobby!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2096306182498867614-8460089935931195222?l=www.mindthemove.com%2Fblog' alt='' /&gt;&lt;/div&gt;</description><link>http://www.mindthemove.com/blog/2008/01/what-does-development-means.html</link><author>noreply@blogger.com (Ema)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-2096306182498867614.post-5376230738000702546</guid><pubDate>Thu, 24 Jan 2008 15:33:00 +0000</pubDate><atom:updated>2008-01-27T01:03:04.585-08:00</atom:updated><title>The begin of this idea...</title><description>I started my idea to develop the electronic version of boardgames late in 2000.&lt;br /&gt;I was not yet a boardgame author, so I was trying to approach the boardgame world using my software development knowledge.&lt;br /&gt;&lt;br /&gt;I live in Padua  that is only 30 minutes far from Venice where I knew Venice Connection have his office. So I send an email trying to approach VC team with the idea to develop freely a game they published. I was answered by Leo Colovini who invite me to meet him.&lt;br /&gt;We talked a bit about this (rather new for me) world.&lt;br /&gt;&lt;br /&gt;Internet for online games were still not so popular in 2000, but I already had the chance to play Quake and Unreal online using a flat internet connection. I also discovered the Microsoft Zone portal and played a lot to Backgammon (this game also gave me some idea to desing my Fantasy Pub).&lt;br /&gt;I explained  to Leo my idea of an online portal where to play boardgame, following the same model made by Microsoft Zone.&lt;br /&gt;He instead had a different view of the boardgame on the computer: he like the idea to play against an artificial player moved by the computer. He show me his Cartagena, but I had no more time and interest in that project.... even if the idea still remained in my mind...&lt;br /&gt;&lt;br /&gt;At the moment there are several online portals where you can play boardgames.&lt;br /&gt;These are mainly grouped in two categories: Play By Mail (PBM) and Play in real time.&lt;br /&gt;&lt;br /&gt;The most famous for playing in real time is surely &lt;a href="http://www.brettspielwelt.de/"&gt;Brettspielwelt&lt;/a&gt; where a lot of good boardgames are implemented. &lt;a href="http://www.daysofwonder.com/en/play/"&gt;Days of Wonder&lt;/a&gt; has also several games they have published that can be played online. There are some interesting sites where you can play chess as at &lt;a href="http://64squar.es/"&gt;64squar&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;There are also several portals where you can play by mail, like for instance the one implemented by my friend MaBi &lt;a href="http://www.mabiweb.com/"&gt;MaBiWeb&lt;/a&gt; . Another is &lt;a href="http://www.boardgamegeek.com/tigris"&gt;Boardgamegeek &lt;/a&gt;where there you can play Euprhat &amp;amp; Tigris and some other games.  Another one is &lt;a href="http://www.yucata.de/"&gt;Yucata&lt;/a&gt; , but there are many others..&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2096306182498867614-5376230738000702546?l=www.mindthemove.com%2Fblog' alt='' /&gt;&lt;/div&gt;</description><link>http://www.mindthemove.com/blog/2008/01/begin-of-this-idea.html</link><author>noreply@blogger.com (Ema)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-2096306182498867614.post-386844346389509626</guid><pubDate>Wed, 23 Jan 2008 12:38:00 +0000</pubDate><atom:updated>2008-01-23T06:42:49.290-08:00</atom:updated><title>Graph theory and City interconnections</title><description>Yesterday I had an idea about how to use my programming knwoledge for building boardgame prototype.&lt;br /&gt;It's several days I am thinking to one new prototype idea. It is one of the many so I really don't know if it is good or not.&lt;br /&gt;To understand if an idea is good enought to be a real boardgame, I just need to playtest it.&lt;br /&gt;But before to playtest it I need a real protoype.&lt;br /&gt;And to build a prototype is something that can become boring.&lt;br /&gt;Some board are easy to use. Think about a square grid, similar to a chessboard. You just can type in even in a normal word processor using a table and print it.&lt;br /&gt;If you need an hexagonal board you just need more work to do, and you can uses something like PowerPoint or Illustrator.&lt;br /&gt;The clever thing of a protoype is that it doesn't remain as it is thought at first glance. It evolves, it changes. Sometime it is dismissed because the idea was not so good.&lt;br /&gt;&lt;br /&gt;So one of the main problem for me is how to optimize my time. I have few time (even thought it is almost all my spare time) for boardgame developments, so optimizing my time is something essential.&lt;br /&gt;One of the first think I learned is to use software for drawing my prototypes. It is easy to keep track of the modifications, and it is easy to print a new board or a new set of cards.&lt;br /&gt;You just need some starting effort and then you can easly change stuffs inside, print a new version and use it.&lt;br /&gt;It is easier than drawing with a pencil even because you can easly print with color instead of painting with colored pastels.&lt;br /&gt;&lt;br /&gt;But sometimes you just need a complex board, like the one I am thinking in these days: a graph.&lt;br /&gt;It mathematics there is a subset of knowledge that is called Graph Theory. It is used for modelling a city map for insteance (GPS devides are provided with software who manages a "graph" of streets).&lt;br /&gt;Some games that are using a board with graphs?&lt;br /&gt;Ticket to Ride for instance: cities are the nodes, rail tracks are the edges that connects the nodes.&lt;br /&gt;In Hermagor there is a graph of cities and roads too.&lt;br /&gt;&lt;br /&gt;So how to design a graph that can be easly changed?&lt;br /&gt;It is easy to understand that you maybe need more nodes (more cities) or more interconnected edges (more streets).&lt;br /&gt;Sometimes on the edges there is a value. In Ticket to Ride the number of trains that needs to connect two different cities are different and represents the distance between them.&lt;br /&gt;&lt;br /&gt;In my idea I need some values on the edges and also a color! And I have no idea of the number of nodes or edges I need! It will come from playtests.&lt;br /&gt;&lt;br /&gt;The solution should come from a small computer program that can manage these stuffs.&lt;br /&gt;If I can have a kind of empty blackboard where I can add and delete nodes and edges should be fine enough!&lt;br /&gt;I also need to save the graph in order to load it for changes.&lt;br /&gt;I should easly adding a color and a value to both edges and nodes.&lt;br /&gt;I should also adding a random functionality in order to change values and colors randomly.&lt;br /&gt;&lt;br /&gt;Such a kind of program can be useful to other boardgame authors.&lt;br /&gt;&lt;br /&gt;I found an already made program for the graph editor. It is freely downloadable from &lt;a href="http://www.yworks.com/en/products_yed_about.html"&gt;here&lt;/a&gt;. I will check if it is good for this purpose.&lt;br /&gt;&lt;br /&gt;Emanuele&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2096306182498867614-386844346389509626?l=www.mindthemove.com%2Fblog' alt='' /&gt;&lt;/div&gt;</description><link>http://www.mindthemove.com/blog/2008/01/graph-theory-and-city-interconnections.html</link><author>noreply@blogger.com (Ema)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>7</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-2096306182498867614.post-4603747894633596273</guid><pubDate>Wed, 16 Jan 2008 08:41:00 +0000</pubDate><atom:updated>2008-01-16T00:50:55.652-08:00</atom:updated><title>Welcome to Boardgame development</title><description>Hi everyone.&lt;br /&gt;2008 is already started and for this year I have a lot of expectetions and projects in my mind...&lt;br /&gt;Nothing new so far.&lt;br /&gt;But &lt;span style="font-weight: bold;"&gt;ideas &lt;/span&gt;remains ideas if you do not develop in &lt;span style="font-weight: bold;"&gt;things&lt;/span&gt;.&lt;br /&gt;This blog is one of the idea that I want to start in order to become a real thing!&lt;br /&gt;&lt;br /&gt;What this blog is about?&lt;br /&gt;As the title says I want to talk about boardgame development.&lt;br /&gt;But there are 2 ways in which I intend "development".&lt;br /&gt;The first is about to develop a real boardgame. In this field I had already some success because I have &lt;span style="font-weight: bold;"&gt;published &lt;/span&gt;for Mind the Move, Amigo, Rio Grande, Tilsit, QuinedWhiteGoblin some boardgames.&lt;br /&gt;&lt;br /&gt;The second is about to develop a video boardgame. Beacuse of I am a software engineer with almost 9 years of experience in software development, I should be able to develop the &lt;span style="font-weight: bold;"&gt;electronic &lt;/span&gt;version of boardgames.&lt;br /&gt;&lt;br /&gt;Let's see if I will be able to find time to write in this blog for this 2008 and more....&lt;br /&gt;&lt;br /&gt;Ema&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2096306182498867614-4603747894633596273?l=www.mindthemove.com%2Fblog' alt='' /&gt;&lt;/div&gt;</description><link>http://www.mindthemove.com/blog/2008/01/welcome-to-boardgame-development.html</link><author>noreply@blogger.com (Ema)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item></channel></rss>