<?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=Lymon+Flowers</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=Lymon+Flowers"/>
	<link rel="alternate" type="text/html" href="https://en.doc.boardgamearena.com/Special:Contributions/Lymon_Flowers"/>
	<updated>2026-11-06T19:07:53Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.43.11</generator>
	<entry>
		<id>https://en.doc.boardgamearena.com/index.php?title=File:Bga_button_play_online.png&amp;diff=26483</id>
		<title>File:Bga button play online.png</title>
		<link rel="alternate" type="text/html" href="https://en.doc.boardgamearena.com/index.php?title=File:Bga_button_play_online.png&amp;diff=26483"/>
		<updated>2025-09-17T08:51:17Z</updated>

		<summary type="html">&lt;p&gt;Lymon Flowers: Lymon Flowers uploaded a new version of File:Bga button play online.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Lymon Flowers</name></author>
	</entry>
	<entry>
		<id>https://en.doc.boardgamearena.com/index.php?title=Production_issues_reporting&amp;diff=25131</id>
		<title>Production issues reporting</title>
		<link rel="alternate" type="text/html" href="https://en.doc.boardgamearena.com/index.php?title=Production_issues_reporting&amp;diff=25131"/>
		<updated>2025-05-26T16:22:55Z</updated>

		<summary type="html">&lt;p&gt;Lymon Flowers: Add redirect&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Studio logs]]BGA implemented several production issues reporting tools:&lt;br /&gt;
