<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://en.doc.boardgamearena.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Catwillow</id>
	<title>Board Game Arena - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://en.doc.boardgamearena.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Catwillow"/>
	<link rel="alternate" type="text/html" href="https://en.doc.boardgamearena.com/Special:Contributions/Catwillow"/>
	<updated>2026-10-31T16:48:01Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.43.11</generator>
	<entry>
		<id>https://en.doc.boardgamearena.com/index.php?title=Setting_up_BGA_Development_environment_using_VSCode&amp;diff=20536</id>
		<title>Setting up BGA Development environment using VSCode</title>
		<link rel="alternate" type="text/html" href="https://en.doc.boardgamearena.com/index.php?title=Setting_up_BGA_Development_environment_using_VSCode&amp;diff=20536"/>
		<updated>2024-03-21T11:53:12Z</updated>

		<summary type="html">&lt;p&gt;Catwillow: /* PHP Intellisense */  added git command with updated syntax&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Microsoft Visual Studio Code is light weight IDE/Editor. All desktops.&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
&lt;br /&gt;
* Download and install vscode from https://code.visualstudio.com&lt;br /&gt;
* Download and install php (7.4) command line interface (for local tests and debugging)&lt;br /&gt;
&lt;br /&gt;
== Extensions ==&lt;br /&gt;
&lt;br /&gt;
* PHP Intelephense - https://marketplace.visualstudio.com/items?itemName=bmewburn.vscode-intelephense-client&lt;br /&gt;
* Or PHP IntelliSense - https://marketplace.visualstudio.com/items?itemName=zobo.php-intellisense&lt;br /&gt;
* PHP Debug - https://marketplace.visualstudio.com/items?itemName=xdebug.php-debug&lt;br /&gt;
* SQLTools - https://marketplace.visualstudio.com/items?itemName=mtxr.sqltools&lt;br /&gt;
* Prettier - code formatter - https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode&lt;br /&gt;
* SFTP (by Natizyskunk) -  https://marketplace.visualstudio.com/items?itemName=Natizyskunk.sftp&lt;br /&gt;
&lt;br /&gt;
== Intellisense - Navigation/Auto-complete ==&lt;br /&gt;
&lt;br /&gt;
=== JavaScript Intellisense ===&lt;br /&gt;
&lt;br /&gt;
Because of dojo style class/method declarations most IDE won&#039;t be able to index main JavaScript file properly (i.e. go to definition of function and such).&lt;br /&gt;
If you manage to get it working in VS code, let us know how.&lt;br /&gt;
&lt;br /&gt;
There is a way to re-structure code to avoid using this style, but this is not for beginners. Do not use this on your first game!&lt;br /&gt;
https://en.doc.boardgamearena.com/BGA_Studio_Cookbook#Avoiding_code_in_dojo_declare_style&lt;br /&gt;
&lt;br /&gt;
There is also a complete example of a &amp;quot;dojo-less&amp;quot; project, it also includes a (incomplete) typescript definition file (.d.ts) for auto-completion of js BGA interfaces&lt;br /&gt;
https://github.com/elaskavaia/bga-dojoless&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== PHP Intellisense ===&lt;br /&gt;
&lt;br /&gt;
If you don&#039;t do anything PHP will complain about undefined symbols from BGA framework (as well as from the material file).&lt;br /&gt;
To solve the warning about framework issues, you need a stubs for the BGA APIs:&lt;br /&gt;
&lt;br /&gt;
* git clone git@github.com:elaskavaia/bga-sharedcode.git (you can also get and unzip it from the GitHub page) &lt;br /&gt;
** if that doesn&#039;t work, try git clone &amp;lt;nowiki&amp;gt;https://github.com/elaskavaia/bga-sharedcode.git&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
** you can do this in a terminal from VS Code - Terminal menu -&amp;gt; New Terminal&lt;br /&gt;
* add reference (include path) to bga-sharedcode/misc using settings of PHP extension, see example below&lt;br /&gt;
&lt;br /&gt;
If you&#039;re using the Intelephense plugin, add this to global user settings (modify the path obviously)&lt;br /&gt;
&lt;br /&gt;
    &amp;quot;intelephense.environment.includePaths&amp;quot;: [&lt;br /&gt;
        &amp;quot;/home/victoria/git/bga-sharedcode/misc/&amp;quot;&lt;br /&gt;
    ],&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