&lt;br /&gt;
* Syntax errors reporting&lt;br /&gt;
* Unexpected errors reporting&lt;br /&gt;
* Backend &amp;amp; frontend issues reporting&lt;br /&gt;
&lt;br /&gt;
All of these are available at the bottom of your game studio page.  Access your game studio page (for instance: [https://studio.boardgamearena.com/studiogame?game=medina https://studio.boardgamearena.com/studiogame?game=xxx]) and scroll to the &amp;quot;&#039;&#039;&#039;Errors in production&#039;&#039;&#039;&amp;quot; block:&lt;br /&gt;
&lt;br /&gt;
[[File:Error_reporting.png|frameless|600x600px]]&lt;br /&gt;
&lt;br /&gt;
== Syntax errors reporting ==&lt;br /&gt;
This is the simplest reporting tool.  It only reports PHP syntax errors.  When clicking on the button, you will be redirected to a page that lists all game servers and will display any syntax error.  Any of these is a fatal error and should be addressed with a new release.&lt;br /&gt;
&lt;br /&gt;
== Unexpected errors reporting ==&lt;br /&gt;
Same as the previous tool.  It redirects to another report page that shows recent PHP (backend) errors.  Only an error message with a PHP stack trace is shown for each message.  For instance:&lt;br /&gt;
 18/05 20:07:17 [error] [TXXX] [A.B.C.D] [XXX/YYY] Error (1213) while processing SQL request: Deadlock found when trying to get lock; try restarting transaction - Request: SELECT global_id, global_value FROM global WHERE 1   &lt;br /&gt;
 18/05 20:07:17 [error] [TXXXX] [A.B.C.D] [XXX/YYY] Unexpected exception: mysql_deadlock_restart_transaction (BGA service error 1747591637)&lt;br /&gt;
 #0 /var/tournoi/release/tournoi-250505-1448-gs/www/Bga/GameFramework/Old/APP_DbObject.php(34): Bga\Services\Db-&amp;gt;query(&#039;...&#039;)&lt;br /&gt;
 #1 /var/tournoi/release/tournoi-250505-1448-gs/www/Bga/GameFramework/TableInfos.php(125): Bga\GameFramework\Old\APP_DbObject::DbQuery(&#039;...&#039;)&lt;br /&gt;
 #2 /var/tournoi/release/tournoi-250505-1448-gs/www/Bga/GameFramework/TableInfos.php(91): Bga\GameFramework\TableInfos-&amp;gt;getGlobalsFromDB(false)&lt;br /&gt;
 #3 /var/tournoi/release/tournoi-250505-1448-gs/www/Bga/GameFramework/TableInfos.php(69): Bga\GameFramework\TableInfos-&amp;gt;db_load(false)&lt;br /&gt;
 #4 /var/tournoi/release/tournoi-250505-1448-gs/www/Bga/GameFramework/GameAction.php(80): Bga\GameFramework\TableInfos-&amp;gt;get(false)&lt;br /&gt;
 #5 /var/tournoi/release/tournoi-250505-1448-gs/www/Bga/GameFramework/GameAction.php(31): Bga\GameFramework\GameAction-&amp;gt;initGameTableObjects()&lt;br /&gt;
 #6 /var/tournoi/release/tournoi-250505-1448-gs/vendor/php-di/php-di/src/Definition/Resolver/ObjectCreator.php(129): Bga\GameFramework\GameAction-&amp;gt;__construct()&lt;br /&gt;
 #7 /var/tournoi/release/tournoi-250505-1448-gs/vendor/php-di/php-di/src/Definition/Resolver/ObjectCreator.php(56): DI\Definition\Resolver\ObjectCreator-&amp;gt;createInstance(Object(DI\Definition\ObjectDefinition), Array)&lt;br /&gt;
 #8 /var/tournoi/release/tournoi-250505-1448-gs/vendor/php-di/php-di/src/Definition/Resolver/ResolverDispatcher.php(62): DI\Definition\Resolver\ObjectCreator-&amp;gt;resolve(Object(DI\Definition\ObjectDefinition), Array)&lt;br /&gt;
 #9 /var/tournoi/release/tournoi-250505-1448-gs/vendor/php-di/php-di/src/Container.php(354): DI\Definition\Resolver\ResolverDispatcher-&amp;gt;resolve(Object(DI\Definition\ObjectDefinition), Array)&lt;br /&gt;
 #10 /var/tournoi/release/tournoi-250505-1448-gs/vendor/php-di/php-di/src/Container.php(184): DI\Container-&amp;gt;resolveDefinition(Object(DI\Definition\ObjectDefinition), Array)&lt;br /&gt;
 #11 /var/tournoi/release/tournoi-250505-1448-gs/www/include/webActionCore.inc.php(201): DI\Container-&amp;gt;make(&#039;...&#039;)&lt;br /&gt;
 #12 /var/tournoi/release/tournoi-250505-1448-gs/www/index.php(262): launchWebAction(&#039;...&#039;, &#039;...&#039;, &#039;...&#039;, false, false, NULL, true, false)&lt;br /&gt;
 #13 {main}&lt;br /&gt;
Errors are unformatted and no statistics whatsoever are made.  This tools is pretty raw but very low level without any filtering.&lt;br /&gt;
&lt;br /&gt;
== Backend &amp;amp; frontend issues reporting ==&lt;br /&gt;
This is the next generation reporting tool.  It is based on Sentry, a tool that aggregates any frontend and backend errors encountered by users.  It allows modern statistics and gives more context.&lt;br /&gt;
&lt;br /&gt;
When clicking on this button, you will be redirect to another interface that allows basic Sentry querying.&lt;br /&gt;
&lt;br /&gt;
=== Sentry concepts ===&lt;br /&gt;
When an error or a warning is caught, information is sent to Sentry in the form of an event, which is processed.  Sentry then as the following concepts:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Event&#039;&#039;&#039;: an error or warning that triggered either in the user browser or in one of BGA servers&lt;br /&gt;
* &#039;&#039;&#039;Issue:&#039;&#039;&#039; all events are attached to an issue.  Sentry figures out how to merge then depending on the place the event has taken place in the code.  Hence, false positive could happen&lt;br /&gt;
* &#039;&#039;&#039;Issue  ID&#039;&#039;&#039;: a unique value assigned to an issue.&lt;br /&gt;
* &#039;&#039;&#039;Project:&#039;&#039;&#039; a software module.  We currently have two projects that are exposed to the studio developers: &#039;&#039;gameserver-js&#039;&#039; (frontend) and gameserver (&#039;&#039;backend&#039;&#039;)&lt;br /&gt;
* &#039;&#039;&#039;Tags:&#039;&#039;&#039; metadata associated to an event, like browser version, user ID, etc.  They are used to provide statistics in the issues page.&lt;br /&gt;
* &#039;&#039;&#039;Release:&#039;&#039;&#039; a release is a package name and a version name.  It helps knowing when an issue appears, then narrowing down its cause.  There are two releases set on BGA: mainsite release (our code) and game release (your code)&lt;br /&gt;
&lt;br /&gt;
==== Views ====&lt;br /&gt;
The sentry viewer offer several views.&lt;br /&gt;
&lt;br /&gt;
===== Issues list view =====&lt;br /&gt;
This is the landing view, it shows an issue list after a brief query on the Sentry server.&lt;br /&gt;
&lt;br /&gt;
It is possible to filter out the project, depending on when you want to obtain frontend, backend or both errors (left red rectangle on the screenshot).&lt;br /&gt;
&lt;br /&gt;
In the event of more than 25 issues, it is possible to paginate over them (right red rectangle).  Ordering can also be changed, it can be:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;number of events:&#039;&#039;&#039; the more, the more impactful this issue is.&lt;br /&gt;
* &#039;&#039;&#039;last seen:&#039;&#039;&#039; last time an event has been added to this issue.  The more ancient, the more likely it is fixed.&lt;br /&gt;
* &#039;&#039;&#039;first seen:&#039;&#039;&#039; first time an event has been recorded into this issue.  This is valuable to understand when a bug was introduced (for instance, if that matches a release date)&lt;br /&gt;
* &#039;&#039;&#039;trend:&#039;&#039;&#039; Sentry &amp;quot;magic&amp;quot; ordering to determine which issues are currently gaining momentum.&lt;br /&gt;
&lt;br /&gt;
[[File:Issues list.png|frameless|600x600px]]&lt;br /&gt;
&lt;br /&gt;
Issues contain the following fields:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;ID:&#039;&#039;&#039; Sentry internal ID regarding this event.  It is unique and starts with the project name.  Hence, &amp;quot;&amp;lt;code&amp;gt;GAMESERVER-JS-XXX&amp;lt;/code&amp;gt;&amp;quot; is an error related to frontend (javascript)&lt;br /&gt;
* &#039;&#039;&#039;Type:&#039;&#039;&#039; error, warning or sometimes, it contains the name of the exceptions raised&lt;br /&gt;
* &#039;&#039;&#039;Description:&#039;&#039;&#039; short description, normally the same error as the user experienced if that was not a silent error&lt;br /&gt;
* &#039;&#039;&#039;Seen:&#039;&#039;&#039; first and last times this issue has been encountered&lt;br /&gt;
* &#039;&#039;&#039;Status:&#039;&#039;&#039;  number of events (🏴) and users (👤) affected by this.&lt;br /&gt;
&lt;br /&gt;
Please note that we tried hard to limit false positives into this list, but, mainly for frontend errors, some errors can be &amp;quot;ours&amp;quot; and not your code.  This can be guessed in the next screen if the stack is empty.&lt;br /&gt;
&lt;br /&gt;
===== Issue detail view =====&lt;br /&gt;
This view shows the details of an issue.  As every &amp;quot;specific&amp;quot; data is attached to an event and not an issue, this view chooses by default an event (latest one) and uses its data to fill in some fields (for instance, tags).  If you navigate between events (see next view), this data is subjected to change.&lt;br /&gt;
&lt;br /&gt;
[[File:Issue details.png|frameless|785x785px]]&lt;br /&gt;
&lt;br /&gt;
This page is separated into several blocks.&lt;br /&gt;
&lt;br /&gt;
====== Main information ======&lt;br /&gt;
[[File:Issue main informations.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
This contains the main information of the issue, as seen in issues list:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Type of error&#039;&#039;&#039; (warning, error, exception name, etc.)&lt;br /&gt;
* &#039;&#039;&#039;Description of error&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Error ID&#039;&#039;&#039;&lt;br /&gt;
* More detailed information and counters:&lt;br /&gt;
** &#039;&#039;&#039;Priority:&#039;&#039;&#039; Sentry estimate of the criticality of this issue&lt;br /&gt;
** &#039;&#039;&#039;Count:&#039;&#039;&#039; number of events&lt;br /&gt;
** &#039;&#039;&#039;User count:&#039;&#039;&#039; approximate number of users impacted by this issue&lt;br /&gt;
** &#039;&#039;&#039;First seen&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Last seen&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
====== Culprit ======&lt;br /&gt;
[[File:Issue culprit.png|frameless]]&lt;br /&gt;
This summarizes where and the issue happens, with a source file position and a release.&lt;br /&gt;
&lt;br /&gt;
====== Stack trace ======&lt;br /&gt;
[[File:Issue stack trace.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
This block contains information particularly useful to debug an issue.  By default, only stack trace elements pertaining to the game code are shown.  It is possible for frontend errors to toggle this behavior and show BGA frontend stack trace elements.&lt;br /&gt;
&lt;br /&gt;
Every element of the stack trace is clickable to see a hint on exactly when the execution was.  Please note that some of this code is minified and hence is not very readable.  However, it can still provide useful information.  We plan to perhaps unminify this code later.&lt;br /&gt;
&lt;br /&gt;
====== Request ======&lt;br /&gt;
[[File:Issue request details.png|frameless]]&lt;br /&gt;
This block contains details on the request, namely:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;URL:&#039;&#039;&#039; complete URL of the request, but without the query string&lt;br /&gt;
* &#039;&#039;&#039;Method:&#039;&#039;&#039; could be &amp;lt;code&amp;gt;GET&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;POST&amp;lt;/code&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Query:&#039;&#039;&#039; all query parameters if any&lt;br /&gt;
&lt;br /&gt;
====== Tags ======&lt;br /&gt;
[[File:Issue tags.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
List any relevant tags regarding this event.&lt;br /&gt;
&lt;br /&gt;
====== Statistics ======&lt;br /&gt;
[[File:Issue statistics - histogram.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
This block contains an histogram of the issue events depending, either during last day or last month.  Every bar is clickable.&lt;br /&gt;
&lt;br /&gt;
[[File:Issue statistics.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
Then, we have donuts-like statistics with a breakdown of the first 10 occurrences for:&lt;br /&gt;
&lt;br /&gt;
* browsers&lt;br /&gt;
* device family&lt;br /&gt;
* OSes&lt;br /&gt;
* users&lt;br /&gt;
* tables&lt;br /&gt;
&lt;br /&gt;
The more a stats impacts a browser, user or device brand, the more it is suspect that the issue is specific to them.&lt;br /&gt;
&lt;br /&gt;
===== Events list view =====&lt;br /&gt;
[[File:Issue events list.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
When clicking on the &amp;quot;Other events&amp;quot; tab, you will see the following view, which allows you to inspect a specific event.  Usually, it is not needed since default event provides enough context, but it can still be used to compare several events.&lt;/div&gt;</summary>
		<author><name>Lymon Flowers</name></author>
	</entry>
	<entry>
		<id>https://en.doc.boardgamearena.com/index.php?title=Studio_logs&amp;diff=25130</id>
		<title>Studio logs</title>
		<link rel="alternate" type="text/html" href="https://en.doc.boardgamearena.com/index.php?title=Studio_logs&amp;diff=25130"/>
		<updated>2025-05-26T16:22:18Z</updated>

		<summary type="html">&lt;p&gt;Lymon Flowers: Merge with Production issues reporting&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Studio_Framework_Navigation}}&lt;br /&gt;
&lt;br /&gt;
BGA implemented several production issues reporting tools:&lt;br /&gt;
* Syntax errors reporting&lt;br /&gt;
* Unexpected errors reporting&lt;br /&gt;
*Backend &amp;amp; frontend issues reporting&lt;br /&gt;
All of these are available at the bottom of your game studio page.  Access your game studio page (for instance: [https://studio.boardgamearena.com/studiogame?game=medina https://studio.boardgamearena.com/studiogame?game=xxx]) and scroll to the &amp;quot;&#039;&#039;&#039;Errors in production&#039;&#039;&#039;&amp;quot; block:&lt;br /&gt;
== BGA request&amp;amp;SQL logs ==&lt;br /&gt;
&lt;br /&gt;
This log is useful:&lt;br /&gt;
* When you want to check what SQL requests has been built during a request.&lt;br /&gt;
* When you want to debug your PHP code using &amp;quot;self::trace&amp;quot;&lt;br /&gt;
* When you want to know why a request takes too much time.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On this log, you can see:&lt;br /&gt;
&lt;br /&gt;
=== Your requests ===&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
  20/06 21:50:56 [info] [T403] [4/mytest0] /cinco/cinco/exchange4Cards.html?id=4&amp;amp;lock=97d1c7a1-903a-4d1f-8206-de39ce8204fc&amp;amp;table=403&amp;amp;testuser=4&amp;amp;dojo.preventCache=1371757856044&lt;br /&gt;
&lt;br /&gt;
Note that the best way to check your Ajax request is to read the [[http://en.doc.boardgamearena.com/Tools_and_tips_of_BGA_Studio#Input.2FOutput_debugging_section Input/Output section]].&lt;br /&gt;
&lt;br /&gt;
=== Request responses ===&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
  20/06 21:50:56 [notice] [T403] [4/mytest0] OK-0 169 d141 c8 e0 I9 A158 V0 T0 /cinco/cinco/exchange4Cards.html?id=4&amp;amp;lock=97d1c7a1-903a-4d1f-8206-de39ce8204fc&amp;amp;table=403&amp;amp;testuser=4&amp;amp;dojo.preventCache=1371757856044&lt;br /&gt;
&lt;br /&gt;
You can recognize a response because it contains [notice]. Usually, there is one response for each request.&lt;br /&gt;
&lt;br /&gt;
Let&#039;s details the beginning of the log:&lt;br /&gt;
* 20/06 21:50:56: the date&lt;br /&gt;
* [notice]&lt;br /&gt;
* [T403]: this is a log from table 403&lt;br /&gt;
* [4/mytest0]: this is use &amp;quot;mytest0&amp;quot;, with id 4&lt;br /&gt;
* OK-0: it means that the request ended up successfully, with no exception (expected or unexpected).&lt;br /&gt;
* 169: this is the time taken to process the request (169ms).&lt;br /&gt;
* d141: this is the total Database time used to process the request (141ms).&lt;br /&gt;
&lt;br /&gt;
=== SQL requests ===&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
  20/06 21:50:56 [info] [T403] [4/mytest0] 0.26 SELECT player_tokenColor FROM player WHERE player_id =&#039;4&#039;&lt;br /&gt;
&lt;br /&gt;
All requests to Database are traced in this log. You can see here the time take by the request (0,26ms).&lt;br /&gt;
&lt;br /&gt;
=== Custom trace ===&lt;br /&gt;
&lt;br /&gt;
You can use special PHP methods in your PHP code to left some trace in this log:&lt;br /&gt;
* $this-&amp;gt;trace( &amp;quot;your message here&amp;quot; );    // Display &amp;quot;your message here&amp;quot; in the log&lt;br /&gt;
* $this-&amp;gt;dump( &amp;quot;My variable&amp;quot;, $variable_to_dump );   // Display the content of $variable_to_dump in the log&lt;br /&gt;
&lt;br /&gt;
== BGA unexpected exceptions logs ==&lt;br /&gt;
&lt;br /&gt;
In this log you can check the last Unexpected exceptions from your game.&lt;br /&gt;
&lt;br /&gt;
Exceptions management on PHP side [[http://en.doc.boardgamearena.com/Main_game_logic:_yourgamename.game.php#Managing_errors_and_exceptions is described here]].&lt;br /&gt;
&lt;br /&gt;
The log displayed the complete stacktrace of the exception, so you can debug it.&lt;br /&gt;
&lt;br /&gt;
The SQL log is very verbose and sometimes it too hard to extract your tracing from it, in this case you can use error log for tracing temporarily.&lt;br /&gt;
You can add debug statement using self::warn() which will appear in that the log. Do not leave these tracing method calls after you done debugging unless they&lt;br /&gt;
are real warnings or errors (only the error log level will appear in production).&lt;br /&gt;
&lt;br /&gt;
== BGA Production Logs ==&lt;br /&gt;
&lt;br /&gt;
=== How to access production server exception logs ===&lt;br /&gt;
&lt;br /&gt;
# Navigate to your game page on the Studio website&lt;br /&gt;
## e.g. &amp;lt;nowiki&amp;gt;https://studio.boardgamearena.com/studiogame?game=YOURGAMEID&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
# Scroll to the bottom of the page&lt;br /&gt;
# Click the `Display recent errors from production` button&lt;br /&gt;
## [[File:How-to-access-bga-production-server-logs.png|500px]]&lt;br /&gt;
==Backend &amp;amp; frontend issues reporting==&lt;br /&gt;
This is the next generation reporting tool.  It is based on Sentry, a tool that aggregates any frontend and backend errors encountered by users.  It allows modern statistics and gives more context.&lt;br /&gt;
&lt;br /&gt;
When clicking on this button, you will be redirect to another interface that allows basic Sentry querying.&lt;br /&gt;
===Sentry concepts===&lt;br /&gt;
When an error or a warning is caught, information is sent to Sentry in the form of an event, which is processed.  Sentry then as the following concepts:&lt;br /&gt;
*&#039;&#039;&#039;Event&#039;&#039;&#039;: an error or warning that triggered either in the user browser or in one of BGA servers&lt;br /&gt;
*&#039;&#039;&#039;Issue:&#039;&#039;&#039; all events are attached to an issue.  Sentry figures out how to merge then depending on the place the event has taken place in the code.  Hence, false positive could happen&lt;br /&gt;
*&#039;&#039;&#039;Issue  ID&#039;&#039;&#039;: a unique value assigned to an issue.&lt;br /&gt;
*&#039;&#039;&#039;Project:&#039;&#039;&#039; a software module.  We currently have two projects that are exposed to the studio developers: &#039;&#039;gameserver-js&#039;&#039; (frontend) and gameserver (&#039;&#039;backend&#039;&#039;)&lt;br /&gt;
*&#039;&#039;&#039;Tags:&#039;&#039;&#039; metadata associated to an event, like browser version, user ID, etc.  They are used to provide statistics in the issues page.&lt;br /&gt;
*&#039;&#039;&#039;Release:&#039;&#039;&#039; a release is a package name and a version name.  It helps knowing when an issue appears, then narrowing down its cause.  There are two releases set on BGA: mainsite release (our code) and game release (your code)&lt;br /&gt;
====Views====&lt;br /&gt;
The sentry viewer offer several views.&lt;br /&gt;
=====Issues list view=====&lt;br /&gt;
This is the landing view, it shows an issue list after a brief query on the Sentry server.&lt;br /&gt;
&lt;br /&gt;
It is possible to filter out the project, depending on when you want to obtain frontend, backend or both errors (left red rectangle on the screenshot).&lt;br /&gt;
&lt;br /&gt;
In the event of more than 25 issues, it is possible to paginate over them (right red rectangle).  Ordering can also be changed, it can be:&lt;br /&gt;
*&#039;&#039;&#039;number of events:&#039;&#039;&#039; the more, the more impactful this issue is.&lt;br /&gt;
*&#039;&#039;&#039;last seen:&#039;&#039;&#039; last time an event has been added to this issue.  The more ancient, the more likely it is fixed.&lt;br /&gt;
*&#039;&#039;&#039;first seen:&#039;&#039;&#039; first time an event has been recorded into this issue.  This is valuable to understand when a bug was introduced (for instance, if that matches a release date)&lt;br /&gt;
*&#039;&#039;&#039;trend:&#039;&#039;&#039; Sentry &amp;quot;magic&amp;quot; ordering to determine which issues are currently gaining momentum.&lt;br /&gt;
[[File:Issues list.png|frameless|600x600px]]&lt;br /&gt;
&lt;br /&gt;
Issues contain the following fields:&lt;br /&gt;
*&#039;&#039;&#039;ID:&#039;&#039;&#039; Sentry internal ID regarding this event.  It is unique and starts with the project name.  Hence, &amp;quot;&amp;lt;code&amp;gt;GAMESERVER-JS-XXX&amp;lt;/code&amp;gt;&amp;quot; is an error related to frontend (javascript)&lt;br /&gt;
*&#039;&#039;&#039;Type:&#039;&#039;&#039; error, warning or sometimes, it contains the name of the exceptions raised&lt;br /&gt;
*&#039;&#039;&#039;Description:&#039;&#039;&#039; short description, normally the same error as the user experienced if that was not a silent error&lt;br /&gt;
*&#039;&#039;&#039;Seen:&#039;&#039;&#039; first and last times this issue has been encountered&lt;br /&gt;
*&#039;&#039;&#039;Status:&#039;&#039;&#039;  number of events (🏴) and users (👤) affected by this.&lt;br /&gt;
Please note that we tried hard to limit false positives into this list, but, mainly for frontend errors, some errors can be &amp;quot;ours&amp;quot; and not your code.  This can be guessed in the next screen if the stack is empty.&lt;br /&gt;
=====Issue detail view=====&lt;br /&gt;
This view shows the details of an issue.  As every &amp;quot;specific&amp;quot; data is attached to an event and not an issue, this view chooses by default an event (latest one) and uses its data to fill in some fields (for instance, tags).  If you navigate between events (see next view), this data is subjected to change.&lt;br /&gt;
&lt;br /&gt;
[[File:Issue details.png|frameless|785x785px]]&lt;br /&gt;
&lt;br /&gt;
This page is separated into several blocks.&lt;br /&gt;
======Main information======&lt;br /&gt;
[[File:Issue main informations.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
This contains the main information of the issue, as seen in issues list:&lt;br /&gt;
*&#039;&#039;&#039;Type of error&#039;&#039;&#039; (warning, error, exception name, etc.)&lt;br /&gt;
*&#039;&#039;&#039;Description of error&#039;&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;Error ID&#039;&#039;&#039;&lt;br /&gt;
*More detailed information and counters:&lt;br /&gt;
**&#039;&#039;&#039;Priority:&#039;&#039;&#039; Sentry estimate of the criticality of this issue&lt;br /&gt;
**&#039;&#039;&#039;Count:&#039;&#039;&#039; number of events&lt;br /&gt;
**&#039;&#039;&#039;User count:&#039;&#039;&#039; approximate number of users impacted by this issue&lt;br /&gt;
**&#039;&#039;&#039;First seen&#039;&#039;&#039;&lt;br /&gt;
**&#039;&#039;&#039;Last seen&#039;&#039;&#039;&lt;br /&gt;
======Culprit======&lt;br /&gt;
[[File:Issue culprit.png|frameless]] This summarizes where and the issue happens, with a source file position and a release.&lt;br /&gt;
======Stack trace======&lt;br /&gt;
[[File:Issue stack trace.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
This block contains information particularly useful to debug an issue.  By default, only stack trace elements pertaining to the game code are shown.  It is possible for frontend errors to toggle this behavior and show BGA frontend stack trace elements.&lt;br /&gt;
&lt;br /&gt;
Every element of the stack trace is clickable to see a hint on exactly when the execution was.  Please note that some of this code is minified and hence is not very readable.  However, it can still provide useful information.  We plan to perhaps unminify this code later.&lt;br /&gt;
======Request======&lt;br /&gt;
[[File:Issue request details.png|frameless]] This block contains details on the request, namely:&lt;br /&gt;
*&#039;&#039;&#039;URL:&#039;&#039;&#039; complete URL of the request, but without the query string&lt;br /&gt;
*&#039;&#039;&#039;Method:&#039;&#039;&#039; could be &amp;lt;code&amp;gt;GET&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;POST&amp;lt;/code&amp;gt;&lt;br /&gt;
*&#039;&#039;&#039;Query:&#039;&#039;&#039; all query parameters if any&lt;br /&gt;
======Tags======&lt;br /&gt;
[[File:Issue tags.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
List any relevant tags regarding this event.&lt;br /&gt;
======Statistics======&lt;br /&gt;
[[File:Issue statistics - histogram.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
This block contains an histogram of the issue events depending, either during last day or last month.  Every bar is clickable.&lt;br /&gt;
&lt;br /&gt;
[[File:Issue statistics.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
Then, we have donuts-like statistics with a breakdown of the first 10 occurrences for:&lt;br /&gt;
*browsers&lt;br /&gt;
*device family&lt;br /&gt;
*OSes&lt;br /&gt;
*users&lt;br /&gt;
*tables&lt;br /&gt;
The more a stats impacts a browser, user or device brand, the more it is suspect that the issue is specific to them.&lt;br /&gt;
=====Events list view=====&lt;br /&gt;
[[File:Issue events list.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
When clicking on the &amp;quot;Other events&amp;quot; tab, you will see the following view, which allows you to inspect a specific event.  Usually, it is not needed since default event provides enough context, but it can still be used to compare several events.&lt;br /&gt;
[[Category:Studio]]&lt;/div&gt;</summary>
		<author><name>Lymon Flowers</name></author>
	</entry>
	<entry>
		<id>https://en.doc.boardgamearena.com/index.php?title=Production_issues_reporting&amp;diff=25050</id>
		<title>Production issues reporting</title>
		<link rel="alternate" type="text/html" href="https://en.doc.boardgamearena.com/index.php?title=Production_issues_reporting&amp;diff=25050"/>
		<updated>2025-05-21T15:57:43Z</updated>

		<summary type="html">&lt;p&gt;Lymon Flowers: /* Events list view */ Add event list page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;BGA implemented several production issues reporting tools:&lt;br /&gt;
&lt;br /&gt;
* Syntax errors reporting&lt;br /&gt;
* Unexpected errors reporting&lt;br /&gt;
* Backend &amp;amp; frontend issues reporting&lt;br /&gt;
&lt;br /&gt;
All of these are available at the bottom of your game studio page.  Access your game studio page (for instance: [https://studio.boardgamearena.com/studiogame?game=medina https://studio.boardgamearena.com/studiogame?game=xxx]) and scroll to the &amp;quot;&#039;&#039;&#039;Errors in production&#039;&#039;&#039;&amp;quot; block:&lt;br /&gt;
&lt;br /&gt;
[[File:Error_reporting.png|frameless|600x600px]]&lt;br /&gt;
&lt;br /&gt;
== Syntax errors reporting ==&lt;br /&gt;
This is the simplest reporting tool.  It only reports PHP syntax errors.  When clicking on the button, you will be redirected to a page that lists all game servers and will display any syntax error.  Any of these is a fatal error and should be addressed with a new release.&lt;br /&gt;
&lt;br /&gt;
== Unexpected errors reporting ==&lt;br /&gt;
Same as the previous tool.  It redirects to another report page that shows recent PHP (backend) errors.  Only an error message with a PHP stack trace is shown for each message.  For instance:&lt;br /&gt;
 18/05 20:07:17 [error] [TXXX] [A.B.C.D] [XXX/YYY] Error (1213) while processing SQL request: Deadlock found when trying to get lock; try restarting transaction - Request: SELECT global_id, global_value FROM global WHERE 1   &lt;br /&gt;
 18/05 20:07:17 [error] [TXXXX] [A.B.C.D] [XXX/YYY] Unexpected exception: mysql_deadlock_restart_transaction (BGA service error 1747591637)&lt;br /&gt;
 #0 /var/tournoi/release/tournoi-250505-1448-gs/www/Bga/GameFramework/Old/APP_DbObject.php(34): Bga\Services\Db-&amp;gt;query(&#039;...&#039;)&lt;br /&gt;
 #1 /var/tournoi/release/tournoi-250505-1448-gs/www/Bga/GameFramework/TableInfos.php(125): Bga\GameFramework\Old\APP_DbObject::DbQuery(&#039;...&#039;)&lt;br /&gt;
 #2 /var/tournoi/release/tournoi-250505-1448-gs/www/Bga/GameFramework/TableInfos.php(91): Bga\GameFramework\TableInfos-&amp;gt;getGlobalsFromDB(false)&lt;br /&gt;
 #3 /var/tournoi/release/tournoi-250505-1448-gs/www/Bga/GameFramework/TableInfos.php(69): Bga\GameFramework\TableInfos-&amp;gt;db_load(false)&lt;br /&gt;
 #4 /var/tournoi/release/tournoi-250505-1448-gs/www/Bga/GameFramework/GameAction.php(80): Bga\GameFramework\TableInfos-&amp;gt;get(false)&lt;br /&gt;
 #5 /var/tournoi/release/tournoi-250505-1448-gs/www/Bga/GameFramework/GameAction.php(31): Bga\GameFramework\GameAction-&amp;gt;initGameTableObjects()&lt;br /&gt;
 #6 /var/tournoi/release/tournoi-250505-1448-gs/vendor/php-di/php-di/src/Definition/Resolver/ObjectCreator.php(129): Bga\GameFramework\GameAction-&amp;gt;__construct()&lt;br /&gt;
 #7 /var/tournoi/release/tournoi-250505-1448-gs/vendor/php-di/php-di/src/Definition/Resolver/ObjectCreator.php(56): DI\Definition\Resolver\ObjectCreator-&amp;gt;createInstance(Object(DI\Definition\ObjectDefinition), Array)&lt;br /&gt;
 #8 /var/tournoi/release/tournoi-250505-1448-gs/vendor/php-di/php-di/src/Definition/Resolver/ResolverDispatcher.php(62): DI\Definition\Resolver\ObjectCreator-&amp;gt;resolve(Object(DI\Definition\ObjectDefinition), Array)&lt;br /&gt;
 #9 /var/tournoi/release/tournoi-250505-1448-gs/vendor/php-di/php-di/src/Container.php(354): DI\Definition\Resolver\ResolverDispatcher-&amp;gt;resolve(Object(DI\Definition\ObjectDefinition), Array)&lt;br /&gt;
 #10 /var/tournoi/release/tournoi-250505-1448-gs/vendor/php-di/php-di/src/Container.php(184): DI\Container-&amp;gt;resolveDefinition(Object(DI\Definition\ObjectDefinition), Array)&lt;br /&gt;
 #11 /var/tournoi/release/tournoi-250505-1448-gs/www/include/webActionCore.inc.php(201): DI\Container-&amp;gt;make(&#039;...&#039;)&lt;br /&gt;
 #12 /var/tournoi/release/tournoi-250505-1448-gs/www/index.php(262): launchWebAction(&#039;...&#039;, &#039;...&#039;, &#039;...&#039;, false, false, NULL, true, false)&lt;br /&gt;
 #13 {main}&lt;br /&gt;
Errors are unformatted and no statistics whatsoever are made.  This tools is pretty raw but very low level without any filtering.&lt;br /&gt;
&lt;br /&gt;
== Backend &amp;amp; frontend issues reporting ==&lt;br /&gt;
This is the next generation reporting tool.  It is based on Sentry, a tool that aggregates any frontend and backend errors encountered by users.  It allows modern statistics and gives more context.&lt;br /&gt;
&lt;br /&gt;
When clicking on this button, you will be redirect to another interface that allows basic Sentry querying.&lt;br /&gt;
&lt;br /&gt;
=== Sentry concepts ===&lt;br /&gt;
When an error or a warning is caught, information is sent to Sentry in the form of an event, which is processed.  Sentry then as the following concepts:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Event&#039;&#039;&#039;: an error or warning that triggered either in the user browser or in one of BGA servers&lt;br /&gt;
* &#039;&#039;&#039;Issue:&#039;&#039;&#039; all events are attached to an issue.  Sentry figures out how to merge then depending on the place the event has taken place in the code.  Hence, false positive could happen&lt;br /&gt;
* &#039;&#039;&#039;Issue  ID&#039;&#039;&#039;: a unique value assigned to an issue.&lt;br /&gt;
* &#039;&#039;&#039;Project:&#039;&#039;&#039; a software module.  We currently have two projects that are exposed to the studio developers: &#039;&#039;gameserver-js&#039;&#039; (frontend) and gameserver (&#039;&#039;backend&#039;&#039;)&lt;br /&gt;
* &#039;&#039;&#039;Tags:&#039;&#039;&#039; metadata associated to an event, like browser version, user ID, etc.  They are used to provide statistics in the issues page.&lt;br /&gt;
* &#039;&#039;&#039;Release:&#039;&#039;&#039; a release is a package name and a version name.  It helps knowing when an issue appears, then narrowing down its cause.  There are two releases set on BGA: mainsite release (our code) and game release (your code)&lt;br /&gt;
&lt;br /&gt;
==== Views ====&lt;br /&gt;
The sentry viewer offer several views.&lt;br /&gt;
&lt;br /&gt;
===== Issues list view =====&lt;br /&gt;
This is the landing view, it shows an issue list after a brief query on the Sentry server.&lt;br /&gt;
&lt;br /&gt;
It is possible to filter out the project, depending on when you want to obtain frontend, backend or both errors (left red rectangle on the screenshot).&lt;br /&gt;
&lt;br /&gt;
In the event of more than 25 issues, it is possible to paginate over them (right red rectangle).  Ordering can also be changed, it can be:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;number of events:&#039;&#039;&#039; the more, the more impactful this issue is.&lt;br /&gt;
* &#039;&#039;&#039;last seen:&#039;&#039;&#039; last time an event has been added to this issue.  The more ancient, the more likely it is fixed.&lt;br /&gt;
* &#039;&#039;&#039;first seen:&#039;&#039;&#039; first time an event has been recorded into this issue.  This is valuable to understand when a bug was introduced (for instance, if that matches a release date)&lt;br /&gt;
* &#039;&#039;&#039;trend:&#039;&#039;&#039; Sentry &amp;quot;magic&amp;quot; ordering to determine which issues are currently gaining momentum.&lt;br /&gt;
&lt;br /&gt;
[[File:Issues list.png|frameless|600x600px]]&lt;br /&gt;
&lt;br /&gt;
Issues contain the following fields:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;ID:&#039;&#039;&#039; Sentry internal ID regarding this event.  It is unique and starts with the project name.  Hence, &amp;quot;&amp;lt;code&amp;gt;GAMESERVER-JS-XXX&amp;lt;/code&amp;gt;&amp;quot; is an error related to frontend (javascript)&lt;br /&gt;
* &#039;&#039;&#039;Type:&#039;&#039;&#039; error, warning or sometimes, it contains the name of the exceptions raised&lt;br /&gt;
* &#039;&#039;&#039;Description:&#039;&#039;&#039; short description, normally the same error as the user experienced if that was not a silent error&lt;br /&gt;
* &#039;&#039;&#039;Seen:&#039;&#039;&#039; first and last times this issue has been encountered&lt;br /&gt;
* &#039;&#039;&#039;Status:&#039;&#039;&#039;  number of events (🏴) and users (👤) affected by this.&lt;br /&gt;
&lt;br /&gt;
Please note that we tried hard to limit false positives into this list, but, mainly for frontend errors, some errors can be &amp;quot;ours&amp;quot; and not your code.  This can be guessed in the next screen if the stack is empty.&lt;br /&gt;
&lt;br /&gt;
===== Issue detail view =====&lt;br /&gt;
This view shows the details of an issue.  As every &amp;quot;specific&amp;quot; data is attached to an event and not an issue, this view chooses by default an event (latest one) and uses its data to fill in some fields (for instance, tags).  If you navigate between events (see next view), this data is subjected to change.&lt;br /&gt;
&lt;br /&gt;
[[File:Issue details.png|frameless|785x785px]]&lt;br /&gt;
&lt;br /&gt;
This page is separated into several blocks.&lt;br /&gt;
&lt;br /&gt;
====== Main information ======&lt;br /&gt;
[[File:Issue main informations.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
This contains the main information of the issue, as seen in issues list:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Type of error&#039;&#039;&#039; (warning, error, exception name, etc.)&lt;br /&gt;
* &#039;&#039;&#039;Description of error&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Error ID&#039;&#039;&#039;&lt;br /&gt;
* More detailed information and counters:&lt;br /&gt;
** &#039;&#039;&#039;Priority:&#039;&#039;&#039; Sentry estimate of the criticality of this issue&lt;br /&gt;
** &#039;&#039;&#039;Count:&#039;&#039;&#039; number of events&lt;br /&gt;
** &#039;&#039;&#039;User count:&#039;&#039;&#039; approximate number of users impacted by this issue&lt;br /&gt;
** &#039;&#039;&#039;First seen&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Last seen&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
====== Culprit ======&lt;br /&gt;
[[File:Issue culprit.png|frameless]]&lt;br /&gt;
This summarizes where and the issue happens, with a source file position and a release.&lt;br /&gt;
&lt;br /&gt;
====== Stack trace ======&lt;br /&gt;
[[File:Issue stack trace.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
This block contains information particularly useful to debug an issue.  By default, only stack trace elements pertaining to the game code are shown.  It is possible for frontend errors to toggle this behavior and show BGA frontend stack trace elements.&lt;br /&gt;
&lt;br /&gt;
Every element of the stack trace is clickable to see a hint on exactly when the execution was.  Please note that some of this code is minified and hence is not very readable.  However, it can still provide useful information.  We plan to perhaps unminify this code later.&lt;br /&gt;
&lt;br /&gt;
====== Request ======&lt;br /&gt;
[[File:Issue request details.png|frameless]]&lt;br /&gt;
This block contains details on the request, namely:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;URL:&#039;&#039;&#039; complete URL of the request, but without the query string&lt;br /&gt;
* &#039;&#039;&#039;Method:&#039;&#039;&#039; could be &amp;lt;code&amp;gt;GET&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;POST&amp;lt;/code&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Query:&#039;&#039;&#039; all query parameters if any&lt;br /&gt;
&lt;br /&gt;
====== Tags ======&lt;br /&gt;
[[File:Issue tags.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
List any relevant tags regarding this event.&lt;br /&gt;
&lt;br /&gt;
====== Statistics ======&lt;br /&gt;
[[File:Issue statistics - histogram.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
This block contains an histogram of the issue events depending, either during last day or last month.  Every bar is clickable.&lt;br /&gt;
&lt;br /&gt;
[[File:Issue statistics.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
Then, we have donuts-like statistics with a breakdown of the first 10 occurrences for:&lt;br /&gt;
&lt;br /&gt;
* browsers&lt;br /&gt;
* device family&lt;br /&gt;
* OSes&lt;br /&gt;
* users&lt;br /&gt;
* tables&lt;br /&gt;
&lt;br /&gt;
The more a stats impacts a browser, user or device brand, the more it is suspect that the issue is specific to them.&lt;br /&gt;
&lt;br /&gt;
===== Events list view =====&lt;br /&gt;
[[File:Issue events list.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
When clicking on the &amp;quot;Other events&amp;quot; tab, you will see the following view, which allows you to inspect a specific event.  Usually, it is not needed since default event provides enough context, but it can still be used to compare several events.&lt;/div&gt;</summary>
		<author><name>Lymon Flowers</name></author>
	</entry>
	<entry>
		<id>https://en.doc.boardgamearena.com/index.php?title=File:Issue_events_list.png&amp;diff=25049</id>
		<title>File:Issue events list.png</title>
		<link rel="alternate" type="text/html" href="https://en.doc.boardgamearena.com/index.php?title=File:Issue_events_list.png&amp;diff=25049"/>
		<updated>2025-05-21T15:56:38Z</updated>

		<summary type="html">&lt;p&gt;Lymon Flowers: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Issue events list&lt;/div&gt;</summary>
		<author><name>Lymon Flowers</name></author>
	</entry>
	<entry>
		<id>https://en.doc.boardgamearena.com/index.php?title=Production_issues_reporting&amp;diff=25048</id>
		<title>Production issues reporting</title>
		<link rel="alternate" type="text/html" href="https://en.doc.boardgamearena.com/index.php?title=Production_issues_reporting&amp;diff=25048"/>
		<updated>2025-05-21T15:53:03Z</updated>

		<summary type="html">&lt;p&gt;Lymon Flowers: /* Issue detail view */ More screenshots on issue details&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;BGA implemented several production issues reporting tools:&lt;br /&gt;
&lt;br /&gt;
* Syntax errors reporting&lt;br /&gt;
* Unexpected errors reporting&lt;br /&gt;
* Backend &amp;amp; frontend issues reporting&lt;br /&gt;
&lt;br /&gt;
All of these are available at the bottom of your game studio page.  Access your game studio page (for instance: [https://studio.boardgamearena.com/studiogame?game=medina https://studio.boardgamearena.com/studiogame?game=xxx]) and scroll to the &amp;quot;&#039;&#039;&#039;Errors in production&#039;&#039;&#039;&amp;quot; block:&lt;br /&gt;
&lt;br /&gt;
[[File:Error_reporting.png|frameless|600x600px]]&lt;br /&gt;
&lt;br /&gt;
== Syntax errors reporting ==&lt;br /&gt;
This is the simplest reporting tool.  It only reports PHP syntax errors.  When clicking on the button, you will be redirected to a page that lists all game servers and will display any syntax error.  Any of these is a fatal error and should be addressed with a new release.&lt;br /&gt;
&lt;br /&gt;
== Unexpected errors reporting ==&lt;br /&gt;
Same as the previous tool.  It redirects to another report page that shows recent PHP (backend) errors.  Only an error message with a PHP stack trace is shown for each message.  For instance:&lt;br /&gt;
 18/05 20:07:17 [error] [TXXX] [A.B.C.D] [XXX/YYY] Error (1213) while processing SQL request: Deadlock found when trying to get lock; try restarting transaction - Request: SELECT global_id, global_value FROM global WHERE 1   &lt;br /&gt;
 18/05 20:07:17 [error] [TXXXX] [A.B.C.D] [XXX/YYY] Unexpected exception: mysql_deadlock_restart_transaction (BGA service error 1747591637)&lt;br /&gt;
 #0 /var/tournoi/release/tournoi-250505-1448-gs/www/Bga/GameFramework/Old/APP_DbObject.php(34): Bga\Services\Db-&amp;gt;query(&#039;...&#039;)&lt;br /&gt;
 #1 /var/tournoi/release/tournoi-250505-1448-gs/www/Bga/GameFramework/TableInfos.php(125): Bga\GameFramework\Old\APP_DbObject::DbQuery(&#039;...&#039;)&lt;br /&gt;
 #2 /var/tournoi/release/tournoi-250505-1448-gs/www/Bga/GameFramework/TableInfos.php(91): Bga\GameFramework\TableInfos-&amp;gt;getGlobalsFromDB(false)&lt;br /&gt;
 #3 /var/tournoi/release/tournoi-250505-1448-gs/www/Bga/GameFramework/TableInfos.php(69): Bga\GameFramework\TableInfos-&amp;gt;db_load(false)&lt;br /&gt;
 #4 /var/tournoi/release/tournoi-250505-1448-gs/www/Bga/GameFramework/GameAction.php(80): Bga\GameFramework\TableInfos-&amp;gt;get(false)&lt;br /&gt;
 #5 /var/tournoi/release/tournoi-250505-1448-gs/www/Bga/GameFramework/GameAction.php(31): Bga\GameFramework\GameAction-&amp;gt;initGameTableObjects()&lt;br /&gt;
 #6 /var/tournoi/release/tournoi-250505-1448-gs/vendor/php-di/php-di/src/Definition/Resolver/ObjectCreator.php(129): Bga\GameFramework\GameAction-&amp;gt;__construct()&lt;br /&gt;
 #7 /var/tournoi/release/tournoi-250505-1448-gs/vendor/php-di/php-di/src/Definition/Resolver/ObjectCreator.php(56): DI\Definition\Resolver\ObjectCreator-&amp;gt;createInstance(Object(DI\Definition\ObjectDefinition), Array)&lt;br /&gt;
 #8 /var/tournoi/release/tournoi-250505-1448-gs/vendor/php-di/php-di/src/Definition/Resolver/ResolverDispatcher.php(62): DI\Definition\Resolver\ObjectCreator-&amp;gt;resolve(Object(DI\Definition\ObjectDefinition), Array)&lt;br /&gt;
 #9 /var/tournoi/release/tournoi-250505-1448-gs/vendor/php-di/php-di/src/Container.php(354): DI\Definition\Resolver\ResolverDispatcher-&amp;gt;resolve(Object(DI\Definition\ObjectDefinition), Array)&lt;br /&gt;
 #10 /var/tournoi/release/tournoi-250505-1448-gs/vendor/php-di/php-di/src/Container.php(184): DI\Container-&amp;gt;resolveDefinition(Object(DI\Definition\ObjectDefinition), Array)&lt;br /&gt;
 #11 /var/tournoi/release/tournoi-250505-1448-gs/www/include/webActionCore.inc.php(201): DI\Container-&amp;gt;make(&#039;...&#039;)&lt;br /&gt;
 #12 /var/tournoi/release/tournoi-250505-1448-gs/www/index.php(262): launchWebAction(&#039;...&#039;, &#039;...&#039;, &#039;...&#039;, false, false, NULL, true, false)&lt;br /&gt;
 #13 {main}&lt;br /&gt;
Errors are unformatted and no statistics whatsoever are made.  This tools is pretty raw but very low level without any filtering.&lt;br /&gt;
&lt;br /&gt;
== Backend &amp;amp; frontend issues reporting ==&lt;br /&gt;
This is the next generation reporting tool.  It is based on Sentry, a tool that aggregates any frontend and backend errors encountered by users.  It allows modern statistics and gives more context.&lt;br /&gt;
&lt;br /&gt;
When clicking on this button, you will be redirect to another interface that allows basic Sentry querying.&lt;br /&gt;
&lt;br /&gt;
=== Sentry concepts ===&lt;br /&gt;
When an error or a warning is caught, information is sent to Sentry in the form of an event, which is processed.  Sentry then as the following concepts:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Event&#039;&#039;&#039;: an error or warning that triggered either in the user browser or in one of BGA servers&lt;br /&gt;
* &#039;&#039;&#039;Issue:&#039;&#039;&#039; all events are attached to an issue.  Sentry figures out how to merge then depending on the place the event has taken place in the code.  Hence, false positive could happen&lt;br /&gt;
* &#039;&#039;&#039;Issue  ID&#039;&#039;&#039;: a unique value assigned to an issue.&lt;br /&gt;
* &#039;&#039;&#039;Project:&#039;&#039;&#039; a software module.  We currently have two projects that are exposed to the studio developers: &#039;&#039;gameserver-js&#039;&#039; (frontend) and gameserver (&#039;&#039;backend&#039;&#039;)&lt;br /&gt;
* &#039;&#039;&#039;Tags:&#039;&#039;&#039; metadata associated to an event, like browser version, user ID, etc.  They are used to provide statistics in the issues page.&lt;br /&gt;
* &#039;&#039;&#039;Release:&#039;&#039;&#039; a release is a package name and a version name.  It helps knowing when an issue appears, then narrowing down its cause.  There are two releases set on BGA: mainsite release (our code) and game release (your code)&lt;br /&gt;
&lt;br /&gt;
==== Views ====&lt;br /&gt;
The sentry viewer offer several views.&lt;br /&gt;
&lt;br /&gt;
===== Issues list view =====&lt;br /&gt;
This is the landing view, it shows an issue list after a brief query on the Sentry server.&lt;br /&gt;
&lt;br /&gt;
It is possible to filter out the project, depending on when you want to obtain frontend, backend or both errors (left red rectangle on the screenshot).&lt;br /&gt;
&lt;br /&gt;
In the event of more than 25 issues, it is possible to paginate over them (right red rectangle).  Ordering can also be changed, it can be:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;number of events:&#039;&#039;&#039; the more, the more impactful this issue is.&lt;br /&gt;
* &#039;&#039;&#039;last seen:&#039;&#039;&#039; last time an event has been added to this issue.  The more ancient, the more likely it is fixed.&lt;br /&gt;
* &#039;&#039;&#039;first seen:&#039;&#039;&#039; first time an event has been recorded into this issue.  This is valuable to understand when a bug was introduced (for instance, if that matches a release date)&lt;br /&gt;
* &#039;&#039;&#039;trend:&#039;&#039;&#039; Sentry &amp;quot;magic&amp;quot; ordering to determine which issues are currently gaining momentum.&lt;br /&gt;
&lt;br /&gt;
[[File:Issues list.png|frameless|600x600px]]&lt;br /&gt;
&lt;br /&gt;
Issues contain the following fields:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;ID:&#039;&#039;&#039; Sentry internal ID regarding this event.  It is unique and starts with the project name.  Hence, &amp;quot;&amp;lt;code&amp;gt;GAMESERVER-JS-XXX&amp;lt;/code&amp;gt;&amp;quot; is an error related to frontend (javascript)&lt;br /&gt;
* &#039;&#039;&#039;Type:&#039;&#039;&#039; error, warning or sometimes, it contains the name of the exceptions raised&lt;br /&gt;
* &#039;&#039;&#039;Description:&#039;&#039;&#039; short description, normally the same error as the user experienced if that was not a silent error&lt;br /&gt;
* &#039;&#039;&#039;Seen:&#039;&#039;&#039; first and last times this issue has been encountered&lt;br /&gt;
* &#039;&#039;&#039;Status:&#039;&#039;&#039;  number of events (🏴) and users (👤) affected by this.&lt;br /&gt;
&lt;br /&gt;
Please note that we tried hard to limit false positives into this list, but, mainly for frontend errors, some errors can be &amp;quot;ours&amp;quot; and not your code.  This can be guessed in the next screen if the stack is empty.&lt;br /&gt;
&lt;br /&gt;
===== Issue detail view =====&lt;br /&gt;
This view shows the details of an issue.  As every &amp;quot;specific&amp;quot; data is attached to an event and not an issue, this view chooses by default an event (latest one) and uses its data to fill in some fields (for instance, tags).  If you navigate between events (see next view), this data is subjected to change.&lt;br /&gt;
&lt;br /&gt;
[[File:Issue details.png|frameless|785x785px]]&lt;br /&gt;
&lt;br /&gt;
This page is separated into several blocks.&lt;br /&gt;
&lt;br /&gt;
====== Main information ======&lt;br /&gt;
[[File:Issue main informations.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
This contains the main information of the issue, as seen in issues list:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Type of error&#039;&#039;&#039; (warning, error, exception name, etc.)&lt;br /&gt;
* &#039;&#039;&#039;Description of error&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Error ID&#039;&#039;&#039;&lt;br /&gt;
* More detailed information and counters:&lt;br /&gt;
** &#039;&#039;&#039;Priority:&#039;&#039;&#039; Sentry estimate of the criticality of this issue&lt;br /&gt;
** &#039;&#039;&#039;Count:&#039;&#039;&#039; number of events&lt;br /&gt;
** &#039;&#039;&#039;User count:&#039;&#039;&#039; approximate number of users impacted by this issue&lt;br /&gt;
** &#039;&#039;&#039;First seen&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Last seen&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
====== Culprit ======&lt;br /&gt;
[[File:Issue culprit.png|frameless]]&lt;br /&gt;
This summarizes where and the issue happens, with a source file position and a release.&lt;br /&gt;
&lt;br /&gt;
====== Stack trace ======&lt;br /&gt;
[[File:Issue stack trace.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
This block contains information particularly useful to debug an issue.  By default, only stack trace elements pertaining to the game code are shown.  It is possible for frontend errors to toggle this behavior and show BGA frontend stack trace elements.&lt;br /&gt;
&lt;br /&gt;
Every element of the stack trace is clickable to see a hint on exactly when the execution was.  Please note that some of this code is minified and hence is not very readable.  However, it can still provide useful information.  We plan to perhaps unminify this code later.&lt;br /&gt;
&lt;br /&gt;
====== Request ======&lt;br /&gt;
[[File:Issue request details.png|frameless]]&lt;br /&gt;
This block contains details on the request, namely:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;URL:&#039;&#039;&#039; complete URL of the request, but without the query string&lt;br /&gt;
* &#039;&#039;&#039;Method:&#039;&#039;&#039; could be &amp;lt;code&amp;gt;GET&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;POST&amp;lt;/code&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Query:&#039;&#039;&#039; all query parameters if any&lt;br /&gt;
&lt;br /&gt;
====== Tags ======&lt;br /&gt;
[[File:Issue tags.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
List any relevant tags regarding this event.&lt;br /&gt;
&lt;br /&gt;
====== Statistics ======&lt;br /&gt;
[[File:Issue statistics - histogram.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
This block contains an histogram of the issue events depending, either during last day or last month.  Every bar is clickable.&lt;br /&gt;
&lt;br /&gt;
[[File:Issue statistics.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
Then, we have donuts-like statistics with a breakdown of the first 10 occurrences for:&lt;br /&gt;
&lt;br /&gt;
* browsers&lt;br /&gt;
* device family&lt;br /&gt;
* OSes&lt;br /&gt;
* users&lt;br /&gt;
* tables&lt;br /&gt;
&lt;br /&gt;
The more a stats impacts a browser, user or device brand, the more it is suspect that the issue is specific to them.&lt;br /&gt;
&lt;br /&gt;
===== Events list view =====&lt;/div&gt;</summary>
		<author><name>Lymon Flowers</name></author>
	</entry>
	<entry>
		<id>https://en.doc.boardgamearena.com/index.php?title=File:Issue_statistics.png&amp;diff=25047</id>
		<title>File:Issue statistics.png</title>
		<link rel="alternate" type="text/html" href="https://en.doc.boardgamearena.com/index.php?title=File:Issue_statistics.png&amp;diff=25047"/>
		<updated>2025-05-21T15:51:18Z</updated>

		<summary type="html">&lt;p&gt;Lymon Flowers: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Issue statistics&lt;/div&gt;</summary>
		<author><name>Lymon Flowers</name></author>
	</entry>
	<entry>
		<id>https://en.doc.boardgamearena.com/index.php?title=File:Issue_statistics_-_histogram.png&amp;diff=25046</id>
		<title>File:Issue statistics - histogram.png</title>
		<link rel="alternate" type="text/html" href="https://en.doc.boardgamearena.com/index.php?title=File:Issue_statistics_-_histogram.png&amp;diff=25046"/>
		<updated>2025-05-21T15:50:10Z</updated>

		<summary type="html">&lt;p&gt;Lymon Flowers: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Issue statistics - histogram&lt;/div&gt;</summary>
		<author><name>Lymon Flowers</name></author>
	</entry>
	<entry>
		<id>https://en.doc.boardgamearena.com/index.php?title=File:Issue_tags.png&amp;diff=25045</id>
		<title>File:Issue tags.png</title>
		<link rel="alternate" type="text/html" href="https://en.doc.boardgamearena.com/index.php?title=File:Issue_tags.png&amp;diff=25045"/>
		<updated>2025-05-21T15:49:02Z</updated>

		<summary type="html">&lt;p&gt;Lymon Flowers: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Issue tags&lt;/div&gt;</summary>
		<author><name>Lymon Flowers</name></author>
	</entry>
	<entry>
		<id>https://en.doc.boardgamearena.com/index.php?title=File:Issue_request_details.png&amp;diff=25044</id>
		<title>File:Issue request details.png</title>
		<link rel="alternate" type="text/html" href="https://en.doc.boardgamearena.com/index.php?title=File:Issue_request_details.png&amp;diff=25044"/>
		<updated>2025-05-21T13:17:30Z</updated>

		<summary type="html">&lt;p&gt;Lymon Flowers: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Issue request details&lt;/div&gt;</summary>
		<author><name>Lymon Flowers</name></author>
	</entry>
	<entry>
		<id>https://en.doc.boardgamearena.com/index.php?title=File:Issue_stack_trace.png&amp;diff=25043</id>
		<title>File:Issue stack trace.png</title>
		<link rel="alternate" type="text/html" href="https://en.doc.boardgamearena.com/index.php?title=File:Issue_stack_trace.png&amp;diff=25043"/>
		<updated>2025-05-21T13:14:40Z</updated>

		<summary type="html">&lt;p&gt;Lymon Flowers: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Issue stack trace&lt;/div&gt;</summary>
		<author><name>Lymon Flowers</name></author>
	</entry>
	<entry>
		<id>https://en.doc.boardgamearena.com/index.php?title=File:Issue_culprit.png&amp;diff=25042</id>
		<title>File:Issue culprit.png</title>
		<link rel="alternate" type="text/html" href="https://en.doc.boardgamearena.com/index.php?title=File:Issue_culprit.png&amp;diff=25042"/>
		<updated>2025-05-21T13:11:46Z</updated>

		<summary type="html">&lt;p&gt;Lymon Flowers: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Issue culprit&lt;/div&gt;</summary>
		<author><name>Lymon Flowers</name></author>
	</entry>
	<entry>
		<id>https://en.doc.boardgamearena.com/index.php?title=File:Issue_main_informations.png&amp;diff=25040</id>
		<title>File:Issue main informations.png</title>
		<link rel="alternate" type="text/html" href="https://en.doc.boardgamearena.com/index.php?title=File:Issue_main_informations.png&amp;diff=25040"/>
		<updated>2025-05-21T13:09:05Z</updated>

		<summary type="html">&lt;p&gt;Lymon Flowers: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Issue main informations&lt;/div&gt;</summary>
		<author><name>Lymon Flowers</name></author>
	</entry>
	<entry>
		<id>https://en.doc.boardgamearena.com/index.php?title=Production_issues_reporting&amp;diff=25038</id>
		<title>Production issues reporting</title>
		<link rel="alternate" type="text/html" href="https://en.doc.boardgamearena.com/index.php?title=Production_issues_reporting&amp;diff=25038"/>
		<updated>2025-05-21T13:05:55Z</updated>

		<summary type="html">&lt;p&gt;Lymon Flowers: /* Views */ Add more details&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;BGA implemented several production issues reporting tools:&lt;br /&gt;
&lt;br /&gt;
* Syntax errors reporting&lt;br /&gt;
* Unexpected errors reporting&lt;br /&gt;
* Backend &amp;amp; frontend issues reporting&lt;br /&gt;
&lt;br /&gt;
All of these are available at the bottom of your game studio page.  Access your game studio page (for instance: [https://studio.boardgamearena.com/studiogame?game=medina https://studio.boardgamearena.com/studiogame?game=xxx]) and scroll to the &amp;quot;&#039;&#039;&#039;Errors in production&#039;&#039;&#039;&amp;quot; block:&lt;br /&gt;
&lt;br /&gt;
[[File:Error_reporting.png|frameless|600x600px]]&lt;br /&gt;
&lt;br /&gt;
== Syntax errors reporting ==&lt;br /&gt;
This is the simplest reporting tool.  It only reports PHP syntax errors.  When clicking on the button, you will be redirected to a page that lists all game servers and will display any syntax error.  Any of these is a fatal error and should be addressed with a new release.&lt;br /&gt;
&lt;br /&gt;
== Unexpected errors reporting ==&lt;br /&gt;
Same as the previous tool.  It redirects to another report page that shows recent PHP (backend) errors.  Only an error message with a PHP stack trace is shown for each message.  For instance:&lt;br /&gt;
 18/05 20:07:17 [error] [TXXX] [A.B.C.D] [XXX/YYY] Error (1213) while processing SQL request: Deadlock found when trying to get lock; try restarting transaction - Request: SELECT global_id, global_value FROM global WHERE 1   &lt;br /&gt;
 18/05 20:07:17 [error] [TXXXX] [A.B.C.D] [XXX/YYY] Unexpected exception: mysql_deadlock_restart_transaction (BGA service error 1747591637)&lt;br /&gt;
 #0 /var/tournoi/release/tournoi-250505-1448-gs/www/Bga/GameFramework/Old/APP_DbObject.php(34): Bga\Services\Db-&amp;gt;query(&#039;...&#039;)&lt;br /&gt;
 #1 /var/tournoi/release/tournoi-250505-1448-gs/www/Bga/GameFramework/TableInfos.php(125): Bga\GameFramework\Old\APP_DbObject::DbQuery(&#039;...&#039;)&lt;br /&gt;
 #2 /var/tournoi/release/tournoi-250505-1448-gs/www/Bga/GameFramework/TableInfos.php(91): Bga\GameFramework\TableInfos-&amp;gt;getGlobalsFromDB(false)&lt;br /&gt;
 #3 /var/tournoi/release/tournoi-250505-1448-gs/www/Bga/GameFramework/TableInfos.php(69): Bga\GameFramework\TableInfos-&amp;gt;db_load(false)&lt;br /&gt;
 #4 /var/tournoi/release/tournoi-250505-1448-gs/www/Bga/GameFramework/GameAction.php(80): Bga\GameFramework\TableInfos-&amp;gt;get(false)&lt;br /&gt;
 #5 /var/tournoi/release/tournoi-250505-1448-gs/www/Bga/GameFramework/GameAction.php(31): Bga\GameFramework\GameAction-&amp;gt;initGameTableObjects()&lt;br /&gt;
 #6 /var/tournoi/release/tournoi-250505-1448-gs/vendor/php-di/php-di/src/Definition/Resolver/ObjectCreator.php(129): Bga\GameFramework\GameAction-&amp;gt;__construct()&lt;br /&gt;
 #7 /var/tournoi/release/tournoi-250505-1448-gs/vendor/php-di/php-di/src/Definition/Resolver/ObjectCreator.php(56): DI\Definition\Resolver\ObjectCreator-&amp;gt;createInstance(Object(DI\Definition\ObjectDefinition), Array)&lt;br /&gt;
 #8 /var/tournoi/release/tournoi-250505-1448-gs/vendor/php-di/php-di/src/Definition/Resolver/ResolverDispatcher.php(62): DI\Definition\Resolver\ObjectCreator-&amp;gt;resolve(Object(DI\Definition\ObjectDefinition), Array)&lt;br /&gt;
 #9 /var/tournoi/release/tournoi-250505-1448-gs/vendor/php-di/php-di/src/Container.php(354): DI\Definition\Resolver\ResolverDispatcher-&amp;gt;resolve(Object(DI\Definition\ObjectDefinition), Array)&lt;br /&gt;
 #10 /var/tournoi/release/tournoi-250505-1448-gs/vendor/php-di/php-di/src/Container.php(184): DI\Container-&amp;gt;resolveDefinition(Object(DI\Definition\ObjectDefinition), Array)&lt;br /&gt;
 #11 /var/tournoi/release/tournoi-250505-1448-gs/www/include/webActionCore.inc.php(201): DI\Container-&amp;gt;make(&#039;...&#039;)&lt;br /&gt;
 #12 /var/tournoi/release/tournoi-250505-1448-gs/www/index.php(262): launchWebAction(&#039;...&#039;, &#039;...&#039;, &#039;...&#039;, false, false, NULL, true, false)&lt;br /&gt;
 #13 {main}&lt;br /&gt;
Errors are unformatted and no statistics whatsoever are made.  This tools is pretty raw but very low level without any filtering.&lt;br /&gt;
&lt;br /&gt;
== Backend &amp;amp; frontend issues reporting ==&lt;br /&gt;
This is the next generation reporting tool.  It is based on Sentry, a tool that aggregates any frontend and backend errors encountered by users.  It allows modern statistics and gives more context.&lt;br /&gt;
&lt;br /&gt;
When clicking on this button, you will be redirect to another interface that allows basic Sentry querying.&lt;br /&gt;
&lt;br /&gt;
=== Sentry concepts ===&lt;br /&gt;
When an error or a warning is caught, information is sent to Sentry in the form of an event, which is processed.  Sentry then as the following concepts:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Event&#039;&#039;&#039;: an error or warning that triggered either in the user browser or in one of BGA servers&lt;br /&gt;
* &#039;&#039;&#039;Issue:&#039;&#039;&#039; all events are attached to an issue.  Sentry figures out how to merge then depending on the place the event has taken place in the code.  Hence, false positive could happen&lt;br /&gt;
* &#039;&#039;&#039;Issue  ID&#039;&#039;&#039;: a unique value assigned to an issue.&lt;br /&gt;
* &#039;&#039;&#039;Project:&#039;&#039;&#039; a software module.  We currently have two projects that are exposed to the studio developers: &#039;&#039;gameserver-js&#039;&#039; (frontend) and gameserver (&#039;&#039;backend&#039;&#039;)&lt;br /&gt;
* &#039;&#039;&#039;Tags:&#039;&#039;&#039; metadata associated to an event, like browser version, user ID, etc.  They are used to provide statistics in the issues page.&lt;br /&gt;
* &#039;&#039;&#039;Release:&#039;&#039;&#039; a release is a package name and a version name.  It helps knowing when an issue appears, then narrowing down its cause.  There are two releases set on BGA: mainsite release (our code) and game release (your code)&lt;br /&gt;
&lt;br /&gt;
==== Views ====&lt;br /&gt;
The sentry viewer offer several views.&lt;br /&gt;
&lt;br /&gt;
===== Issues list view =====&lt;br /&gt;
This is the landing view, it shows an issue list after a brief query on the Sentry server.&lt;br /&gt;
&lt;br /&gt;
It is possible to filter out the project, depending on when you want to obtain frontend, backend or both errors (left red rectangle on the screenshot).&lt;br /&gt;
&lt;br /&gt;
In the event of more than 25 issues, it is possible to paginate over them (right red rectangle).  Ordering can also be changed, it can be:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;number of events:&#039;&#039;&#039; the more, the more impactful this issue is.&lt;br /&gt;
* &#039;&#039;&#039;last seen:&#039;&#039;&#039; last time an event has been added to this issue.  The more ancient, the more likely it is fixed.&lt;br /&gt;
* &#039;&#039;&#039;first seen:&#039;&#039;&#039; first time an event has been recorded into this issue.  This is valuable to understand when a bug was introduced (for instance, if that matches a release date)&lt;br /&gt;
* &#039;&#039;&#039;trend:&#039;&#039;&#039; Sentry &amp;quot;magic&amp;quot; ordering to determine which issues are currently gaining momentum.&lt;br /&gt;
&lt;br /&gt;
[[File:Issues list.png|frameless|600x600px]]&lt;br /&gt;
&lt;br /&gt;
Issues contain the following fields:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;ID:&#039;&#039;&#039; Sentry internal ID regarding this event.  It is unique and starts with the project name.  Hence, &amp;quot;&amp;lt;code&amp;gt;GAMESERVER-JS-XXX&amp;lt;/code&amp;gt;&amp;quot; is an error related to frontend (javascript)&lt;br /&gt;
* &#039;&#039;&#039;Type:&#039;&#039;&#039; error, warning or sometimes, it contains the name of the exceptions raised&lt;br /&gt;
* &#039;&#039;&#039;Description:&#039;&#039;&#039; short description, normally the same error as the user experienced if that was not a silent error&lt;br /&gt;
* &#039;&#039;&#039;Seen:&#039;&#039;&#039; first and last times this issue has been encountered&lt;br /&gt;
* &#039;&#039;&#039;Status:&#039;&#039;&#039;  number of events (🏴) and users (👤) affected by this.&lt;br /&gt;
&lt;br /&gt;
Please note that we tried hard to limit false positives into this list, but, mainly for frontend errors, some errors can be &amp;quot;ours&amp;quot; and not your code.  This can be guessed in the next screen if the stack is empty.&lt;br /&gt;
&lt;br /&gt;
===== Issue detail view =====&lt;br /&gt;
This view shows the details of an issue.  As every &amp;quot;specific&amp;quot; data is attached to an event and not an issue, this view chooses by default an event (latest one) and uses its data to fill in some fields (for instance, tags).  If you navigate between events (see next view), this data is subjected to change.&lt;br /&gt;
&lt;br /&gt;
[[File:Issue details.png|frameless|785x785px]]&lt;br /&gt;
&lt;br /&gt;
===== Events list view =====&lt;/div&gt;</summary>
		<author><name>Lymon Flowers</name></author>
	</entry>
	<entry>
		<id>https://en.doc.boardgamearena.com/index.php?title=File:Issue_details.png&amp;diff=25035</id>
		<title>File:Issue details.png</title>
		<link rel="alternate" type="text/html" href="https://en.doc.boardgamearena.com/index.php?title=File:Issue_details.png&amp;diff=25035"/>
		<updated>2025-05-21T12:16:30Z</updated>

		<summary type="html">&lt;p&gt;Lymon Flowers: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Issue details in the Sentry viewer.&lt;/div&gt;</summary>
		<author><name>Lymon Flowers</name></author>
	</entry>
	<entry>
		<id>https://en.doc.boardgamearena.com/index.php?title=File:Issues_list.png&amp;diff=25034</id>
		<title>File:Issues list.png</title>
		<link rel="alternate" type="text/html" href="https://en.doc.boardgamearena.com/index.php?title=File:Issues_list.png&amp;diff=25034"/>
		<updated>2025-05-21T12:03:10Z</updated>

		<summary type="html">&lt;p&gt;Lymon Flowers: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Sentry issues list&lt;/div&gt;</summary>
		<author><name>Lymon Flowers</name></author>
	</entry>
	<entry>
		<id>https://en.doc.boardgamearena.com/index.php?title=Production_issues_reporting&amp;diff=25032</id>
		<title>Production issues reporting</title>
		<link rel="alternate" type="text/html" href="https://en.doc.boardgamearena.com/index.php?title=Production_issues_reporting&amp;diff=25032"/>
		<updated>2025-05-21T10:45:41Z</updated>

		<summary type="html">&lt;p&gt;Lymon Flowers: Add more context&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;BGA implemented several production issues reporting tools:&lt;br /&gt;
&lt;br /&gt;
* Syntax errors reporting&lt;br /&gt;
* Unexpected errors reporting&lt;br /&gt;
* Backend &amp;amp; frontend issues reporting&lt;br /&gt;
&lt;br /&gt;
All of these are available at the bottom of your game studio page.  Access your game studio page (for instance: [https://studio.boardgamearena.com/studiogame?game=medina https://studio.boardgamearena.com/studiogame?game=xxx]) and scroll to the &amp;quot;&#039;&#039;&#039;Errors in production&#039;&#039;&#039;&amp;quot; block:&lt;br /&gt;
[[File:Error reporting.png|center|thumb]]&lt;br /&gt;
&lt;br /&gt;
== Syntax errors reporting ==&lt;br /&gt;
This is the simplest reporting tool.  It only reports PHP syntax errors.  When clicking on the button, you will be redirected to a page that lists all game servers and will display any syntax error.  Any of these is a fatal error and should be addressed with a new release.&lt;br /&gt;
&lt;br /&gt;
== Unexpected errors reporting ==&lt;br /&gt;
Same as the previous tool.  It redirects to another report page that shows recent PHP (backend) errors.  Only an error message with a PHP stack trace is shown for each message.  For instance:&lt;br /&gt;
 18/05 20:07:17 [error] [TXXX] [A.B.C.D] [XXX/YYY] Error (1213) while processing SQL request: Deadlock found when trying to get lock; try restarting transaction - Request: SELECT global_id, global_value FROM global WHERE 1   &lt;br /&gt;
 18/05 20:07:17 [error] [TXXXX] [A.B.C.D] [XXX/YYY] Unexpected exception: mysql_deadlock_restart_transaction (BGA service error 1747591637)&lt;br /&gt;
 #0 /var/tournoi/release/tournoi-250505-1448-gs/www/Bga/GameFramework/Old/APP_DbObject.php(34): Bga\Services\Db-&amp;gt;query(&#039;...&#039;)&lt;br /&gt;
 #1 /var/tournoi/release/tournoi-250505-1448-gs/www/Bga/GameFramework/TableInfos.php(125): Bga\GameFramework\Old\APP_DbObject::DbQuery(&#039;...&#039;)&lt;br /&gt;
 #2 /var/tournoi/release/tournoi-250505-1448-gs/www/Bga/GameFramework/TableInfos.php(91): Bga\GameFramework\TableInfos-&amp;gt;getGlobalsFromDB(false)&lt;br /&gt;
 #3 /var/tournoi/release/tournoi-250505-1448-gs/www/Bga/GameFramework/TableInfos.php(69): Bga\GameFramework\TableInfos-&amp;gt;db_load(false)&lt;br /&gt;
 #4 /var/tournoi/release/tournoi-250505-1448-gs/www/Bga/GameFramework/GameAction.php(80): Bga\GameFramework\TableInfos-&amp;gt;get(false)&lt;br /&gt;
 #5 /var/tournoi/release/tournoi-250505-1448-gs/www/Bga/GameFramework/GameAction.php(31): Bga\GameFramework\GameAction-&amp;gt;initGameTableObjects()&lt;br /&gt;
 #6 /var/tournoi/release/tournoi-250505-1448-gs/vendor/php-di/php-di/src/Definition/Resolver/ObjectCreator.php(129): Bga\GameFramework\GameAction-&amp;gt;__construct()&lt;br /&gt;
 #7 /var/tournoi/release/tournoi-250505-1448-gs/vendor/php-di/php-di/src/Definition/Resolver/ObjectCreator.php(56): DI\Definition\Resolver\ObjectCreator-&amp;gt;createInstance(Object(DI\Definition\ObjectDefinition), Array)&lt;br /&gt;
 #8 /var/tournoi/release/tournoi-250505-1448-gs/vendor/php-di/php-di/src/Definition/Resolver/ResolverDispatcher.php(62): DI\Definition\Resolver\ObjectCreator-&amp;gt;resolve(Object(DI\Definition\ObjectDefinition), Array)&lt;br /&gt;
 #9 /var/tournoi/release/tournoi-250505-1448-gs/vendor/php-di/php-di/src/Container.php(354): DI\Definition\Resolver\ResolverDispatcher-&amp;gt;resolve(Object(DI\Definition\ObjectDefinition), Array)&lt;br /&gt;
 #10 /var/tournoi/release/tournoi-250505-1448-gs/vendor/php-di/php-di/src/Container.php(184): DI\Container-&amp;gt;resolveDefinition(Object(DI\Definition\ObjectDefinition), Array)&lt;br /&gt;
 #11 /var/tournoi/release/tournoi-250505-1448-gs/www/include/webActionCore.inc.php(201): DI\Container-&amp;gt;make(&#039;...&#039;)&lt;br /&gt;
 #12 /var/tournoi/release/tournoi-250505-1448-gs/www/index.php(262): launchWebAction(&#039;...&#039;, &#039;...&#039;, &#039;...&#039;, false, false, NULL, true, false)&lt;br /&gt;
 #13 {main}&lt;br /&gt;
Errors are unformatted and no statistics whatsoever are made.  This tools is pretty raw but very low level without any filtering.&lt;br /&gt;
&lt;br /&gt;
== Backend &amp;amp; frontend issues reporting ==&lt;br /&gt;
This is the next generation reporting tool.  It is based on Sentry, a tool that aggregates any frontend and backend errors encountered by users.  It allows modern statistics and gives more context.&lt;br /&gt;
&lt;br /&gt;
When clicking on this button, you will be redirect to another interface that allows basic Sentry querying.&lt;br /&gt;
&lt;br /&gt;
=== Sentry concepts ===&lt;br /&gt;
When an error or a warning is caught, information is sent to Sentry in the form of an event, which is processed.  Sentry then as the following concepts:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Event&#039;&#039;&#039;: an error or warning that triggered either in the user browser or in one of BGA servers&lt;br /&gt;
* &#039;&#039;&#039;Issue:&#039;&#039;&#039; all events are attached to an issue.  Sentry figures out how to merge then depending on the place the event has taken place in the code.  Hence, false positive could happen&lt;br /&gt;
* &#039;&#039;&#039;Issue  ID&#039;&#039;&#039;: a unique value assigned to an issue.&lt;br /&gt;
* &#039;&#039;&#039;Project:&#039;&#039;&#039; a software module.  We currently have two projects that are exposed to the studio developers: &#039;&#039;gameserver-js&#039;&#039; (frontend) and gameserver (&#039;&#039;backend&#039;&#039;)&lt;br /&gt;
* &#039;&#039;&#039;Tags:&#039;&#039;&#039; metadata associated to an event, like browser version, user ID, etc.  They are used to provide statistics in the issues page.&lt;br /&gt;
* &#039;&#039;&#039;Release:&#039;&#039;&#039; a release is a package name and a version name.  It helps knowing when an issue appears, then narrowing down its cause.  There are two releases set on BGA: mainsite release (our code) and game release (your code)&lt;br /&gt;
&lt;br /&gt;
==== Views ====&lt;br /&gt;
&lt;br /&gt;
===== Issues list view =====&lt;br /&gt;
&lt;br /&gt;
===== Issue detail view =====&lt;br /&gt;
&lt;br /&gt;
===== Events list view =====&lt;/div&gt;</summary>
		<author><name>Lymon Flowers</name></author>
	</entry>
	<entry>
		<id>https://en.doc.boardgamearena.com/index.php?title=Production_issues_reporting&amp;diff=25031</id>
		<title>Production issues reporting</title>
		<link rel="alternate" type="text/html" href="https://en.doc.boardgamearena.com/index.php?title=Production_issues_reporting&amp;diff=25031"/>
		<updated>2025-05-21T10:14:05Z</updated>

		<summary type="html">&lt;p&gt;Lymon Flowers: Basic layout&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;BGA implemented several production issues reporting tools:&lt;br /&gt;
&lt;br /&gt;
* Syntax errors reporting&lt;br /&gt;
* Unexpected errors reporting&lt;br /&gt;
* Backend &amp;amp; frontend issues reporting&lt;br /&gt;
&lt;br /&gt;
All of these are available at the bottom of your game studio page.  Access your game studio page (for instance: [https://studio.boardgamearena.com/studiogame?game=medina https://studio.boardgamearena.com/studiogame?game=xxx]) and scroll to the &amp;quot;&#039;&#039;&#039;Errors in production&#039;&#039;&#039;&amp;quot; block:&lt;br /&gt;
[[File:Error reporting.png|center|thumb]]&lt;br /&gt;
&lt;br /&gt;
== Syntax errors reporting ==&lt;br /&gt;
This is the simplest reporting tool.  It only reports&lt;br /&gt;
&lt;br /&gt;
== Unexpected errors reporting ==&lt;br /&gt;
&lt;br /&gt;
== Backend &amp;amp; frontend issues reporting ==&lt;/div&gt;</summary>
		<author><name>Lymon Flowers</name></author>
	</entry>
	<entry>
		<id>https://en.doc.boardgamearena.com/index.php?title=File:Error_reporting.png&amp;diff=25030</id>
		<title>File:Error reporting.png</title>
		<link rel="alternate" type="text/html" href="https://en.doc.boardgamearena.com/index.php?title=File:Error_reporting.png&amp;diff=25030"/>
		<updated>2025-05-21T10:13:01Z</updated>

		<summary type="html">&lt;p&gt;Lymon Flowers: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Error reporting as seen in any studio game page.&lt;/div&gt;</summary>
		<author><name>Lymon Flowers</name></author>
	</entry>
	<entry>
		<id>https://en.doc.boardgamearena.com/index.php?title=Studio&amp;diff=25029</id>
		<title>Studio</title>
		<link rel="alternate" type="text/html" href="https://en.doc.boardgamearena.com/index.php?title=Studio&amp;diff=25029"/>
		<updated>2025-05-21T10:09:08Z</updated>

		<summary type="html">&lt;p&gt;Lymon Flowers: /* BGA Studio user guide */ Add new link&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Studio_Framework_Navigation}}&lt;br /&gt;
&lt;br /&gt;
[[File:Bga_studio_small.jpg|frameless|300px]]&lt;br /&gt;
&lt;br /&gt;
Note: Please DO NOT translate Studio Documentation, so that there can be one place where you can find the latest information available.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== What is Board Game Arena Studio? ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Board Game Arena Studio&#039;&#039;&#039; is a platform to build online board game adaptations using the Board Game Arena platform.&lt;br /&gt;
&lt;br /&gt;
It is open to any gamer with software development skills :)&lt;br /&gt;
&lt;br /&gt;
BGA Studio website: https://studio.boardgamearena.com&lt;br /&gt;
&lt;br /&gt;
Original announcement on BGA forum: https://forum.boardgamearena.com/viewtopic.php?f=10&amp;amp;t=1973&lt;br /&gt;
&lt;br /&gt;
== Discover BGA Studio in 5 presentations ==&lt;br /&gt;
&lt;br /&gt;
Why, how, what... to start discovering BGA Studio, we prepared 5 &amp;quot;powerpoint&amp;quot; presentations for you:&lt;br /&gt;
&lt;br /&gt;
* [http://www.slideshare.net/boardgamearena/5-reasons-why-you-should-use-bga-studio-for-your-online-board-game 5 reasons why you should use BGA Studio for your online board game] (or [http://en.doc.boardgamearena.com/images/5/58/1-why-developing.pdf ‎Download as PDF])&lt;br /&gt;
* [http://www.slideshare.net/boardgamearena/the-8-steps-to-create-a-board-game-on-board-game-arena The 8 steps to create a board game on Board Game Arena] (or [http://en.doc.boardgamearena.com/images/1/1e/2-8-steps-to-realize.pdf Download as PDF])&lt;br /&gt;
* [http://www.slideshare.net/boardgamearena/the-bga-framework-at-a-glance The BGA Framework at a glance] (or [http://en.doc.boardgamearena.com/images/7/79/3-thebgaframework.pdf Download as PDF])&lt;br /&gt;
* [http://www.slideshare.net/boardgamearena/bga-studio-focus-on-bga-game-state-machine Focus on BGA game state machine] (or [http://en.doc.boardgamearena.com/images/9/98/4-gamestates.pdf Download as PDF])&lt;br /&gt;
* [http://www.slideshare.net/boardgamearena/bga-studio-guidelines BGA developers guidelines] (or [http://en.doc.boardgamearena.com/images/7/76/5-guidelines.pdf ‎Download as PDF])&lt;br /&gt;
&lt;br /&gt;
== How to join the BGA developer team? ==&lt;br /&gt;
&lt;br /&gt;
Please see this page: [[How to join BGA developer team?]]&lt;br /&gt;
&lt;br /&gt;
== Great, I&#039;m in! ... How should I start? ==&lt;br /&gt;
&lt;br /&gt;
If you didn&#039;t already, check the presentations at the top of this page to get the basics.&lt;br /&gt;
&lt;br /&gt;
Then, you should checkout the [[First steps with BGA Studio]] to make sure that runs fine.&lt;br /&gt;
&lt;br /&gt;
After that, we strongly advise you to take one of these game creation tutorials:&lt;br /&gt;
* [[Tutorial reversi]] (&#039;&#039;&#039;recommended&#039;&#039;&#039;, closest to the actual BGA implementation and maintained by the BGA team) - an abstract strategy game played on an 8×8 uncheckered board for 2 players&lt;br /&gt;
* [[Tutorial gomoku]] - an abstract strategy game tic-tac-toe style for 2 players&lt;br /&gt;
* [[Tutorial hearts]] - a card game for 4 players&lt;br /&gt;
&lt;br /&gt;
Then start editing files and see what happens! ;)&lt;br /&gt;
&lt;br /&gt;
Once you&#039;re done with tutorials, you can start a real game (or join existing project)&lt;br /&gt;
* [[Create a game in BGA Studio: Complete Walkthrough]] &lt;br /&gt;
&lt;br /&gt;
If you have any questions, please check out the [[Studio FAQ]] or [[Contact BGA Studio]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
To search wiki pages on studio enter this text in search bar: &lt;br /&gt;
  &amp;quot;Category:Studio&amp;quot; white rabbit &lt;br /&gt;
That is if you want to search for white rabbit&lt;br /&gt;
&lt;br /&gt;
== BGA Studio documentation ==&lt;br /&gt;
&lt;br /&gt;
=== BGA Studio Framework reference ===&lt;br /&gt;
&lt;br /&gt;
This part of the documentation focuses on the development framework itself: functions and methods available to build your game.&lt;br /&gt;
&lt;br /&gt;
[[Studio file reference|File structure of a BGA game]]&lt;br /&gt;
&lt;br /&gt;
==== Game logic (Server side) ====&lt;br /&gt;
&lt;br /&gt;
* [[Main game logic: yourgamename.game.php]]&lt;br /&gt;
* [[Your game state machine: states.inc.php]]&lt;br /&gt;
* [[Game database model: dbmodel.sql]]&lt;br /&gt;
* [[Players actions: yourgamename.action.php]]&lt;br /&gt;
* [[Game material description: material.inc.php]]&lt;br /&gt;
* [[Game statistics: stats.inc.php]]&lt;br /&gt;
&lt;br /&gt;
==== Game interface (Client side) ====&lt;br /&gt;
&lt;br /&gt;
* [[Game interface logic: yourgamename.js]]&lt;br /&gt;
* [[Game art: img directory]]&lt;br /&gt;
* [[Game interface stylesheet: yourgamename.css]]&lt;br /&gt;
* [[Game layout: view and template: yourgamename.view.php and yourgamename_yourgamename.tpl]]&lt;br /&gt;
* [[Your game mobile version]]&lt;br /&gt;
&lt;br /&gt;
==== Other components ====&lt;br /&gt;
&lt;br /&gt;
* [[Translations]] (how to make your game translatable)&lt;br /&gt;
* [[Options_and_preferences:_gameoptions.json,_gamepreferences.json|Game Options and Preferences]]&lt;br /&gt;
* [[Game meta-information: gameinfos.inc.php]]&lt;br /&gt;
* [[Game replay]]&lt;br /&gt;
* [[3D]]&lt;br /&gt;
&lt;br /&gt;
=== BGA Studio game components reference ===&lt;br /&gt;
&lt;br /&gt;
Game components are useful tools you can use in your game adaptations.&lt;br /&gt;
&lt;br /&gt;
JS:&lt;br /&gt;
&lt;br /&gt;
* [[Counter]]: a JS component to manage a counter that can increase/decrease (ex: player&#039;s score).&lt;br /&gt;
* [[Scrollmap]]: a JS component to manage a scrollable game area (useful when the game area can be infinite. Examples:  Saboteur or Takenoko games).&lt;br /&gt;
* [[Stock]]: a JS component to manage and display a set of game elements displayed at a position.&lt;br /&gt;
* [[Zone]]: a JS component to manage a zone of the board where several game elements can come and leave, but should be well displayed together (See for example: token&#039;s places at Can&#039;t Stop).&lt;br /&gt;
* [[Draggable]]: a JS component to manage drag&#039;n&#039;drop actions.&lt;br /&gt;
* [[ExpandableSection]]: a JS component to manage a rectangular block of HTML than can be displayed/hidden.&lt;br /&gt;
* [[Anti-Stock]]: Code snippets in vanilla JS/HTML5 to do what stock does (that is if you cannot beat Stock into submission)&lt;br /&gt;
&lt;br /&gt;
PHP:&lt;br /&gt;
* [[Deck]]: a PHP component to manage cards (deck, hands, picking cards, moving cards, shuffle deck, ...).&lt;br /&gt;
&lt;br /&gt;
Reference for classes in game class hierarchy&lt;br /&gt;
&lt;br /&gt;
* [[Table]]: a PHP class that you inherit from for the game php&lt;br /&gt;
&lt;br /&gt;
=== BGA Studio user guide ===&lt;br /&gt;
&lt;br /&gt;
This part of the documentation is a user guide for the BGA Studio online development environment.&lt;br /&gt;
&lt;br /&gt;
Lifecycle&lt;br /&gt;
&lt;br /&gt;
* [[BGA game Lifecycle]]&lt;br /&gt;
* [[BGA Game licenses]]&lt;br /&gt;
* [[Create a game in BGA Studio: Complete Walkthrough]]&lt;br /&gt;
* [[Pre-release checklist]] - Go throught this list if you think you done development&lt;br /&gt;
* [[Post-release phase]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Tools and Advice&lt;br /&gt;
* [[BGA Studio Guidelines]]&lt;br /&gt;
* [[Tutorials checklist]]&lt;br /&gt;
* [[I wish I knew this when I started]] - one liners on most common missed features, mistakes, etc with further doc references&lt;br /&gt;
* [[Tools and tips of BGA Studio]] - Tips and instructions on setting up development environment&lt;br /&gt;
** [[Setting up BGA Development environment using VSCode]]&lt;br /&gt;
** [[Practical debugging]] - Tips focused on debugging&lt;br /&gt;
** [[Testing by developer]]&lt;br /&gt;
** [[Studio logs]] - Instructions for log access&lt;br /&gt;
** [[Troubleshooting]] - Most common &amp;quot;I am really stuck&amp;quot; situations&lt;br /&gt;
* [[Production issues reporting|Production issues reporting tool]]&lt;br /&gt;
* [[BGA Studio Cookbook]] - Tips and instructions on using API&#039;s, libraries and frameworks&lt;br /&gt;
** [[Using Vue]] - work-in-progress guide on using the modern framework Vue.js to create a game&lt;br /&gt;
** [[Using Typescript and Scss]] - How to auto-build Typescript and SCSS files to make your code cleaner&lt;br /&gt;
** [[BGA Type Safe Template]] - Setting up a fully typed project using typescript and more!&lt;br /&gt;
** [[Bots and Artificial Intelligence]] - How to add AI/Bots to the game&lt;br /&gt;
* [[Studio FAQ]]&lt;br /&gt;
&lt;br /&gt;
Sharing&lt;br /&gt;
* [[Common board game elements image resources]] - Dice, meeples, cubes, etc&lt;br /&gt;
* [[BGA Code Sharing]] - Shared resources, projects on git hub, common code, other links&lt;br /&gt;
&lt;br /&gt;
== Software Versions ==&lt;br /&gt;
&lt;br /&gt;
Versions currently used by BGA framework:&lt;br /&gt;
&lt;br /&gt;
* Dojo Toolkit 1.15&lt;br /&gt;
* PHP: 8.2&lt;br /&gt;
* SQL: MySQL 5.7&lt;br /&gt;
* JS/CSS/HTML: limited by what minimization tools support: [[Game_interface_logic:_yourgamename.js#Javascript_minimization_.28after_July_2020.29|JS minimization]]&lt;br /&gt;
* Font Awesome: 4.7 https://fontawesome.com/v4.7/icons/ (available as &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;i class=&amp;quot;fa fa-clock&amp;quot; /&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;)&lt;br /&gt;
* Font Awesome: 6.4.0 https://fontawesome.com/v6/search?o=r&amp;amp;m=free (available as &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;i class=&amp;quot;fa6 fa6-clock&amp;quot; /&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
=== PHP Extensions Used ===&lt;br /&gt;
&lt;br /&gt;
The following PHP extensions are - as of May 8th, 2022 - in use in BGA Studio and available:&lt;br /&gt;
&lt;br /&gt;
date, libxml, openssl, pcre, zlib, filter, hash, Reflection, SPL, session, standard, sodium, apache2handler, mysqlnd, PDO, xml, apcu, bz2, calendar, ctype, curl, dom, mbstring, FFI, fileinfo, ftp, gd, gettext, gmp, iconv, igbinary, json, exif, msgpack, mysqli, pdo_mysql, apc, posix, readline, shmop, SimpleXML, sockets, sysvmsg, sysvsem, sysvshm, tokenizer, v8js, xmlreader, xmlwriter, xsl, zip, Phar, memcached, Zend OPcache&lt;br /&gt;
&lt;br /&gt;
== Other resources ==&lt;br /&gt;
&lt;br /&gt;
[http://forum.boardgamearena.com/viewforum.php?f=12 Development forum]&lt;br /&gt;
&lt;br /&gt;
[https://studio.boardgamearena.com/bugs Bug tracking system FOR STUDIO issues and APIs]&lt;br /&gt;
&lt;br /&gt;
DISCORD chat server/room invite link https://discord.gg/YxEUacY if it does not work check this topic https://forum.boardgamearena.com/viewtopic.php?f=12&amp;amp;t=17403&amp;amp;hilit=discord&lt;br /&gt;
&lt;br /&gt;
Developer BLOGS https://bga-devs.github.io/blog/&lt;br /&gt;
&lt;br /&gt;
[[Contact BGA Studio]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Studio]]&lt;/div&gt;</summary>
		<author><name>Lymon Flowers</name></author>
	</entry>
	<entry>
		<id>https://en.doc.boardgamearena.com/index.php?title=Gamehelpmedina&amp;diff=7833</id>
		<title>Gamehelpmedina</title>
		<link rel="alternate" type="text/html" href="https://en.doc.boardgamearena.com/index.php?title=Gamehelpmedina&amp;diff=7833"/>
		<updated>2021-04-02T14:41:53Z</updated>

		<summary type="html">&lt;p&gt;Lymon Flowers: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
&lt;br /&gt;
In Medina, players must place two pieces on the board (except when allowed to skip this with a tea tile), either augmenting an existing building (or starting a new building if the current building of that color is finished), or expanding one of the other features of the city, like the market or the walls.  Each player will claim one building of each of the four colors by the end of the game, giving one point per wooden piece attached to the building.&lt;br /&gt;
&lt;br /&gt;
Also, if you own the largest building of a particular color you get a bonus for that color. Finally, there are bonuses for palaces around the well, as well as for the player who most recently connected one of their buildings to the walls, which grow from the four corners of the city.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Setup ==&lt;br /&gt;
&lt;br /&gt;
Depending on edition selected and players number, each player receives a number of blocks that they will place on the board in turn:&lt;br /&gt;
&lt;br /&gt;
* in a 2 players game&lt;br /&gt;
** buildings: 8&lt;br /&gt;
** rooftops: 4&lt;br /&gt;
** neutral rooftops: 2 (if applicable)&lt;br /&gt;
** stables: 4&lt;br /&gt;
** merchants: 12&lt;br /&gt;
** walls: 15&lt;br /&gt;
* in a 3 players game:&lt;br /&gt;
** buildings: 6&lt;br /&gt;
** rooftops: 4&lt;br /&gt;
** neutral rooftop: 1 (if applicable)&lt;br /&gt;
** stables: 4&lt;br /&gt;
** merchants: 8&lt;br /&gt;
** walls: 12&lt;br /&gt;
* in a 4 players game:&lt;br /&gt;
** buildings: 5,&lt;br /&gt;
** rooftops: 4&lt;br /&gt;
** stables: 3&lt;br /&gt;
** merchants: 6&lt;br /&gt;
** walls: 9&lt;br /&gt;
&lt;br /&gt;
A merchant is placed randomly on the board as well as a well if applicable.&lt;br /&gt;
&lt;br /&gt;
A first player is randomly chosen.&lt;br /&gt;
&lt;br /&gt;
=== Game options ===&lt;br /&gt;
&lt;br /&gt;
The following options can be selected or deselected prior to a game:&lt;br /&gt;
&lt;br /&gt;
==== Fountain ====&lt;br /&gt;
If this option is activated, a well will be created on a random field on the game board before the start of the&lt;br /&gt;
game. For each part of the palace that is directly orthogonally adjacent to the fountain, there are 4&lt;br /&gt;
additional points. The fields for which there are 4 points each are marked in blue on the game board.&lt;br /&gt;
&lt;br /&gt;
==== Tea tiles ====&lt;br /&gt;
If this option is activated, there are 6 purple tea tiles in the game. If you take possession of the first purple&lt;br /&gt;
palace, you receive 3 tea tiles. The player who takes possession of the second purple palace receives 2 tea&lt;br /&gt;
tiles. And the third player receives 1 tea tile. If a player owns tea tiles, he can take tea breaks. He then only&lt;br /&gt;
has to build a piece of wood in his turn and can then, instead of playing another piece of wood, give a tea&lt;br /&gt;
tile.&lt;br /&gt;
&lt;br /&gt;
==== Merchants on the tower tiles ====&lt;br /&gt;
When this option is activated, 6 additional merchants come into game. There are 3 merchants on the 1&lt;br /&gt;
tower tile, 2 merchants on the 2 tower tile and 1 merchant on the 3 tower tile. The player who wins such a&lt;br /&gt;
tower tile first receives additional 1, 2 or 3 merchants.&lt;br /&gt;
&lt;br /&gt;
==== Neutral rooftops ====&lt;br /&gt;
If this option is activated in the game with three people, each player also receives a neutral grey roof. If a&lt;br /&gt;
neutral, grey roof is placed on a palace, this palace does not belong to any player.&lt;br /&gt;
In a two-player game, each player always receives 2 neutral roofs. In a game for two, the neutral roofs&lt;br /&gt;
cannot be deactivated. The first edition of Medina could only be played by three or four players. With the&lt;br /&gt;
neutral roofs, the game on a slightly smaller game board also works very well for two. In a four-player&lt;br /&gt;
game, the neutral roofs are not available.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Blocks ==&lt;br /&gt;
&lt;br /&gt;
=== Buildings ===&lt;br /&gt;
These are the blocks received in the largest quantity.  They come in four colors: white, purple, maroon, orange.&lt;br /&gt;
&lt;br /&gt;
Adjacent buildings constitutes palaces, which grow in time.  A building can be placed only adjacent orthogonally to an unfinished palace of this color or anywhere on the board if no palace of this color is unfinished.&lt;br /&gt;
&lt;br /&gt;
Buildings cannot be placed adjacent orthogonally or diagonally to another palace, meaning there is always room for an alley between two palaces.&lt;br /&gt;
&lt;br /&gt;
=== Rooftops ===&lt;br /&gt;
Rooftops are used to claim palaces.  A player can only claim ONE palace of a given color.  Once they have placed a rooftop on a palace, this palace is finished and cannot be expanded further by buildings.&lt;br /&gt;
&lt;br /&gt;
Also, if a player claims the largest palace they will get the palace tile of this color for additional points.  Palace tiles can change hands several times.&lt;br /&gt;
&lt;br /&gt;
In 2nd edition game, players will also receive neutral rooftops used to finish palaces and thwart opponents plans.  Palace tiles can be claimed by the &amp;quot;neutral&amp;quot; player and be placed back onto the board.&lt;br /&gt;
&lt;br /&gt;
=== Stables ===&lt;br /&gt;
Stables can be used only to expand existing palaces. They must be placed orthogonally adjacent to a palace (finished or not).  As buildings, they must not be placed orthogonally or diagonally to another palace.&lt;br /&gt;
&lt;br /&gt;
=== Walls ===&lt;br /&gt;
Walls are placed next to a tower (there is one on each corner of the board) or to another wall.  Chains of walls are then created from each corner, but corners must be separated by an empty places (a gate) between the chains of walls.&lt;br /&gt;
&lt;br /&gt;
When a wall is placed orthogonally adjacent to a finished palace (including stables), the owning player receives a watcher tile for additional points.  Also, when a finished palace is expanded with a stable to connect to an already existing wall, the owner player receives a watcher tile.&lt;br /&gt;
&lt;br /&gt;
Neutral player can claim watcher tiles.&lt;br /&gt;
&lt;br /&gt;
=== Merchants ===&lt;br /&gt;
Merchants can only be placed next to an existing merchant in order to create a string of merchants (the market).  A merchant can only be placed orthogonally to one and ONLY one existing merchant in either ends of the market.  If both ends of the market are blocked, new merchants can be placed anywhere save adjacent to existing merchants, creating a new market.&lt;br /&gt;
&lt;br /&gt;
=== Tea tiles ===&lt;br /&gt;
If applicable, the first players to claim purple palace will receive tea tiles.  Playing a tea tile will allow a player to pass by clicking on it in their inventory.  It is not possible to pass twice in a turn.&lt;br /&gt;
&lt;br /&gt;
Neutral player can claim tea tiles (which are removed from play).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== End game and scoring ==&lt;br /&gt;
When a player is unable to play they pass until they can play again.  When all players are unable to play, game ends and the winner is the player with the most points.  Points are awarded as follows:&lt;br /&gt;
&lt;br /&gt;
* each building or stable constituting a palace: 1 point&lt;br /&gt;
* each wall adjacent to a palace: +1 point to that palace&lt;br /&gt;
* each merchant adjacent to a palace: +1 point to that palace (a single merchant may be scored multiple times if adjacent to two or more palaces)&lt;br /&gt;
* each palace orthogonally separated two spaces away from the well (see water icons): 4 points&lt;br /&gt;
* each palace tile: 1-4 points&lt;br /&gt;
* each watcher tile: 1-4 point&lt;br /&gt;
&lt;br /&gt;
In case of ties, the player with the largest palace wins.  In case of another tie, the player owning the largest palace that has been claimed first wins.&lt;br /&gt;
&lt;br /&gt;
== Differences between editions ==&lt;br /&gt;
There are significant differences between the two editions of the game.  Only the second edition is implemented there, with the possibility to disable some of the 2nd edition features.&lt;br /&gt;
&lt;br /&gt;
=== Well ===&lt;br /&gt;
In second edition, a palace that has a building or stable that is separated orthogonally by one space from the well grants four more points to its owner.&lt;br /&gt;
&lt;br /&gt;
This can be disabled.&lt;br /&gt;
&lt;br /&gt;
=== Merchants on watcher tiles ===&lt;br /&gt;
In second edition, merchants are placed on watcher tiles.  The first player to claim a watcher also receives the merchants.  If the neutral player claims this watcher tile, the merchants are removed from play.&lt;br /&gt;
&lt;br /&gt;
This can be disabled.&lt;br /&gt;
&lt;br /&gt;
=== Tea tiles ===&lt;br /&gt;
In second edition, the first players to claim purple palaces will receive tea tiles (3, then 2, then 1).  Playing a tea tile will allow a player to pass by clicking on it in their inventory.  It is not possible to pass twice in a turn.&lt;br /&gt;
&lt;br /&gt;
This can be disabled.&lt;br /&gt;
&lt;br /&gt;
=== Last player with rooftops ===&lt;br /&gt;
In first edition, if there is only one player with rooftops left they MUST play at least one rooftop each turn if possible.  The game will refuse to finish a turn if that constraint is not satisfied.  Once this player does not have rooftops anymore, they can still continue to play normally.&lt;br /&gt;
&lt;br /&gt;
This behavior is not present in this game adaptation.&lt;br /&gt;
&lt;br /&gt;
=== First turn ===&lt;br /&gt;
In a second edition game, the first player of a two players game only plays one block in their first turn (and also the second player in a three or four players game).&lt;br /&gt;
&lt;br /&gt;
This behavior is not present in this game adaptation&lt;br /&gt;
&lt;br /&gt;
=== Neutral roofs ===&lt;br /&gt;
In a first edition game, there is no neutral rooftop and hence no neutral player to claim tiles.&lt;br /&gt;
&lt;br /&gt;
This can be disabled in 3 player games and no neutral rooftop is available in a 4 players game.&lt;br /&gt;
&lt;br /&gt;
=== Number of blocks ===&lt;br /&gt;
In a first and second edition game, the number of blocks received during game setup is different.&lt;/div&gt;</summary>
		<author><name>Lymon Flowers</name></author>
	</entry>
	<entry>
		<id>https://en.doc.boardgamearena.com/index.php?title=Gamehelpmedina&amp;diff=7545</id>
		<title>Gamehelpmedina</title>
		<link rel="alternate" type="text/html" href="https://en.doc.boardgamearena.com/index.php?title=Gamehelpmedina&amp;diff=7545"/>
		<updated>2021-03-04T15:42:01Z</updated>

		<summary type="html">&lt;p&gt;Lymon Flowers: Remove useless linefeeds&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
&lt;br /&gt;
In Medina, players must place two pieces on the board (except when allowed to skip this with a tea tile), either augmenting an existing building (or starting a new building if the current building of that color is finished), or expanding one of the other features of the city, like the market or the walls.  Each player will claim one building of each of the four colors by the end of the game, giving one point per wooden piece attached to the building.&lt;br /&gt;
&lt;br /&gt;
Also, if you own the largest building of a particular color you get a bonus for that color. Finally, there are bonuses for palaces around the well, as well as for the player who most recently connected one of their buildings to the walls, which grow from the four corners of the city.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Setup ==&lt;br /&gt;
&lt;br /&gt;
Depending on edition selected and players number, each player receives a number of blocks that they will place on the board in turn:&lt;br /&gt;
&lt;br /&gt;
* in a 2 players game&lt;br /&gt;
** buildings: 8&lt;br /&gt;
** rooftops: 4&lt;br /&gt;
** neutral rooftops: 2 (if applicable)&lt;br /&gt;
** stables: 4&lt;br /&gt;
** merchants: 12&lt;br /&gt;
** walls: 15&lt;br /&gt;
* in a 3 players game:&lt;br /&gt;
** buildings: 6&lt;br /&gt;
** rooftops: 4&lt;br /&gt;
** neutral rooftop: 1 (if applicable)&lt;br /&gt;
** stables: 4&lt;br /&gt;
** merchants: 8&lt;br /&gt;
** walls: 12&lt;br /&gt;
* in a 4 players game:&lt;br /&gt;
** buildings: 5,&lt;br /&gt;
** rooftops: 4&lt;br /&gt;
** stables: 3&lt;br /&gt;
** merchants: 6&lt;br /&gt;
** walls: 9&lt;br /&gt;
&lt;br /&gt;
A merchant is placed randomly on the board as well as a well if applicable.&lt;br /&gt;
&lt;br /&gt;
A first player is randomly chosen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Blocks ==&lt;br /&gt;
&lt;br /&gt;
=== Buildings ===&lt;br /&gt;
These are the blocks received in the largest quantity.  They come in four colors: white, purple, maroon, orange.&lt;br /&gt;
&lt;br /&gt;
Adjacent buildings constitutes palaces, which grow in time.  A building can be placed only adjacent orthogonally to an unfinished palace of this color or anywhere on the board if no palace of this color is unfinished.&lt;br /&gt;
&lt;br /&gt;
Buildings cannot be placed adjacent orthogonally or diagonally to another palace, meaning there is always room for an alley between two palaces.&lt;br /&gt;
&lt;br /&gt;
=== Rooftops ===&lt;br /&gt;
Rooftops are used to claim palaces.  A player can only claim ONE palace of a given color.  Once they have placed a rooftop on a palace, this palace is finished and cannot be expanded further by buildings.&lt;br /&gt;
&lt;br /&gt;
Also, if a player claims the largest palace they will get the palace tile of this color for additional points.  Palace tiles can change hands several times.&lt;br /&gt;
&lt;br /&gt;
In 2nd edition game, players will also receive neutral rooftops used to finish palaces and thwart opponents plans.  Palace tiles can be claimed by the &amp;quot;neutral&amp;quot; player and be placed back onto the board.&lt;br /&gt;
&lt;br /&gt;
=== Stables ===&lt;br /&gt;
Stables can be used only to expand existing palaces. They must be placed orthogonally adjacent to a palace (finished or not).  As buildings, they must not be placed orthogonally or diagonally to another palace.&lt;br /&gt;
&lt;br /&gt;
=== Walls ===&lt;br /&gt;
Walls are placed next to a tower (there is one on each corner of the board) or to another wall.  Chains of walls are then created from each corner, but corners must be separated by an empty places (a gate) between the chains of walls.&lt;br /&gt;
&lt;br /&gt;
When a wall is placed orthogonally adjacent to a finished palace (including stables), the owning player receives a watcher tile for additional points.  Also, when a finished palace is expanded with a stable to connect to an already existing wall, the owner player receives a watcher tile.  &lt;br /&gt;
&lt;br /&gt;
Neutral player can claim watcher tiles.&lt;br /&gt;
&lt;br /&gt;
=== Merchants ===&lt;br /&gt;
Merchants can only be placed next to an existing merchant in order to create a string of merchants (the market).  A merchant can only be placed orthogonally to one and ONLY one existing merchant in either ends of the market.  If both ends of the market are blocked, new merchants can be placed anywhere save adjacent to existing merchants, creating a new market.&lt;br /&gt;
&lt;br /&gt;
=== Tea tiles ===&lt;br /&gt;
If applicable, the first players to claim purple palace will receive tea tiles.  Playing a tea tile will allow a player to pass by clicking on it in their inventory.  It is not possible to pass twice in a turn.&lt;br /&gt;
&lt;br /&gt;
Neutral player can claim tea tiles (which are removed from play).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== End game and scoring ==&lt;br /&gt;
When a player is unable to play they passe until they can play again.  When all players are unable to play, game ends and the winner is the player with the most points.  Points are awarded as follows:&lt;br /&gt;
&lt;br /&gt;
* each building or stable constituting a palace: 1 point&lt;br /&gt;
* each wall adjacent to a palace: 1 point&lt;br /&gt;
* each merchant adjacent to a palace: 1 point (NOT counted double it adjacent to two or more buildings)&lt;br /&gt;
* each palace orthogonally separated two spaces away from the well (see water icons): 4 points&lt;br /&gt;
* each palace tile: 1-4 points&lt;br /&gt;
* each watcher tile: 1-4 point&lt;br /&gt;
&lt;br /&gt;
In case of ties, the player with the largest palace wins.  In case of another tie, the player owning the largest palace that has been claimed first wins.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Differences between editions ==&lt;br /&gt;
There are significant differences between the two editions of the game.  Only the second edition is implemented there, with the possibility to disable some of the 2nd edition features.&lt;br /&gt;
&lt;br /&gt;
=== Well ===&lt;br /&gt;
In second edition, a palace that has a building or stable that is separated orthogonally by one space from the well grants four more points to its owner.&lt;br /&gt;
&lt;br /&gt;
This can be disabled.&lt;br /&gt;
&lt;br /&gt;
=== Merchants on watcher tiles ===&lt;br /&gt;
In second edition, merchants are placed on watcher tiles.  The first player to claim a watcher also receives the merchants.  If the neutral player claims this watcher tile, the merchants are removed from play.&lt;br /&gt;
&lt;br /&gt;
This can be disabled.&lt;br /&gt;
&lt;br /&gt;
=== Tea tiles ===&lt;br /&gt;
In second edition, the first players to claim purple palaces will receive tea tiles (3, then 2, then 1).  Playing a tea tile will allow a player to pass by clicking on it in their inventory.  It is not possible to pass twice in a turn.&lt;br /&gt;
&lt;br /&gt;
This can be disabled.&lt;br /&gt;
&lt;br /&gt;
=== Last player with rooftops ===&lt;br /&gt;
In first edition, if there is only one player with rooftops left they MUST play at least one rooftop each turn if possible.  The game will refuse to finish a turn if that constraint is not satisfied.  Once this player does not have rooftops anymore, they can still continue to play normally.&lt;br /&gt;
&lt;br /&gt;
This behavior is not present in this game adaptation.&lt;br /&gt;
&lt;br /&gt;
=== First turn ===&lt;br /&gt;
In a second edition game, the first player of a two players game only plays one block in their first turn (and also the second player in a three or four players game).&lt;br /&gt;
&lt;br /&gt;
This behavior is not present in this game adaptation&lt;br /&gt;
&lt;br /&gt;
=== Neutral roofs ===&lt;br /&gt;
In a first edition game, there is no neutral rooftop and hence no neutral player to claim tiles.&lt;br /&gt;
&lt;br /&gt;
This can be disabled in 3 player games and no neutral rooftop is available in a 4 players game.&lt;br /&gt;
&lt;br /&gt;
=== Number of blocks ===&lt;br /&gt;
In a first and second edition game, the number of blocks received during game setup is different.&lt;/div&gt;</summary>
		<author><name>Lymon Flowers</name></author>
	</entry>
	<entry>
		<id>https://en.doc.boardgamearena.com/index.php?title=Gamehelpmedina&amp;diff=7544</id>
		<title>Gamehelpmedina</title>
		<link rel="alternate" type="text/html" href="https://en.doc.boardgamearena.com/index.php?title=Gamehelpmedina&amp;diff=7544"/>
		<updated>2021-03-04T15:29:48Z</updated>

		<summary type="html">&lt;p&gt;Lymon Flowers: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
&lt;br /&gt;
In Medina, players must place two pieces on the board (except when allowed to skip this with a tea tile), either augmenting an existing building (or starting a new building if the current building of that color is finished), or expanding one of the other features of the city, like the market or the walls.  Each player will claim one building of each of the four colors by the end of the game, giving one point per wooden piece attached to the building.&lt;br /&gt;
&lt;br /&gt;
Also, if you own the largest building of a particular color you get a bonus for that color. Finally, there are bonuses for palaces around the well, as well as for the player who most recently connected one of their buildings to the walls, which grow from the four corners of the city.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Setup ==&lt;br /&gt;
&lt;br /&gt;
Depending on edition selected and players number, each player receives a number of blocks that they will place on the board in turn:&lt;br /&gt;
&lt;br /&gt;
* in a 2 players game&lt;br /&gt;
** buildings: 8&lt;br /&gt;
** rooftops: 4&lt;br /&gt;
** neutral rooftops: 2 (if applicable)&lt;br /&gt;
** stables: 4&lt;br /&gt;
** merchants: 12&lt;br /&gt;
** walls: 15&lt;br /&gt;
* in a 3 players game:&lt;br /&gt;
** buildings: 6&lt;br /&gt;
** rooftops: 4&lt;br /&gt;
** neutral rooftop: 1 (if applicable)&lt;br /&gt;
** stables: 4&lt;br /&gt;
** merchants: 8&lt;br /&gt;
** walls: 12&lt;br /&gt;
* in a 4 players game:&lt;br /&gt;
** buildings: 5,&lt;br /&gt;
** rooftops: 4&lt;br /&gt;
** stables: 3&lt;br /&gt;
** merchants: 6&lt;br /&gt;
** walls: 9&lt;br /&gt;
&lt;br /&gt;
A merchant is placed randomly on the board as well as a well if applicable.&lt;br /&gt;
&lt;br /&gt;
A first player is randomly chosen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Blocks ==&lt;br /&gt;
&lt;br /&gt;
=== Buildings ===&lt;br /&gt;
These are the blocks received in the largest quantity.  They come in four colors: white, purple, maroon, orange.&lt;br /&gt;
&lt;br /&gt;
Adjacent buildings constitutes palaces, which grow in time.  A building can be placed only adjacent orthogonally to an unfinished palace of this color or anywhere on the board if no palace of this color is unfinished.&lt;br /&gt;
&lt;br /&gt;
Buildings cannot be placed adjacent orthogonally or diagonally to another palace, meaning there is always room for an alley between two palaces.&lt;br /&gt;
&lt;br /&gt;
=== Rooftops ===&lt;br /&gt;
Rooftops are used to claim palaces.  A player can only claim ONE palace of a given color.  Once they have placed a rooftop on a palace, this palace is finished and cannot be expanded further by buildings.&lt;br /&gt;
&lt;br /&gt;
Also, if a player claims the largest palace they will get the palace tile of this color for additional points.  Palace tiles can change hands several times.&lt;br /&gt;
&lt;br /&gt;
In 2nd edition game, players will also receive neutral rooftops used to finish palaces and thwart opponents plans.  Palace tiles can be claimed by the &amp;quot;neutral&amp;quot; player and be placed back onto the board.&lt;br /&gt;
&lt;br /&gt;
=== Stables ===&lt;br /&gt;
Stables can be used only to expand existing palaces. They must be placed orthogonally adjacent to a palace (finished or not).  As buildings, they must not be placed orthogonally or diagonally to another palace.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Walls ===&lt;br /&gt;
Walls are placed next to a tower (there is one on each corner of the board) or to another wall.  Chains of walls are then created from each corner, but corners must be separated by an empty places (a gate) between the chains of walls.&lt;br /&gt;
&lt;br /&gt;
When a wall is placed orthogonally adjacent to a finished palace (including stables), the owning player receives a watcher tile for additional points.  Also, when a finished palace is expanded with a stable to connect to an already existing wall, the owner player receives a watcher tile.  &lt;br /&gt;
&lt;br /&gt;
Neutral player can claim watcher tiles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Merchants ===&lt;br /&gt;
Merchants can only be placed next to an existing merchant in order to create a string of merchants (the market).  A merchant can only be placed orthogonally to one and ONLY one existing merchant in either ends of the market.  If both ends of the market are blocked, new merchants can be placed anywhere save adjacent to existing merchants, creating a new market.&lt;br /&gt;
&lt;br /&gt;
=== Tea tiles ===&lt;br /&gt;
If applicable, the first players to claim purple palace will receive tea tiles.  Playing a tea tile will allow a player to pass by clicking on it in their inventory.  It is not possible to pass twice in a turn.&lt;br /&gt;
&lt;br /&gt;
Neutral player can claim tea tiles (which are removed from play).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== End game and scoring ==&lt;br /&gt;
When a player is unable to play they passe until they can play again.  When all players are unable to play, game ends and the winner is the player with the most points.  Points are awarded as follows:&lt;br /&gt;
&lt;br /&gt;
* each building or stable constituting a palace: 1 point&lt;br /&gt;
* each wall adjacent to a palace: 1 point&lt;br /&gt;
* each merchant adjacent to a palace: 1 point (NOT counted double it adjacent to two or more buildings)&lt;br /&gt;
* each palace orthogonally separated two spaces away from the well (see water icons): 4 points&lt;br /&gt;
* each palace tile: 1-4 points&lt;br /&gt;
* each watcher tile: 1-4 point&lt;br /&gt;
&lt;br /&gt;
In case of ties, the player with the largest palace wins.  In case of another tie, the player owning the largest palace that has been claimed first wins.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Differences between editions ==&lt;br /&gt;
There are significant differences between the two editions of the game.  Only the second edition is implemented there, with the possibility to disable some of the 2nd edition features.&lt;br /&gt;
&lt;br /&gt;
=== Well ===&lt;br /&gt;
In second edition, a palace that has a building or stable that is separated orthogonally by one space from the well grants four more points to its owner.&lt;br /&gt;
&lt;br /&gt;
This can be disabled.&lt;br /&gt;
&lt;br /&gt;
=== Merchants on watcher tiles ===&lt;br /&gt;
In second edition, merchants are placed on watcher tiles.  The first player to claim a watcher also receives the merchants.  If the neutral player claims this watcher tile, the merchants are removed from play.&lt;br /&gt;
&lt;br /&gt;
This can be disabled.&lt;br /&gt;
&lt;br /&gt;
=== Tea tiles ===&lt;br /&gt;
In second edition, the first players to claim purple palaces will receive tea tiles (3, then 2, then 1).  Playing a tea tile will allow a player to pass by clicking on it in their inventory.  It is not possible to pass twice in a turn.&lt;br /&gt;
&lt;br /&gt;
This can be disabled.&lt;br /&gt;
&lt;br /&gt;
=== Last player with rooftops ===&lt;br /&gt;
In first edition, if there is only one player with rooftops left they MUST play at least one rooftop each turn if possible.  The game will refuse to finish a turn if that constraint is not satisfied.  Once this player does not have rooftops anymore, they can still continue to play normally.&lt;br /&gt;
&lt;br /&gt;
This behavior is not present in this game adaptation.&lt;br /&gt;
&lt;br /&gt;
=== First turn ===&lt;br /&gt;
In a second edition game, the first player of a two players game only plays one block in their first turn (and also the second player in a three or four players game).&lt;br /&gt;
&lt;br /&gt;
This behavior is not present in this game adaptation&lt;br /&gt;
&lt;br /&gt;
=== Neutral roofs ===&lt;br /&gt;
In a first edition game, there is no neutral rooftop and hence no neutral player to claim tiles.&lt;br /&gt;
&lt;br /&gt;
This can be disabled in 3 player games and no neutral rooftop is available in a 4 players game.&lt;br /&gt;
&lt;br /&gt;
=== Number of blocks ===&lt;br /&gt;
In a first and second edition game, the number of blocks received during game setup is different.&lt;/div&gt;</summary>
		<author><name>Lymon Flowers</name></author>
	</entry>
	<entry>
		<id>https://en.doc.boardgamearena.com/index.php?title=Gamehelpmedina&amp;diff=7543</id>
		<title>Gamehelpmedina</title>
		<link rel="alternate" type="text/html" href="https://en.doc.boardgamearena.com/index.php?title=Gamehelpmedina&amp;diff=7543"/>
		<updated>2021-03-04T15:26:53Z</updated>

		<summary type="html">&lt;p&gt;Lymon Flowers: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
&lt;br /&gt;
In Medina, players must place two pieces on the board (except when allowed to skip this with a tea tile), either augmenting an existing building (or starting a new building if the current building of that color is finished), or expanding one of the other features of the city, like the market or the walls.  Each player will claim one building of each of the four colors by the end of the game, giving one point per wooden piece attached to the building.&lt;br /&gt;
&lt;br /&gt;
Also, if you own the largest building of a particular color you get a bonus for that color. Finally, there are bonuses for palaces around the well, as well as for the player who most recently connected one of their buildings to the walls, which grow from the four corners of the city.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Setup ==&lt;br /&gt;
&lt;br /&gt;
Depending on edition selected and players number, each player receives a number of blocks that they will place on the board in turn.&lt;br /&gt;
&lt;br /&gt;
A merchant is placed randomly on the board as well as a well if applicable.&lt;br /&gt;
&lt;br /&gt;
A first player is randomly chosen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Blocks ==&lt;br /&gt;
&lt;br /&gt;
=== Buildings ===&lt;br /&gt;
These are the blocks received in the largest quantity.  They come in four colors: white, purple, maroon, orange.&lt;br /&gt;
&lt;br /&gt;
Adjacent buildings constitutes palaces, which grow in time.  A building can be placed only adjacent orthogonally to an unfinished palace of this color or anywhere on the board if no palace of this color is unfinished.&lt;br /&gt;
&lt;br /&gt;
Buildings cannot be placed adjacent orthogonally or diagonally to another palace, meaning there is always room for an alley between two palaces.&lt;br /&gt;
&lt;br /&gt;
=== Rooftops ===&lt;br /&gt;
Rooftops are used to claim palaces.  A player can only claim ONE palace of a given color.  Once they have placed a rooftop on a palace, this palace is finished and cannot be expanded further by buildings.&lt;br /&gt;
&lt;br /&gt;
Also, if a player claims the largest palace they will get the palace tile of this color for additional points.  Palace tiles can change hands several times.&lt;br /&gt;
&lt;br /&gt;
In 2nd edition game, players will also receive neutral rooftops used to finish palaces and thwart opponents plans.  Palace tiles can be claimed by the &amp;quot;neutral&amp;quot; player and be placed back onto the board.&lt;br /&gt;
&lt;br /&gt;
=== Stables ===&lt;br /&gt;
Stables can be used only to expand existing palaces. They must be placed orthogonally adjacent to a palace (finished or not).  As buildings, they must not be placed orthogonally or diagonally to another palace.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Walls ===&lt;br /&gt;
Walls are placed next to a tower (there is one on each corner of the board) or to another wall.  Chains of walls are then created from each corner, but corners must be separated by an empty places (a gate) between the chains of walls.&lt;br /&gt;
&lt;br /&gt;
When a wall is placed orthogonally adjacent to a finished palace (including stables), the owning player receives a watcher tile for additional points.  Also, when a finished palace is expanded with a stable to connect to an already existing wall, the owner player receives a watcher tile.  &lt;br /&gt;
&lt;br /&gt;
Neutral player can claim watcher tiles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Merchants ===&lt;br /&gt;
Merchants can only be placed next to an existing merchant in order to create a string of merchants (the market).  A merchant can only be placed orthogonally to one and ONLY one existing merchant in either ends of the market.  If both ends of the market are blocked, new merchants can be placed anywhere save adjacent to existing merchants, creating a new market.&lt;br /&gt;
&lt;br /&gt;
=== Tea tiles ===&lt;br /&gt;
If applicable, the first players to claim purple palace will receive tea tiles.  Playing a tea tile will allow a player to pass by clicking on it in their inventory.  It is not possible to pass twice in a turn.&lt;br /&gt;
&lt;br /&gt;
Neutral player can claim tea tiles (which are removed from play).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== End game and scoring ==&lt;br /&gt;
When a player is unable to play they passe until they can play again.  When all players are unable to play, game ends and the winner is the player with the most points.  Points are awarded as follows:&lt;br /&gt;
&lt;br /&gt;
* each building or stable constituting a palace: 1 point&lt;br /&gt;
* each wall adjacent to a palace: 1 point&lt;br /&gt;
* each merchant adjacent to a palace: 1 point (NOT counted double it adjacent to two or more buildings)&lt;br /&gt;
* each palace orthogonally separated two spaces away from the well (see water icons): 4 points&lt;br /&gt;
* each palace tile: 1-4 points&lt;br /&gt;
* each watcher tile: 1-4 point&lt;br /&gt;
&lt;br /&gt;
In case of ties, the player with the largest palace wins.  In case of another tie, the player owning the largest palace that has been claimed first wins.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Differences between editions ==&lt;br /&gt;
There are significant differences between the two editions of the game.  Only the second edition is implemented there, with the possibility to disable some of the 2nd edition features.&lt;br /&gt;
&lt;br /&gt;
=== Well ===&lt;br /&gt;
In second edition, a palace that has a building or stable that is separated orthogonally by one space from the well grants four more points to its owner.&lt;br /&gt;
&lt;br /&gt;
This can be disabled.&lt;br /&gt;
&lt;br /&gt;
=== Merchants on watcher tiles ===&lt;br /&gt;
In second edition, merchants are placed on watcher tiles.  The first player to claim a watcher also receives the merchants.  If the neutral player claims this watcher tile, the merchants are removed from play.&lt;br /&gt;
&lt;br /&gt;
This can be disabled.&lt;br /&gt;
&lt;br /&gt;
=== Tea tiles ===&lt;br /&gt;
In second edition, the first players to claim purple palaces will receive tea tiles (3, then 2, then 1).  Playing a tea tile will allow a player to pass by clicking on it in their inventory.  It is not possible to pass twice in a turn.&lt;br /&gt;
&lt;br /&gt;
This can be disabled.&lt;br /&gt;
&lt;br /&gt;
=== Last player with rooftops ===&lt;br /&gt;
In first edition, if there is only one player with rooftops left they MUST play at least one rooftop each turn if possible.  The game will refuse to finish a turn if that constraint is not satisfied.  Once this player does not have rooftops anymore, they can still continue to play normally.&lt;br /&gt;
&lt;br /&gt;
This behavior is not present in this game adaptation.&lt;br /&gt;
&lt;br /&gt;
=== First turn ===&lt;br /&gt;
In a second edition game, the first player of a two players game only plays one block in their first turn (and also the second player in a three or four players game).&lt;br /&gt;
&lt;br /&gt;
This behavior is not present in this game adaptation&lt;br /&gt;
&lt;br /&gt;
=== Neutral roofs ===&lt;br /&gt;
In a first edition game, there is no neutral rooftop and hence no neutral player to claim tiles.&lt;br /&gt;
&lt;br /&gt;
This can be disabled in 3 player games and no neutral rooftop is available in a 4 players game.&lt;br /&gt;
&lt;br /&gt;
=== Number of blocks ===&lt;br /&gt;
In a first and second edition game, the number of blocks received during game setup is different.&lt;/div&gt;</summary>
		<author><name>Lymon Flowers</name></author>
	</entry>
</feed>