To solve the warning about the material file class members&lt;br /&gt;
&lt;br /&gt;
Option 1)&lt;br /&gt;
If you don&#039;t have too many class members you can define them, for example if I have $this-&amp;gt;token_types = [...] in the material file I can define them in in the class of game.php&lt;br /&gt;
&lt;br /&gt;
    private $token_types;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Option 2) &lt;br /&gt;
&lt;br /&gt;
Put this line in the settings.json if you using Intelliphense extension to ignore them:&lt;br /&gt;
&lt;br /&gt;
   &amp;quot;intelephense.diagnostics.undefinedProperties&amp;quot;: false&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Unit testing ===&lt;br /&gt;
&lt;br /&gt;
If using phpunit, install it via composer somewhere in home directory, i.e.&lt;br /&gt;
   cd /home/victoria/php-composer&lt;br /&gt;
   composer require --dev phpunit/phpunit ^9&lt;br /&gt;
&lt;br /&gt;
Then add this path (e.x.  /home/victoria/php-composer) to include paths as above&lt;br /&gt;
&lt;br /&gt;
See more about unit testing in [[Testing by developer]]&lt;br /&gt;
&lt;br /&gt;
== File Sync ==&lt;br /&gt;
You can set up your sync using other methods, not related to vscode (such as rsync), if you want to do that see [[Tools_and_tips_of_BGA_Studio#File_Sync]] otherwise see below:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
You might rely on your IDE to sync the files with the SFTP server. Each time you &amp;quot;save&amp;quot; a file with your modifications, the IDE will also submit it to the sFTP server. These are instructions for VS Code&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Install this extension&#039;&#039;&#039; https://marketplace.visualstudio.com/items?itemName=Natizyskunk.sftp (File-&amp;gt;Preferences-&amp;gt;Extensions ... type SFTP and make sure its by Natizyskunk)&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Open VSCode on an empty folder&#039;&#039;&#039; that will be the local root of your project.&lt;br /&gt;
&lt;br /&gt;
* Execute Ctrl+Shift+P on Windows/Linux or Cmd+Shift+P on Mac to open the command palette, and the type/run : &#039;&#039;&#039;&amp;quot;SFTP: config&amp;quot;&#039;&#039;&#039; - the edit will open with json config&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Update the json&#039;&#039;&#039; as below: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;name&amp;quot;: &amp;quot;BGA&amp;quot;,&lt;br /&gt;
    &amp;quot;host&amp;quot;: &amp;quot;1.studio.boardgamearena.com&amp;quot;,&lt;br /&gt;
    &amp;quot;protocol&amp;quot;: &amp;quot;sftp&amp;quot;,&lt;br /&gt;
    &amp;quot;port&amp;quot;: 22,&lt;br /&gt;
    &amp;quot;username&amp;quot;: &amp;quot;&amp;lt;your SFTP username&amp;gt;&amp;quot;,&lt;br /&gt;
    &amp;quot;password&amp;quot;: &amp;quot;&amp;lt;your SFTP password&amp;gt;&amp;quot;,&lt;br /&gt;
    &amp;quot;remotePath&amp;quot;: &amp;quot;/&amp;lt;your project name&amp;gt;/&amp;quot;,&lt;br /&gt;
    &amp;quot;uploadOnSave&amp;quot;: true,&lt;br /&gt;
    &amp;quot;ignore&amp;quot;: [&lt;br /&gt;
        &amp;quot;.vscode&amp;quot;,&lt;br /&gt;
        &amp;quot;.git&amp;quot;,&lt;br /&gt;
        &amp;quot;.DS_Store&amp;quot;&lt;br /&gt;
    ],&lt;br /&gt;
    &amp;quot;syncOption&amp;quot;: {&lt;br /&gt;
        &amp;quot;skipCreate&amp;quot;: false, # syncs new files&lt;br /&gt;
        &amp;quot;delete&amp;quot;: true # syncs deleted files&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== One time only - first sync ===&lt;br /&gt;
&lt;br /&gt;
- Execute Ctrl+Shift+P on Windows/Linux or Cmd+Shift+P on Mac to open the command palette, and the type/run : &#039;&#039;&#039;&amp;quot;SFTP: Download Project&amp;quot;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
This will download all the files locally. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Daily use ===&lt;br /&gt;
&lt;br /&gt;
You don&#039;t have to do anything else! Each time you modify/save a file in VSCode, it will upload it to the SFTP Server.&lt;br /&gt;
&lt;br /&gt;
To force upload to a server, execute Ctrl+Shift+P -&amp;gt; &#039;&#039;&#039;&amp;quot;SFTP: Sync Local -&amp;gt; Remote&amp;quot;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Note: the SFTP sync may fail with a permissions error when create or delete nested folders. To fix this, execute `chmod -R 755 &amp;lt;your directory name&amp;gt;` in your terminal, then force sync to remote.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Split settings for version control ===&lt;br /&gt;
If you want to commit this file to version control, use private key (upload ssh key https://studio.boardgamearena.com/controlpanel) instead and move user/password settings into vscode user settings&lt;br /&gt;
&lt;br /&gt;
I.e. in user setting add this (have to edit settings.js manually, google for location its os specific)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    &amp;quot;remotefs.remote&amp;quot;: {&lt;br /&gt;
        &amp;quot;bgadev&amp;quot;: {&lt;br /&gt;
            &amp;quot;name&amp;quot;: &amp;quot;BGA&amp;quot;,&lt;br /&gt;
            &amp;quot;host&amp;quot;: &amp;quot;1.studio.boardgamearena.com&amp;quot;,&lt;br /&gt;
            &amp;quot;protocol&amp;quot;: &amp;quot;sftp&amp;quot;,&lt;br /&gt;
            &amp;quot;port&amp;quot;: 22,&lt;br /&gt;
            &amp;quot;username&amp;quot;: &amp;quot;&amp;lt;yourdevusername&amp;gt;&amp;quot;,&lt;br /&gt;
            &amp;quot;privateKeyPath&amp;quot;: &amp;quot;~/.ssh/id_rsa&amp;quot;,&lt;br /&gt;
        },&lt;br /&gt;
      }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
in project folder sftp.json (replace &amp;lt;yourproject&amp;gt; with project name)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;remote&amp;quot;: &amp;quot;bgadev&amp;quot;,&lt;br /&gt;
    &amp;quot;remotePath&amp;quot;: &amp;quot;/&amp;lt;yourproject&amp;gt;/&amp;quot;,&lt;br /&gt;
    &amp;quot;uploadOnSave&amp;quot;: true,&lt;br /&gt;
    &amp;quot;ignore&amp;quot;: [&lt;br /&gt;
        &amp;quot;.git&amp;quot;&lt;br /&gt;
    ],&lt;br /&gt;
    &amp;quot;syncOption&amp;quot;: {&lt;br /&gt;
        &amp;quot;skipCreate&amp;quot;: false, &lt;br /&gt;
        &amp;quot;delete&amp;quot;: true &lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;watcher&amp;quot;: {&lt;br /&gt;
        &amp;quot;files&amp;quot;: &amp;quot;**/*.{js,css}&amp;quot;,&lt;br /&gt;
        &amp;quot;autoUpload&amp;quot;: true,&lt;br /&gt;
        &amp;quot;autoDelete&amp;quot;: true&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note: you don&#039;t need watcher section if you don&#039;t use code generators, but its needed if you use typescript, scss or similar code generator tools.&lt;br /&gt;
&lt;br /&gt;
== Code Formatter ==&lt;br /&gt;
I think Prettier has better format, you can install Prettier plugin to do the formatting, for PHP add the following in package.json&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;devDependencies&amp;quot;: {&lt;br /&gt;
    &amp;quot;@prettier/plugin-php&amp;quot;: &amp;quot;^0.19.1&amp;quot;,&lt;br /&gt;
    &amp;quot;prettier&amp;quot;: &amp;quot;^2.7.1&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;prettier&amp;quot;: {&lt;br /&gt;
    &amp;quot;braceStyle&amp;quot;: &amp;quot;1tbs&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
== Code generators ==&lt;br /&gt;
If you want to run code generators for example for typescript or scss you can install this extension:&lt;br /&gt;
* https://marketplace.visualstudio.com/items?itemName=emeraldwalk.RunOnSave &lt;br /&gt;
&lt;br /&gt;
In settings.json add these (example only):&lt;br /&gt;
    &amp;quot;emeraldwalk.runonsave&amp;quot;: {&lt;br /&gt;
        &amp;quot;commands&amp;quot;: [&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;match&amp;quot;: &amp;quot;.*\\.ts$&amp;quot;,&lt;br /&gt;
                &amp;quot;isAsync&amp;quot;: true,&lt;br /&gt;
                &amp;quot;cmd&amp;quot;: &amp;quot;npm run build:ts&amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;match&amp;quot;: &amp;quot;.*\\.scss$&amp;quot;,&lt;br /&gt;
                &amp;quot;isAsync&amp;quot;: true,&lt;br /&gt;
                &amp;quot;cmd&amp;quot;: &amp;quot;npm run build:scss&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
        ]&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
In this example &amp;lt;code&amp;gt;build:ts&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;build:scss&amp;lt;/code&amp;gt; are scripts configured via package.json&lt;br /&gt;
&lt;br /&gt;
Another example - you can run php script that will generate material.inc.php from misc/xxx_material.csv&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;match&amp;quot;: &amp;quot;misc/.*material\\.csv$&amp;quot;,&lt;br /&gt;
        &amp;quot;isAsync&amp;quot;: true,&lt;br /&gt;
        &amp;quot;cmd&amp;quot;: &amp;quot;php7.4 ${env.HOME}/git/bga-sharedcode/misc/genmat.php ${file}&amp;quot;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
== User templates ==&lt;br /&gt;
&lt;br /&gt;
You can define user template to avoid writing boilerplate code, here is example of php template for states&lt;br /&gt;
(it is placed in global location php.json - you can open it from the gui File-&amp;gt;Preferences-&amp;gt;Configure User Snippets and type php&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;Single player state&amp;quot;: {&lt;br /&gt;
    &amp;quot;prefix&amp;quot;: [&amp;quot;state&amp;quot;, &amp;quot;playerstate&amp;quot;],&lt;br /&gt;
&lt;br /&gt;
    &amp;quot;body&amp;quot;: [&lt;br /&gt;
      &amp;quot;$LINE_COMMENT playerTurn${1:something}&amp;quot;,&lt;br /&gt;
      &amp;quot;${1/(.*)/STATE_PLAYER_TURN_${1:/upcase}/} =&amp;gt; [&amp;quot;,&lt;br /&gt;
      &amp;quot;&#039;name&#039; =&amp;gt; &#039;playerTurn${1:something}&#039;,&amp;quot;,&lt;br /&gt;
      &amp;quot;&#039;description&#039; =&amp;gt; clienttranslate(&#039;\\${actplayer} must ${1:something}&#039;),&amp;quot;,&lt;br /&gt;
      &amp;quot;&#039;descriptionmyturn&#039; =&amp;gt; clienttranslate(&#039;\\${you} must ${1:something}&#039;),&amp;quot;,&lt;br /&gt;
      &amp;quot;&#039;type&#039; =&amp;gt; &#039;activeplayer&#039;,&amp;quot;,&lt;br /&gt;
      &amp;quot;&#039;args&#039;=&amp;gt;&#039;arg_playerTurn${1:something}&#039;,&amp;quot;,&lt;br /&gt;
      &amp;quot;&#039;action&#039;=&amp;gt;&#039;st_playerTurn${1:something}&#039;,&amp;quot;,&lt;br /&gt;
      &amp;quot;&#039;possibleactions&#039; =&amp;gt; [ &#039;playCard&#039;, &#039;pass&#039; ],&amp;quot;,&lt;br /&gt;
      &amp;quot;&#039;transitions&#039; =&amp;gt; [&amp;quot;,&lt;br /&gt;
      &amp;quot;&#039;next&#039; =&amp;gt; STATE_GAME_TURN_NEXT_PLAYER,&amp;quot;,&lt;br /&gt;
      &amp;quot;&#039;loopback&#039; =&amp;gt; ${1/(.*)/STATE_PLAYER_TURN_${1:/upcase}/} ]&amp;quot;,&lt;br /&gt;
      &amp;quot;],&amp;quot;&lt;br /&gt;
    ],&lt;br /&gt;
&lt;br /&gt;
    &amp;quot;description&amp;quot;: &amp;quot;Create single player state defition, use tab to fill template parameters&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;Multiple player state&amp;quot;: {&lt;br /&gt;
    &amp;quot;prefix&amp;quot;: [&amp;quot;mstate&amp;quot;, &amp;quot;multiplayerstate&amp;quot;],&lt;br /&gt;
&lt;br /&gt;
    &amp;quot;body&amp;quot;: [&lt;br /&gt;
      &amp;quot;$LINE_COMMENT mplayerTurn${1:something}&amp;quot;,&lt;br /&gt;
      &amp;quot;${1/(.*)/STATE_MPLAYER_TURN_${1:/upcase}/} =&amp;gt; [&amp;quot;,&lt;br /&gt;
      &amp;quot;&#039;name&#039; =&amp;gt; &#039;mplayerTurn${1:something}&#039;,&amp;quot;,&lt;br /&gt;
      &amp;quot;&#039;description&#039; =&amp;gt; clienttranslate(&#039;Other players must ${1:something}&#039;),&amp;quot;,&lt;br /&gt;
      &amp;quot;&#039;descriptionmyturn&#039; =&amp;gt; clienttranslate(&#039;\\${you} must ${1:something}&#039;),&amp;quot;,&lt;br /&gt;
      &amp;quot;&#039;type&#039; =&amp;gt; &#039;multipleactiveplayer&#039;,&amp;quot;,&lt;br /&gt;
      &amp;quot;&#039;args&#039;=&amp;gt;&#039;arg_mplayerTurn${1:something}&#039;,&amp;quot;,&lt;br /&gt;
      &amp;quot;&#039;action&#039;=&amp;gt;&#039;stMakeEveryoneActive&#039;,&amp;quot;,&lt;br /&gt;
      &amp;quot;&#039;possibleactions&#039; =&amp;gt; [ &#039;playCard&#039;, &#039;pass&#039; ],&amp;quot;,&lt;br /&gt;
      &amp;quot;&#039;transitions&#039; =&amp;gt; [&amp;quot;,&lt;br /&gt;
      &amp;quot;&#039;next&#039; =&amp;gt; STATE_GAME_TURN_NEXT_MPLAYER,&amp;quot;,&lt;br /&gt;
      &amp;quot;&#039;loopback&#039; =&amp;gt; ${1/(.*)/STATE_MPLAYER_TURN_${1:/upcase}/} ]&amp;quot;,&lt;br /&gt;
      &amp;quot;],&amp;quot;&lt;br /&gt;
    ],&lt;br /&gt;
&lt;br /&gt;
    &amp;quot;description&amp;quot;: &amp;quot;Create multi player state defition, use tab to fill template parameters&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;Action in action.php&amp;quot;: {&lt;br /&gt;
    &amp;quot;prefix&amp;quot;: [&amp;quot;action&amp;quot;],&lt;br /&gt;
    &amp;quot;body&amp;quot;: [&lt;br /&gt;
      &amp;quot;public function ${1:actionName}() {&amp;quot;,&lt;br /&gt;
      &amp;quot;\tself::setAjaxMode();&amp;quot;,&lt;br /&gt;
      &amp;quot;\t\\$${2:arg} = self::getArg(&#039;${2:arg}&#039;, AT_posint, false, 0);&amp;quot;,&lt;br /&gt;
      &amp;quot;\t\\$this-&amp;gt;game-&amp;gt;action_${1:actionName}(\\$${2:arg});&amp;quot;,&lt;br /&gt;
      &amp;quot;\tself::ajaxResponse();&amp;quot;,&lt;br /&gt;
      &amp;quot;}&amp;quot;&lt;br /&gt;
    ]&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;Player loop in game.php&amp;quot;: {&lt;br /&gt;
    &amp;quot;prefix&amp;quot;: [&amp;quot;players&amp;quot;],&lt;br /&gt;
    &amp;quot;body&amp;quot;: [&lt;br /&gt;
      &amp;quot;\\$players = \\$this-&amp;gt;loadPlayersBasicInfos();&amp;quot;,&lt;br /&gt;
      &amp;quot;foreach (\\$players as \\$player_id =&amp;gt; \\$player_info) {&amp;quot;,&lt;br /&gt;
      &amp;quot;${1}&amp;quot;,&lt;br /&gt;
      &amp;quot;}&amp;quot;&lt;br /&gt;
    ]&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Studio]]&lt;/div&gt;</summary>
		<author><name>Catwillow</name></author>
	</entry>
	<entry>
		<id>https://en.doc.boardgamearena.com/index.php?title=Gamehelpbutterfly&amp;diff=19797</id>
		<title>Gamehelpbutterfly</title>
		<link rel="alternate" type="text/html" href="https://en.doc.boardgamearena.com/index.php?title=Gamehelpbutterfly&amp;diff=19797"/>
		<updated>2024-02-02T15:48:26Z</updated>

		<summary type="html">&lt;p&gt;Catwillow: /* Gameplay */  clarified turning rule&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[https://www.boardgamegeek.com/boardgame/284229/butterfly Butterfly] is simple tile set collection game by Rio Grande.  You take the hedgehog from tile to tile scoring points for the tiles you collect.&lt;br /&gt;
&lt;br /&gt;
== Gameplay ==&lt;br /&gt;
&lt;br /&gt;
The player to the left of the starting player places the hedgehog on any tile.&lt;br /&gt;
&lt;br /&gt;
Players then take turns. On your turn, you first turn the hedgehog to its left or right, or keep it pointing as is, but may not reverse it. You then must move the hedgehog to any tile which is in a straight line ahead of it, in the direction it is now facing. So no move can ever be in the opposite direction of the previous move.&lt;br /&gt;
&lt;br /&gt;
You can skip over empty spaces to reach the tile. When you land on a tile, you collect it.&lt;br /&gt;
&lt;br /&gt;
Some spaces on the board have Butterfly Nets, which are revealed when tiles are collected.  If the hedgehog moves over an exposed butterfly net, the player may immediately choose to draw and score a random tile from the bag.&lt;br /&gt;
&lt;br /&gt;
=== Scoring ===&lt;br /&gt;
[[File:Scoring.jpg|Scoring Chart]]&lt;br /&gt;
&lt;br /&gt;
*Butterflies score the number of points shown. (There are also colored x2 multipliers which multiply the score in that colour)&lt;br /&gt;
*Dragonflies score only the highest dragonfly collected.&lt;br /&gt;
*Lightning bugs score only the lowest lightning bug collected.&lt;br /&gt;
*Grasshoppers score only the last grasshopper collected, previous tiles are discarded.&lt;br /&gt;
*Flowers are each worth the number of collected flowers. (Example: if you have 4 flowers, each flower is worth 4 points = a total of 16 points in flowers.)&lt;br /&gt;
*For each Bee which you can pair with a Honeycomb, the Bee scores 0 and the Honeycomb scores the printed value.&lt;br /&gt;
**Bees are worth -3 without a Honeycomb to live in.&lt;br /&gt;
**Honeycombs are worth 0 points without a bee to live in them.&lt;br /&gt;
*Wasps are worth negative points as shown on each wasp tile.&lt;br /&gt;
&lt;br /&gt;
=== End Game ===&lt;br /&gt;
The game is over when the hedgehog can no longer be moved. The player with the highest score at that time wins!&lt;/div&gt;</summary>
		<author><name>Catwillow</name></author>
	</entry>
	<entry>
		<id>https://en.doc.boardgamearena.com/index.php?title=Gamehelpluckynumbers&amp;diff=19233</id>
		<title>Gamehelpluckynumbers</title>
		<link rel="alternate" type="text/html" href="https://en.doc.boardgamearena.com/index.php?title=Gamehelpluckynumbers&amp;diff=19233"/>
		<updated>2023-12-17T00:34:37Z</updated>

		<summary type="html">&lt;p&gt;Catwillow: /* Game play */  explained play options&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
&lt;br /&gt;
Lucky Numbers is a simple game of luck mixed with thinking ahead.&lt;br /&gt;
&lt;br /&gt;
== Objective ==&lt;br /&gt;
&lt;br /&gt;
* The objective is to make a full grid of 16 number tiles.&lt;br /&gt;
* The numbers in each row must increase from left to right, and the numbers in each column must increase from top to bottom.&lt;br /&gt;
* You cannot have the same number twice in a row or column.&lt;br /&gt;
&lt;br /&gt;
Example of a completed grid:&lt;br /&gt;
&lt;br /&gt;
[[File:Lucky numbers.jpg|Lucky numbers.jpg]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Single Round&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* The first player to fill their grid wins.&lt;br /&gt;
&lt;br /&gt;
==== Tournament Mode ====&lt;br /&gt;
The game is played multiple times with each player getting a chance to go first.&lt;br /&gt;
* The winner of each round earns two points.&lt;br /&gt;
* The other players lose one point for each empty space on their grid.&lt;br /&gt;
Highest total score wins.&lt;br /&gt;
&lt;br /&gt;
== Game play ==&lt;br /&gt;
&lt;br /&gt;
* For each player, a set of 20 tiles numbered from 1 to 20 are shuffled together, and each player starts with 4 distinct numbers in a diagonal line. (In the &amp;quot;easy setup&amp;quot; option, the first four tiles for the diagonal spaces are automatically drawn and placed in ascending order from least in the top left to greatest in the bottom right. With the &amp;quot;Michael&#039;s setup&amp;quot; option, the first four tiles are drawn one at a time and placed one by one on the diagonal according to the player&#039;s choice.)&lt;br /&gt;
* The remaining tiles (16 from each set) are mixed together in one pot. &lt;br /&gt;
* At the beginning of each of your turns, you may either draw a random tile from the pot or take a tile from the table (if there are any).&lt;br /&gt;
* You may play the tile you have as long as it is higher than each tile before it in the same row and column, and lower than each tile after it in the same row and column. &lt;br /&gt;
* If you take a tile from the table, you must play it.&lt;br /&gt;
* To play a tile, you may either play it in an empty space or replace an existing tile on your grid.&lt;br /&gt;
* If you replace a tile on your grid, or choose to discard a drawn tile, that tile goes onto the table.&lt;br /&gt;
* Normally the next player then takes their turn, but in &amp;quot;Bruno&#039;s variant&amp;quot; if you place a tile diagonally adjacent to a tile with the same number then you immediately get another turn. In this way, you can take several turns in a row.&lt;/div&gt;</summary>
		<author><name>Catwillow</name></author>
	</entry>
	<entry>
		<id>https://en.doc.boardgamearena.com/index.php?title=Gamehelpthebuilders&amp;diff=19119</id>
		<title>Gamehelpthebuilders</title>
		<link rel="alternate" type="text/html" href="https://en.doc.boardgamearena.com/index.php?title=Gamehelpthebuilders&amp;diff=19119"/>
		<updated>2023-12-08T15:50:35Z</updated>

		<summary type="html">&lt;p&gt;Catwillow: /* Tie Breakers */ corrected tiebreaker condition and removed incorrect note&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== The Goal ==&lt;br /&gt;
&lt;br /&gt;
You must get the most victory points by using your workers to construct buildings.&lt;br /&gt;
&lt;br /&gt;
== Content ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Cards&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
There are 84 cards:&lt;br /&gt;
&lt;br /&gt;
* 34 Building cards plus 8 machines&lt;br /&gt;
* 42 Workers cards&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Coins&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
There are 40 coins:&lt;br /&gt;
&lt;br /&gt;
* 15 Golden Coins (Value 5)&lt;br /&gt;
* 25 Silver Coins (Value 1)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Note: You will earn 1 victory point for every 10 coins at the end of the game&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Playing the Game ==&lt;br /&gt;
&lt;br /&gt;
On your turn you get to play 3 actions. If you wish you can pay 5 coins per each additional action.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;The Actions&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Start Construction&lt;br /&gt;
# Recruit a Worker&lt;br /&gt;
# Send a Worker&lt;br /&gt;
# Take Coins&lt;br /&gt;
&lt;br /&gt;
=== Start Construction ===&lt;br /&gt;
(Cost 1 action)&lt;br /&gt;
&lt;br /&gt;
You can choose one building from the 5 open Building cards. Immediately replace the card with the top card from the building deck. You may repeat this action as long as you have actions during your turn. (Remember that for every 5 coins you pay to the bank you can get 1 more action)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Machines&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
A machine is built as a building and is worth victory points but when you build a machine it is treated as a worker that does not require payment for its work.&lt;br /&gt;
&lt;br /&gt;
=== Recruit a Worker ===&lt;br /&gt;
(Cost 1 action)&lt;br /&gt;
&lt;br /&gt;
You can choose one worker from the 5 open Worker cards. Immediately replace the card with the top card from the worker deck. You may repeat this action as long as you have actions during your turn. (Remember that for every 5 coins you pay to the bank you can get 1 more action)&lt;br /&gt;
&lt;br /&gt;
=== Send a Worker to Work ===&lt;br /&gt;
(variable action cost)&lt;br /&gt;
&lt;br /&gt;
When you send a worker you must pay the number of coins in the upper right corner of the Worker card. Once you send a worker to work on a building it can not move until the building is complete.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Action cost of sending a Worker&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
In addition to paying the coin cost on the card, the action cost of sending a worker increases for each worker you send to that same building during your turn.&lt;br /&gt;
&lt;br /&gt;
First worker sent to the building this turn = 1 action (regardless of the amount of workers already working on the building)&lt;br /&gt;
&lt;br /&gt;
Second worker sent to that building = 2 more actions (for a total of 3)&lt;br /&gt;
&lt;br /&gt;
Third worker sent to that building = 3 more actions (for a total of 6)&lt;br /&gt;
&lt;br /&gt;
And so on...&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Finishing a Building&#039;&#039;&#039; &#039;&#039;(is not an action)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
For completing the building you need to add workers until all of the requirements for the building are met or exceeded. You will earn the amount of coins shown on the building card from the bank and the amount of victory points.&lt;br /&gt;
&lt;br /&gt;
=== Take Coins ===&lt;br /&gt;
(variable action cost)&lt;br /&gt;
&lt;br /&gt;
You can take Coins from the bank:&lt;br /&gt;
&lt;br /&gt;
* For 1 action you can take 1 Coin&lt;br /&gt;
* For 2 actions you can take 3 Coins&lt;br /&gt;
* For 3 actions you can take 6 Coins&lt;br /&gt;
&lt;br /&gt;
== End of the Game ==&lt;br /&gt;
&lt;br /&gt;
When a player gets 17 victory points from building alone (not coins) the game will end after each player finish their turn for that round. The player with the most amount of victory points will win the game, this time adding 1 more victory point for every 10 coins to the victory point received from the buildings and machines.&lt;br /&gt;
&lt;br /&gt;
=== Tie Breakers ===&lt;br /&gt;
&lt;br /&gt;
If there is a tie where both players have the same number of victory points, then the winner is whoever has more VPs from buildings alone (including machines, but not coins).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If there is still a tie, then the winner is whoever has more coins.&lt;br /&gt;
If there is still a tie, the game is drawn.&lt;/div&gt;</summary>
		<author><name>Catwillow</name></author>
	</entry>
</feed>