<?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=C12h22o11</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=C12h22o11"/>
	<link rel="alternate" type="text/html" href="https://en.doc.boardgamearena.com/Special:Contributions/C12h22o11"/>
	<updated>2026-10-01T22:53:28Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.39.0</generator>
	<entry>
		<id>https://en.doc.boardgamearena.com/index.php?title=Gamehelpringyo&amp;diff=30413</id>
		<title>Gamehelpringyo</title>
		<link rel="alternate" type="text/html" href="https://en.doc.boardgamearena.com/index.php?title=Gamehelpringyo&amp;diff=30413"/>
		<updated>2026-06-26T06:39:06Z</updated>

		<summary type="html">&lt;p&gt;C12h22o11: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Ringyō ==&lt;br /&gt;
In Ringyō, players act as Daimyos to manage the forest in the province of feudal Japan. They manage their Province (their personal player board) to grow and harvest trees, build structures, and fulfill demands. The game is played over 5 rounds, and the player with the most Honor Points (HP) at the end of the game wins.&lt;br /&gt;
&lt;br /&gt;
Each round consists of 4 phases:&lt;br /&gt;
* &#039;&#039;&#039;Edo Phase:&#039;&#039;&#039; Secret card selection to determine turn order and draft round bonuses (Shogun&#039;s Gifts).&lt;br /&gt;
* &#039;&#039;&#039;Province Phase:&#039;&#039;&#039; Simultaneous worker placement to plant, grow, cut trees, harvest rice, and construct buildings.&lt;br /&gt;
* &#039;&#039;&#039;Weather Phase:&#039;&#039;&#039; Weather effects are resolved, triggering tree growth, rice harvesting, and flooding throughout the province.&lt;br /&gt;
* &#039;&#039;&#039;Demands Phase:&#039;&#039;&#039; Spending resources to claim scoring spots on shared demand tiles. (There is no Demands phase in solo mode.)&lt;br /&gt;
&lt;br /&gt;
== Sequence of a Round ==&lt;br /&gt;
&lt;br /&gt;
=== Phase 1: Edo Council Phase (Turn Order &amp;amp; Drafting) ===&lt;br /&gt;
Players bid to establish turn order and draft Shogun&#039;s Gifts:&lt;br /&gt;
* &#039;&#039;&#039;Play Diplomat:&#039;&#039;&#039; Players secretly choose one of their 6 Diplomat cards (valued #1 to #6). Playing the #6 card requires paying 2 Rice.&lt;br /&gt;
* &#039;&#039;&#039;Draft Gifts:&#039;&#039;&#039; &lt;br /&gt;
** At the beginning of each round, gift cards are dealt to the shared Edo board. &lt;br /&gt;
** In solo mode, the 1-2 cards provide access to the rightmost gift card. 3-4 provide access to the middle and right gift card. 5-6 provide access to all 3 gift cards.&lt;br /&gt;
* Used diplomat cards remain face up on the table and cannot be played again for the rest of the game.&lt;br /&gt;
&lt;br /&gt;
=== Province Phase ===&lt;br /&gt;
Players simultaneously place workers on open intersections (junctions where 3 land areas meet) to activate adjacent land areas. Workers may then take 1, 2, or 3 actions in adjacent area. Each worker may only take 1 action in each adjacent area (e.g. you cannot cut and then plant in the same space)&lt;br /&gt;
&lt;br /&gt;
==== Worker Types ====&lt;br /&gt;
* &#039;&#039;&#039;Yellow Samurai:&#039;&#039;&#039; Permanent worker (returned to you at round end). Can take an action in 2 adjacent areas.&lt;br /&gt;
* &#039;&#039;&#039;Green Samurai:&#039;&#039;&#039; Upgraded permanent worker. Can take an action in 3 adjacent areas.&lt;br /&gt;
* &#039;&#039;&#039;Artisans:&#039;&#039;&#039; Temporary worker (returned to the supply at round end). Can take an action in 2 adjacent areas.&lt;br /&gt;
* &#039;&#039;&#039;Villagers:&#039;&#039;&#039; Temporary worker (returned to the supply at round end). Can take an action in 1 adjacent area and is limited to basic actions only.&lt;br /&gt;
&lt;br /&gt;
==== Actions (Max 1 action per worker per adjacent area) ====&lt;br /&gt;
* &#039;&#039;&#039;Plant (Basic - All Workers):&#039;&#039;&#039; Add a height-1 tree of the matching area type to an empty or flooded land area.&lt;br /&gt;
* &#039;&#039;&#039;Grow (Basic - All Workers):&#039;&#039;&#039; Add 1 segment to a tree in that land area (max height 5).&lt;br /&gt;
* &#039;&#039;&#039;Cut (Basic - All Workers):&#039;&#039;&#039; Harvest all segments of a tree in that land area, placing the wood in your storage.&lt;br /&gt;
* &#039;&#039;&#039;Harvest (Basic - All Workers):&#039;&#039;&#039; Gain 1 Rice from a Rice Paddy land area (or 2 Rice if a Farm is built on it).&lt;br /&gt;
* &#039;&#039;&#039;Create Rice Paddy (Artisans/Samurai only):&#039;&#039;&#039; Flip a flood token in that land space to its Rice Paddy side.&lt;br /&gt;
* &#039;&#039;&#039;Build (Artisans/Samurai only):&#039;&#039;&#039; Construct a structure by paying wood segments of the matching tree type from your storage.&lt;br /&gt;
* &#039;&#039;&#039;Muster (Samurai only):&#039;&#039;&#039; Gain 2 military tokens (must be performed at a Fortress).&lt;br /&gt;
* &#039;&#039;&#039;Study (Samurai only):&#039;&#039;&#039; Examine an adjacent tree of matching type and height to meet your next Forestry Track requirement, advancing your marker and gaining the indicated rewards.&lt;br /&gt;
&lt;br /&gt;
==== Special Actions (No worker required, can be done at any time) ====&lt;br /&gt;
* &#039;&#039;&#039;Split:&#039;&#039;&#039; Divide a stored tree segment into smaller segments.&lt;br /&gt;
* &#039;&#039;&#039;Join:&#039;&#039;&#039; Pay 1 Rice to combine stored segments of the same tree type.&lt;br /&gt;
* &#039;&#039;&#039;Hire:&#039;&#039;&#039; Pay 2 Rice to gain a temporary Villager worker.&lt;br /&gt;
* &#039;&#039;&#039;Expand:&#039;&#039;&#039; Spend 3 military tokens to draw a bonus land tile and add it to your board, creating new intersections.&lt;br /&gt;
* &#039;&#039;&#039;Foresee:&#039;&#039;&#039; Spend 1 research token to peek at one of the unrevealed Weather cards for the round.&lt;br /&gt;
* &#039;&#039;&#039;Shogun&#039;s Favor:&#039;&#039;&#039; In solo mode, Shogun&#039;s Favor cards are used to discard the current solo goal and move to the next one.&lt;br /&gt;
&lt;br /&gt;
==== Building Rules ====&lt;br /&gt;
In order to build, you must have the exact indicated trees types and sized in your personal storage (shown on your building board). The bottom row of structures are available at the start of the game. Building structures unlocks building adjacent structures above or next to previously built structures. When building, place a token from your Structure board into the activated land area. Completing a row, column, or certain adjacent structure tiles from the building board provides a bonus indicated.&lt;br /&gt;
* &#039;&#039;&#039;Fortress:&#039;&#039;&#039; Must be built in an empty land area. Generates 1 military token at the start of each Weather Phase and unlocks the Muster action.&lt;br /&gt;
* &#039;&#039;&#039;Farm:&#039;&#039;&#039; Must be built on top of a Rice Paddy. Doubles rice production during Harvest or the Weather Phase.&lt;br /&gt;
* &#039;&#039;&#039;Row costs:&#039;&#039;&#039; Building on the top 3 rows of your province have an additional rice cost indicated on the board.&lt;br /&gt;
&lt;br /&gt;
=== Phase 3: Weather Phase (Growth &amp;amp; Floods) ===&lt;br /&gt;
* &#039;&#039;&#039;Fortresses:&#039;&#039;&#039; Gain 1 military token for each built Fortress.&lt;br /&gt;
* &#039;&#039;&#039;Resolve Weather Cards:&#039;&#039;&#039; Reveal Weather cards one at a time. Each card matches a tree type (as indicated or as forecast on the forecast card) and triggers one of two events:&lt;br /&gt;
** &#039;&#039;&#039;Rain:&#039;&#039;&#039;&lt;br /&gt;
*** All trees of that type grow by 1 segment (max 5).&lt;br /&gt;
*** Rice Paddies produce 1 rice&lt;br /&gt;
*** Farms produce 2 rice.&lt;br /&gt;
** &#039;&#039;&#039;Flood:&#039;&#039;&#039; Empty or flooded areas of that type gain a flood token.&lt;br /&gt;
* &#039;&#039;&#039;Cascades:&#039;&#039;&#039; If a land area would gain a second flood token, it cascades down-slope. One flood token slides diagonally downwards to an adjacent lower land area based on the Forecast card.&lt;br /&gt;
** A flood cannot cascade into an already flooded land area.&lt;br /&gt;
** If a flood cascades onto a tree, rice paddy, or structure, that tile is removed from the province.&lt;br /&gt;
&lt;br /&gt;
== Endgame Scoring ==&lt;br /&gt;
At the end of Round 5, players calculate their total Honor Points:&lt;br /&gt;
* &#039;&#039;&#039;Structures Built:&#039;&#039;&#039; HP printed under each built structure on your Structure Board (including those destroyed by floods).&lt;br /&gt;
* &#039;&#039;&#039;Trees in Province:&#039;&#039;&#039; Cumulative HP based on levels unlocked on your Forestry Track (e.g., +1 HP per tree of height 4+ / 3+ / 2+).&lt;br /&gt;
* &#039;&#039;&#039;Demands:&#039;&#039;&#039; HP from your completed Shogun&#039;s Demands&lt;br /&gt;
* &#039;&#039;&#039;Favor Cards:&#039;&#039;&#039; HP from up to 3 completed personal goal cards.&lt;br /&gt;
&lt;br /&gt;
The highest score wins. Ties are broken by the player who completed the most demands.&lt;br /&gt;
&lt;br /&gt;
== Solo Mode Rules ==&lt;br /&gt;
&lt;br /&gt;
=== Solo Phases ===&lt;br /&gt;
* &#039;&#039;&#039;Council Phase Drafting:&#039;&#039;&#039; Your diplomat card limits which of the 3 face-up Gifts you can draft:&lt;br /&gt;
** #1 or #2 Diplomat: Draft the right-most gift.&lt;br /&gt;
** #3 or #4 Diplomat: Draft the middle or right-most gift.&lt;br /&gt;
** #5 or #6 Diplomat: Draft any of the three gifts.&lt;br /&gt;
* &#039;&#039;&#039;Fulfilling Demands:&#039;&#039;&#039; The Shogun&#039;s demands are placed around the solo board, with 4 Shogun&#039;s demands face up (and 4 to be revealed later). Fulfill demands at any time during your turn by paying resources. You can only fulfill a demand tile that is adjacent/linked to the Samurai&#039;s current position. Fulfilling a demand moves the Samurai to that tile, places your token, and flips adjacent linked demands face-up.&lt;br /&gt;
* &#039;&#039;&#039;Scoring Goals:&#039;&#039;&#039; In the center of the solo board, there are 10 solo goals. At the start of the game, one is active, one is revealed as the next solo goal, and the remaining 8 are face down under the &amp;quot;next&amp;quot; solo goal. The active solo goal can only be scored when the Samurai is standing on an outer demand tile. If your Province meets the goal requirement, score it (4 HP), move the Samurai back to the center of the Solo Board (re-opening all face-up demands), and reveal the next goal.&lt;br /&gt;
* &#039;&#039;&#039;Winning Condition:&#039;&#039;&#039; Beat the Target Score at the end of the game:&lt;br /&gt;
** Target Score = (10 HP × Fulfilled Demands) + (20 HP × Unfulfilled Demands) + (2 × Value of your unused diplomat card).&lt;br /&gt;
* &#039;&#039;&#039;Hard Mode:&#039;&#039;&#039; Uses the B-side Solo Board with fewer connections between demands and quadruples the unused diplomat card penalty.&lt;/div&gt;</summary>
		<author><name>C12h22o11</name></author>
	</entry>
	<entry>
		<id>https://en.doc.boardgamearena.com/index.php?title=Gamehelpringyo&amp;diff=30412</id>
		<title>Gamehelpringyo</title>
		<link rel="alternate" type="text/html" href="https://en.doc.boardgamearena.com/index.php?title=Gamehelpringyo&amp;diff=30412"/>
		<updated>2026-06-26T00:17:43Z</updated>

		<summary type="html">&lt;p&gt;C12h22o11: more clear solo goal rules&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Ringyō ==&lt;br /&gt;
In Ringyō, players act as Daimyos to manage the forest in the province of feudal Japan. They manage their Province (their personal player board) to grow and harvest trees, build structures, and fulfill demands. The game is played over 5 rounds, and the player with the most Honor Points (HP) at the end of the game wins.&lt;br /&gt;
&lt;br /&gt;
Each round consists of 4 phases:&lt;br /&gt;
* &#039;&#039;&#039;Edo Phase:&#039;&#039;&#039; Secret card selection to determine turn order and draft round bonuses (Shogun&#039;s Gifts).&lt;br /&gt;
* &#039;&#039;&#039;Province Phase:&#039;&#039;&#039; Simultaneous worker placement to plant, grow, cut trees, harvest rice, and construct buildings.&lt;br /&gt;
* &#039;&#039;&#039;Weather Phase:&#039;&#039;&#039; Weather effects are resolved, triggering tree growth, rice harvesting, and flooding throughout the province.&lt;br /&gt;
* &#039;&#039;&#039;Demands Phase:&#039;&#039;&#039; Spending resources to claim scoring spots on shared demand tiles. (There is no Demands phase in solo mode.)&lt;br /&gt;
&lt;br /&gt;
== Sequence of a Round ==&lt;br /&gt;
&lt;br /&gt;
=== Phase 1: Edo Council Phase (Turn Order &amp;amp; Drafting) ===&lt;br /&gt;
Players bid to establish turn order and draft Shogun&#039;s Gifts:&lt;br /&gt;
* &#039;&#039;&#039;Play Diplomat:&#039;&#039;&#039; Players secretly choose one of their 6 Diplomat cards (valued #1 to #6). Playing the #6 card requires paying 2 Rice.&lt;br /&gt;
* &#039;&#039;&#039;Draft Gifts:&#039;&#039;&#039; &lt;br /&gt;
** At the beginning of each round, gift cards are dealt to the shared Edo board. &lt;br /&gt;
** In solo mode, the 1-2 cards provide access to the rightmost gift card. 3-4 provide access to the middle and right gift card. 5-6 provide access to all 3 gift cards.&lt;br /&gt;
* &#039;&#039;&#039;Diplomat Lock:&#039;&#039;&#039; Used diplomat cards remain face up on the table and cannot be played again for the rest of the game.&lt;br /&gt;
&lt;br /&gt;
=== Province Phase ===&lt;br /&gt;
Players simultaneously place workers on open intersections (junctions where 3 land spaces) to activate adjacent land areas. Workers must be placed at an intersection with 3 adjacent land tiles.&lt;br /&gt;
&lt;br /&gt;
==== Worker Types ====&lt;br /&gt;
* &#039;&#039;&#039;Yellow Samurai:&#039;&#039;&#039; Permanent worker (returned to you at round end). Can take an action in 2 adjacent areas.&lt;br /&gt;
* &#039;&#039;&#039;Green Samurai:&#039;&#039;&#039; Upgraded permanent worker. Can take an action in 3 adjacent areas.&lt;br /&gt;
* &#039;&#039;&#039;Artisans:&#039;&#039;&#039; Temporary worker (returned to the supply at round end). Can take an action in 2 adjacent areas.&lt;br /&gt;
* &#039;&#039;&#039;Villagers:&#039;&#039;&#039; Temporary worker (returned to the supply at round end). Can take an action in 1 adjacent area and is limited to basic actions only.&lt;br /&gt;
&lt;br /&gt;
==== Actions (Max 1 action per worker per adjacent area) ====&lt;br /&gt;
* &#039;&#039;&#039;Plant (Basic - All Workers):&#039;&#039;&#039; Add a height-1 tree of the matching area type to an empty or flooded land area.&lt;br /&gt;
* &#039;&#039;&#039;Grow (Basic - All Workers):&#039;&#039;&#039; Add 1 segment to a tree in that land area (max height 5).&lt;br /&gt;
* &#039;&#039;&#039;Cut (Basic - All Workers):&#039;&#039;&#039; Harvest all segments of a tree in that land area, placing the wood in your storage.&lt;br /&gt;
* &#039;&#039;&#039;Harvest (Basic - All Workers):&#039;&#039;&#039; Gain 1 Rice from a Rice Paddy land area (or 2 Rice if a Farm is built on it).&lt;br /&gt;
* &#039;&#039;&#039;Create Rice Paddy (Artisans/Samurai only):&#039;&#039;&#039; Flip a flood token in that land space to its Rice Paddy side.&lt;br /&gt;
* &#039;&#039;&#039;Build (Artisans/Samurai only):&#039;&#039;&#039; Construct a structure by paying wood segments of the matching tree type from your storage.&lt;br /&gt;
* &#039;&#039;&#039;Muster (Samurai only):&#039;&#039;&#039; Gain 2 military tokens (must be performed at a Fortress).&lt;br /&gt;
* &#039;&#039;&#039;Study (Samurai only):&#039;&#039;&#039; Examine an adjacent tree of matching type and height to meet your next Forestry Track requirement, advancing your marker and gaining the indicated rewards.&lt;br /&gt;
&lt;br /&gt;
==== Special Actions (No worker required, can be done at any time) ====&lt;br /&gt;
* &#039;&#039;&#039;Split:&#039;&#039;&#039; Divide a stored tree segment into smaller segments.&lt;br /&gt;
* &#039;&#039;&#039;Join:&#039;&#039;&#039; Pay 1 Rice to combine stored segments of the same tree type.&lt;br /&gt;
* &#039;&#039;&#039;Hire:&#039;&#039;&#039; Pay 2 Rice to gain a temporary Villager worker.&lt;br /&gt;
* &#039;&#039;&#039;Expand:&#039;&#039;&#039; Spend 3 military tokens to draw a bonus land tile and add it to your board, creating new intersections.&lt;br /&gt;
* &#039;&#039;&#039;Foresee:&#039;&#039;&#039; Spend 1 research token to peek at one of the unrevealed Weather cards for the round.&lt;br /&gt;
* &#039;&#039;&#039;Shogun&#039;s Favor:&#039;&#039;&#039; In solo mode, Shogun&#039;s Favor cards are used to discard the current solo goal and move to the next one.&lt;br /&gt;
&lt;br /&gt;
==== Building Rules ====&lt;br /&gt;
In order to build, you must have the exact indicated trees types and sized in your personal storage (shown on your building board). The bottom row of structures are available at the start of the game. Building structures unlocks building adjacent structures above or next to previously built structures. When building, place a token from your Structure board into the activated land area. Completing a row, column, or certain adjacent structure tiles from the building board provides a bonus indicated.&lt;br /&gt;
* &#039;&#039;&#039;Fortress:&#039;&#039;&#039; Must be built in an empty land area. Generates 1 military token at the start of each Weather Phase and unlocks the Muster action.&lt;br /&gt;
* &#039;&#039;&#039;Farm:&#039;&#039;&#039; Must be built on top of a Rice Paddy. Doubles rice production during Harvest or the Weather Phase.&lt;br /&gt;
* &#039;&#039;&#039;Row costs:&#039;&#039;&#039; Building on the top 3 rows of your province have an additional rice cost indicated on the board.&lt;br /&gt;
&lt;br /&gt;
=== Phase 3: Weather Phase (Growth &amp;amp; Floods) ===&lt;br /&gt;
* &#039;&#039;&#039;Fortresses:&#039;&#039;&#039; Gain 1 military token for each built Fortress.&lt;br /&gt;
* &#039;&#039;&#039;Resolve Weather Cards:&#039;&#039;&#039; Reveal Weather cards one at a time. Each card matches a tree type (as indicated or as forecast on the forecast card) and triggers one of two events:&lt;br /&gt;
** &#039;&#039;&#039;Rain:&#039;&#039;&#039;&lt;br /&gt;
*** All trees of that type grow by 1 segment (max 5).&lt;br /&gt;
*** Rice Paddies produce 1 rice&lt;br /&gt;
*** Farms produce 2 rice.&lt;br /&gt;
** &#039;&#039;&#039;Flood:&#039;&#039;&#039; Empty or flooded areas of that type gain a flood token.&lt;br /&gt;
* &#039;&#039;&#039;Cascades:&#039;&#039;&#039; If a land area would gain a second flood token, it cascades down-slope. One flood token slides diagonally downwards to an adjacent lower land area based on the Forecast card.&lt;br /&gt;
** A flood cannot cascade into an already flooded land area.&lt;br /&gt;
** If a flood cascades onto a tree, rice paddy, or structure, that tile is removed from the province.&lt;br /&gt;
&lt;br /&gt;
== Endgame Scoring ==&lt;br /&gt;
At the end of Round 5, players calculate their total Honor Points:&lt;br /&gt;
* &#039;&#039;&#039;Structures Built:&#039;&#039;&#039; HP printed under each built structure on your Structure Board (including those destroyed by floods).&lt;br /&gt;
* &#039;&#039;&#039;Trees in Province:&#039;&#039;&#039; Cumulative HP based on levels unlocked on your Forestry Track (e.g., +1 HP per tree of height 4+ / 3+ / 2+).&lt;br /&gt;
* &#039;&#039;&#039;Demands:&#039;&#039;&#039; HP from your completed Shogun&#039;s Demands&lt;br /&gt;
* &#039;&#039;&#039;Favor Cards:&#039;&#039;&#039; HP from up to 3 completed personal goal cards.&lt;br /&gt;
&lt;br /&gt;
The highest score wins. Ties are broken by the player who completed the most demands.&lt;br /&gt;
&lt;br /&gt;
== Solo Mode Rules ==&lt;br /&gt;
&lt;br /&gt;
=== Solo Phases ===&lt;br /&gt;
* &#039;&#039;&#039;Council Phase Drafting:&#039;&#039;&#039; Your diplomat card limits which of the 3 face-up Gifts you can draft:&lt;br /&gt;
** #1 or #2 Diplomat: Draft the right-most gift.&lt;br /&gt;
** #3 or #4 Diplomat: Draft the middle or right-most gift.&lt;br /&gt;
** #5 or #6 Diplomat: Draft any of the three gifts.&lt;br /&gt;
* &#039;&#039;&#039;Fulfilling Demands:&#039;&#039;&#039; The Shogun&#039;s demands are placed around the solo board, with 4 Shogun&#039;s demands face up (and 4 to be revealed later). Fulfill demands at any time during your turn by paying resources. You can only fulfill a demand tile that is adjacent/linked to the Samurai&#039;s current position. Fulfilling a demand moves the Samurai to that tile, places your token, and flips adjacent linked demands face-up.&lt;br /&gt;
* &#039;&#039;&#039;Scoring Goals:&#039;&#039;&#039; In the center of the solo board, there are 10 solo goals. At the start of the game, one is active, one is revealed as the next solo goal, and the remaining 8 are face down under the &amp;quot;next&amp;quot; solo goal. The active solo goal can only be scored when the Samurai is standing on an outer demand tile. If your Province meets the goal requirement, score it (4 HP), move the Samurai back to the center of the Solo Board (re-opening all face-up demands), and reveal the next goal.&lt;br /&gt;
* &#039;&#039;&#039;Winning Condition:&#039;&#039;&#039; Beat the Target Score at the end of the game:&lt;br /&gt;
** Target Score = (10 HP × Fulfilled Demands) + (20 HP × Unfulfilled Demands) + (2 × Value of your unused diplomat card).&lt;br /&gt;
* &#039;&#039;&#039;Hard/Expert Modes:&#039;&#039;&#039; Uses the B-side Solo Board with fewer connections between demands and quadruples the unused diplomat card penalty.&lt;/div&gt;</summary>
		<author><name>C12h22o11</name></author>
	</entry>
	<entry>
		<id>https://en.doc.boardgamearena.com/index.php?title=Gamehelpringyo&amp;diff=30405</id>
		<title>Gamehelpringyo</title>
		<link rel="alternate" type="text/html" href="https://en.doc.boardgamearena.com/index.php?title=Gamehelpringyo&amp;diff=30405"/>
		<updated>2026-06-25T18:22:57Z</updated>

		<summary type="html">&lt;p&gt;C12h22o11: Created page with &amp;quot;  In Ringyō, players act as Daimyos to manage the forest in the province of feudal Japan. They manage their Province (their personal player board) to grow and harvest trees, build structures, and fulfill demands. The game is played over 5 rounds, and the player with the most Honor Points (HP) at the end of the game wins.  -------------------------------- Each round consists of 4 phases:      Edo Phase: Secret card selection to determine turn order and draft round bonuse...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
In Ringyō, players act as Daimyos to manage the forest in the province of feudal Japan. They manage their Province (their personal player board) to grow and harvest trees, build structures, and fulfill demands. The game is played over 5 rounds, and the player with the most Honor Points (HP) at the end of the game wins.&lt;br /&gt;
&lt;br /&gt;
--------------------------------&lt;br /&gt;
Each round consists of 4 phases:&lt;br /&gt;
&lt;br /&gt;
    Edo Phase: Secret card selection to determine turn order and draft round bonuses (Shogun&#039;s Gifts).&lt;br /&gt;
    Province Phase: Simultaneous worker placement to plant, grow, cut trees, harvest rice, and construct buildings.&lt;br /&gt;
    Weather Phase: Weather effects are resolved, triggering tree growth, rice harvesting, and flooding throughout the province.&lt;br /&gt;
    Demands Phase: Spending resources to claim scoring spots on shared demand tiles. (There is no Demands phase in solo mode.)&lt;br /&gt;
&lt;br /&gt;
-------------------&lt;br /&gt;
Sequence of a Round&lt;br /&gt;
Phase 1: Edo Council Phase (Turn Order &amp;amp; Drafting)&lt;br /&gt;
&lt;br /&gt;
Players bid to establish turn order and draft Shogun&#039;s Gifts:&lt;br /&gt;
&lt;br /&gt;
    Play Diplomat: Players secretly choose one of their 6 Diplomat cards (valued #1 to #6). Playing the #6 card requires paying 2 Rice.&lt;br /&gt;
    Draft Gifts: &lt;br /&gt;
        At the beginning of each round, gift cards are dealt to the shared Edo board. &lt;br /&gt;
        In solo mode, the 1-2 cards provide access to the rightmost gift card. 3-4 provide access to the middle and right gift card. 5-6 provide access to all 3 gift cards.&lt;br /&gt;
    Diplomat Lock: Used diplomat cards remain face up on the table and cannot be played again for the rest of the game.&lt;br /&gt;
&lt;br /&gt;
--------------&lt;br /&gt;
Province Phase&lt;br /&gt;
&lt;br /&gt;
Players simultaneously place workers on open intersections (junctions where 3 land spaces) to activate adjacent land areas. Workers must be placed at an intersection with 3 adjacent land tiles.&lt;br /&gt;
&lt;br /&gt;
Worker Types&lt;br /&gt;
&lt;br /&gt;
    Yellow Samurai: Permanent worker (returned to you at round end). Can take an action in 2 adjacent areas.&lt;br /&gt;
    Green Samurai: Upgraded permanent worker. Can take an action in 3 adjacent areas.&lt;br /&gt;
    Artisans: Temporary worker (returned to the supply at round end). Can take an action in 2 adjacent areas.&lt;br /&gt;
    Villagers: Temporary worker (returned to the supply at round end). Can take an action in 1 adjacent area and is limited to basic actions only.&lt;br /&gt;
&lt;br /&gt;
Actions (Max 1 action per worker per adjacent area)&lt;br /&gt;
&lt;br /&gt;
    Plant (Basic - All Workers): Add a height-1 tree of the matching area type to an empty or flooded land area.&lt;br /&gt;
    Grow (Basic - All Workers): Add 1 segment to a tree in that land area (max height 5).&lt;br /&gt;
    Cut (Basic - All Workers): Harvest all segments of a tree in that land area, placing the wood in your storage.&lt;br /&gt;
    Harvest (Basic - All Workers): Gain 1 Rice from a Rice Paddy land area (or 2 Rice if a Farm is built on it).&lt;br /&gt;
    Create Rice Paddy (Artisans/Samurai only): Flip a flood token in that land space to its Rice Paddy side.&lt;br /&gt;
    Build (Artisans/Samurai only): Construct a structure by paying wood segments of the matching tree type from your storage.&lt;br /&gt;
    Muster (Samurai only): Gain 2 military tokens (must be performed at a Fortress).&lt;br /&gt;
    Study (Samurai only): Examine an adjacent tree of matching type and height to meet your next Forestry Track requirement, advancing your marker and gaining the indicated rewards.&lt;br /&gt;
&lt;br /&gt;
Special Actions (No worker required, can be done at any time)&lt;br /&gt;
&lt;br /&gt;
    Split: Divide a stored tree segment into smaller segments.&lt;br /&gt;
    Join: Pay 1 Rice to combine stored segments of the same tree type.&lt;br /&gt;
    Hire: Pay 2 Rice to gain a temporary Villager worker.&lt;br /&gt;
    Expand: Spend 3 military tokens to draw a bonus land tile and add it to your board, creating new intersections.&lt;br /&gt;
    Foresee: Spend 1 research token to peek at one of the unrevealed Weather cards for the round.&lt;br /&gt;
&lt;br /&gt;
Building Rules&lt;br /&gt;
&lt;br /&gt;
In order to build, you must have the exact indicated trees types and sized in your personal storage (shown on your building board). The bottom row of structures are available at the start of the game. Building structures unlocks building adjacent structures above or next to previously built structures. When building, place a token from your Structure board into the activated land area. Completing a row, column, or certain adjacent structure tiles from the building board provides a bonus indicated.&lt;br /&gt;
&lt;br /&gt;
    Fortress: Must be built in an empty land area. Generates 1 military token at the start of each Weather Phase and unlocks the Muster action.&lt;br /&gt;
    Farm: Must be built on top of a Rice Paddy. Doubles rice production during Harvest or the Weather Phase.&lt;br /&gt;
    Row costs: Building on the top 3 rows of your province have an additional rice cost indicated on the board.&lt;br /&gt;
&lt;br /&gt;
Phase 3: Weather Phase (Growth &amp;amp; Floods)&lt;br /&gt;
&lt;br /&gt;
    Income: Gain 1 military token for each built Fortress.&lt;br /&gt;
    Resolve Weather Cards: Reveal Weather cards one at a time. Each card matches a tree type (as indicated or as forecast on the forecast card) and triggers one of two events:&lt;br /&gt;
        Rain: &lt;br /&gt;
          All trees of that type grow by 1 segment (max 5).&lt;br /&gt;
          Rice Paddies produce 1 rice&lt;br /&gt;
          Farms produce 2 rice.&lt;br /&gt;
        Flood: Empty or flooded areas of that type gain a flood token.&lt;br /&gt;
    Cascades: If a land area would gain a second flood token, it cascades down-slope. One flood token slides diagonally downwards to an adjacent lower land area based on the Forecast card.&lt;br /&gt;
        A flood cannot cascade into an already flooded land area.&lt;br /&gt;
        If a flood cascades onto a tree, rice paddy, or structure, that tile is removed from the province.&lt;br /&gt;
&lt;br /&gt;
---------------&lt;br /&gt;
Endgame Scoring&lt;br /&gt;
&lt;br /&gt;
At the end of Round 5, players calculate their total Honor Poiints:&lt;br /&gt;
&lt;br /&gt;
    Structures Built: HP printed under each built structure on your Structure Board (including those destroyed by floods).&lt;br /&gt;
    Trees in Province: Cumulative HP based on levels unlocked on your Forestry Track (e.g., +1 HP per tree of height 4+ / 3+ / 2+).&lt;br /&gt;
    Demands: HP from your completed Shogun&#039;s Demands&lt;br /&gt;
    Favor Cards: HP from up to 3 completed personal goal cards.&lt;br /&gt;
&lt;br /&gt;
The highest score wins. Ties are broken by the player who completed the most demands.&lt;br /&gt;
&lt;br /&gt;
------------------&lt;br /&gt;
Solo Mode Rules&lt;br /&gt;
&lt;br /&gt;
Solo Phases&lt;br /&gt;
&lt;br /&gt;
    Council Phase Drafting: Your diplomat card limits which of the 3 face-up Gifts you can draft:&lt;br /&gt;
        #1 or #2 Diplomat: Draft the right-most gift.&lt;br /&gt;
        #3 or #4 Diplomat: Draft the middle or right-most gift.&lt;br /&gt;
        #5 or #6 Diplomat: Draft any of the three gifts.&lt;br /&gt;
&lt;br /&gt;
    Fulfilling Demands: Fulfill demands at any time during your turn by paying resources. You can only fulfill a demand tile that is adjacent/linked to the Samurai&#039;s current position. Fulfilling a demand moves the Samurai to that tile, places your token, and flips adjacent linked demands face-up.&lt;br /&gt;
&lt;br /&gt;
    Scoring Goals: The active solo goal can only be scored when the Samurai is standing on a outer demand tile. If your Province meets the goal requirement, score it (4 HP), move the Samurai back to the center of the Solo Board (re-opening all face-up demands), and reveal the next goal.&lt;br /&gt;
&lt;br /&gt;
    Winning Condition: Beat the Target Score at the end of the game:&lt;br /&gt;
        Target Score = (10 HP × Fulfilled Demands) + (20 HP × Unfulfilled Demands) + (2 × Value of your unused diplomat card).&lt;br /&gt;
&lt;br /&gt;
    Hard/Expert Modes: Uses the B-side Solo Board with fewer connections between demands and quadruples the unused diplomat card penalty.&lt;/div&gt;</summary>
		<author><name>C12h22o11</name></author>
	</entry>
	<entry>
		<id>https://en.doc.boardgamearena.com/index.php?title=Troubleshooting&amp;diff=21699</id>
		<title>Troubleshooting</title>
		<link rel="alternate" type="text/html" href="https://en.doc.boardgamearena.com/index.php?title=Troubleshooting&amp;diff=21699"/>
		<updated>2024-06-27T19:42:26Z</updated>

		<summary type="html">&lt;p&gt;C12h22o11: /* Unexpected Syntax Error: */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Describing common errors which are hard to understand and debug. This may be useful for troubleshooting.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Game does not start at all ==&lt;br /&gt;
&lt;br /&gt;
=== Undefined offset: 0 in table/table.game.php on line 1417 ===&lt;br /&gt;
&lt;br /&gt;
Do not call self::getActivePlayerName() during setupNewGame()&lt;br /&gt;
&lt;br /&gt;
Ensure you&#039;re calling $this-&amp;gt;gamestate-&amp;gt;changeActivePlayer() at the end of your game setup. You must always have at least one active player.&lt;br /&gt;
&lt;br /&gt;
=== Unexpected error: Wrong formatted data from BGA gameserver 1 (method: createGame): ... ===&lt;br /&gt;
&lt;br /&gt;
This is generic message usually followed by exact position in your source code, and usually its syntax error in one of yours php script&lt;br /&gt;
&lt;br /&gt;
=== Unexpected error: Propagating error from GS 1 (method: createGame): Fatal error during yourgame setup: Not logged ===&lt;br /&gt;
&lt;br /&gt;
Calling self::getCurrentPlayerId () or using $g_user from &#039;args&#039; state function, see also below&lt;br /&gt;
&lt;br /&gt;
=== Unexpected error: Propagating error from GS 1 (method: createGame): Fatal error during yourgame setup: Unknow player statistic: ===&lt;br /&gt;
&lt;br /&gt;
Calling self::incStat() with second parameter which is an empty string&lt;br /&gt;
&lt;br /&gt;
=== Unexpected error:  Propagating error from GS 1 (method: createGame): Fatal error during yourgame setup: Error while processing SQL request: INSERT INTO stats ... ===&lt;br /&gt;
&lt;br /&gt;
Fatal error during yourgame setup: Error while processing SQL request: INSERT INTO stats (stats_type, stats_player_id, stats_value) VALUES (&#039;10&#039;,&#039;2300663&#039;,&#039;0&#039;),(&#039;10&#039;,&#039;2300662&#039;,&#039;0&#039;)&lt;br /&gt;
Duplicate entry &#039;10-2300663&#039; for key &#039;stats_table_id&#039;&lt;br /&gt;
&lt;br /&gt;
Why? In the stats.inc.php you declared two keys with the same integer &amp;quot;id&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Unexpected error:  Propagating error from GS 1 (method: createGame): Fatal error during yourgame setup: BGA main website do not respond ===&lt;br /&gt;
&lt;br /&gt;
Check if other games work; if not, it&#039;s a problem with BGA Studio; if so, your game likely reaches an end state immediately. Check your states.inc.php and your transitions.&lt;br /&gt;
&lt;br /&gt;
=== Unexpected error: Propagating error from GS 1 (method: createGame): BGA service error ===&lt;br /&gt;
&lt;br /&gt;
You may have a syntax error in your dbmodel.sql.&lt;br /&gt;
&lt;br /&gt;
Or, you may be calling self::initStat() for a statistic that does not exist. Check the statistic name, and make sure you clicked &amp;quot;Reload statistics configuration&amp;quot; button in the admin console after making changes to stats.inc.php&lt;br /&gt;
&lt;br /&gt;
Or you may not have your states.inc.php set up correctly.&lt;br /&gt;
&lt;br /&gt;
You may have an error in your table.game.php file in setupNewGame (such as &amp;lt;code&amp;gt;$result[&#039;x&#039;] = y;&amp;lt;/code&amp;gt; when $result is not an array).&lt;br /&gt;
&lt;br /&gt;
=== Unexpected error: Table status of a starting game should be &#039;setup&#039; ===&lt;br /&gt;
&lt;br /&gt;
This error message appears when you start a one player game using the &amp;quot;Express Start&amp;quot; button.&lt;br /&gt;
&lt;br /&gt;
In normal situation, the game starts just after this message and everything should works normally. In this case, you can just ignore this message.&lt;br /&gt;
&lt;br /&gt;
If the games does not start, it is most probable that there is a syntax error in any of your php code (Check your states.inc.php and X.game.php)&lt;br /&gt;
&lt;br /&gt;
=== Fatal error during creation of database ebd_quoridor_389 Not logged ===&lt;br /&gt;
&lt;br /&gt;
Check that you didn&#039;t use $g_user or getCurrentPlayerId() in setupNewGame() function or in an &#039;args&#039; function of your state.&lt;br /&gt;
&lt;br /&gt;
As these functions are not consequences of a user action, there is no current player defined.&lt;br /&gt;
&lt;br /&gt;
As a general rule, you should use getActivePlayerId() and not getCurrentPlayerId(). See the [http://www.slideshare.net/boardgamearena/bga-studio-focus-on-bga-game-state-machine presentation on the game state machine] for more information.&lt;br /&gt;
&lt;br /&gt;
=== Warning: Invalid argument supplied for foreach() in table.game.php ===&lt;br /&gt;
&lt;br /&gt;
   Warning: Invalid argument supplied for foreach() in /var/tournoi/release/tournoi-151226-1240-gs/www/game/module/table/table.game.php on line 129 &lt;br /&gt;
   Fatal error: Cannot unset string offsets in /var/tournoi/release/tournoi-151226-1240-gs/www/game/module/table/table.game.php on line 143&lt;br /&gt;
&lt;br /&gt;
That appears when your arg* function that suppose to return array of state arguments returns a scalar (a non-array) value&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  Server syntax error:&lt;br /&gt;
  Warning: Invalid argument supplied for foreach() in /var/tournoi/release/tournoi-240320-1000-gs/www/game/module/table/table.game.php on line 3249&lt;br /&gt;
&lt;br /&gt;
Check that notfication you sending have args method supplied, i.e&lt;br /&gt;
&lt;br /&gt;
   $this-&amp;gt;notifyAllPlayers(&#039;message&#039;, &amp;quot;&amp;quot;, []); // 3rd argument MUST be array and MANDATORY&lt;br /&gt;
&lt;br /&gt;
=== The server reported an error ===&lt;br /&gt;
&lt;br /&gt;
During table creation: &amp;quot;The server reported an error&amp;quot; error shown and nothing else.&lt;br /&gt;
&lt;br /&gt;
If you cannot even create a table - there is syntax error in gameinfos.php, check it, reload it from management panel.&lt;br /&gt;
If still no luck copy clean version from template https://github.com/elaskavaia/bga-sharedcode/blob/master/gameinfos.inc.php&lt;br /&gt;
&lt;br /&gt;
=== Unexpected Error : Invalid player number for this game : 4 ===&lt;br /&gt;
&lt;br /&gt;
This error may comes when trying to change the player number configuration in gameinfos.inc.php from a higher to lower number of players (for example from 4 to 2).&lt;br /&gt;
&lt;br /&gt;
The following steps will help to change a player config from array(4) to array(2) :&lt;br /&gt;
&lt;br /&gt;
* change in gameinfos.inc.php the entry to &#039;players&#039; =&amp;gt; array( 2,3,4 )&lt;br /&gt;
* In game management page (Control Panel &amp;gt; Manage Games &amp;gt; &amp;quot;Your Game&amp;quot;), press the &amp;quot;Reload Game information&amp;quot; button&lt;br /&gt;
* create a new table&lt;br /&gt;
* reduce the number of players to 2 and start the game&lt;br /&gt;
* (express) Stop the game&lt;br /&gt;
* change in gameinfos.inc.php the entry to &#039;players&#039; =&amp;gt; array( 2 )&lt;br /&gt;
* press again the &amp;quot;Reload Game information&amp;quot; button&lt;br /&gt;
&lt;br /&gt;
=== Blank page ===&lt;br /&gt;
If you see no html at all check &lt;br /&gt;
* if you have syntax error in your view.php file &lt;br /&gt;
* class name of your view.php file  does not match the project name (should be view_foo_foo if project is foo)&lt;br /&gt;
* game name return by getGameName() does not match the project name  (should be &amp;quot;foo&amp;quot; if project is foo)&lt;br /&gt;
&lt;br /&gt;
    class view_russianrailroads_russianrailroads extends game_view {&lt;br /&gt;
    function getGameName() {&lt;br /&gt;
        return &amp;quot;russianrailroads&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
=== &amp;quot;Ooooops, this page does not exists :/&amp;quot; ===&lt;br /&gt;
If your table is created, but you are redirected to &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://studio.boardgamearena.com/1/index.php&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; when you try to launch your table, then you are most likely missing the [[Players actions: yourgamename.action.php|action PHP file]].&lt;br /&gt;
&lt;br /&gt;
No other error is displayed or logged, meaning this can be tough to debug.&lt;br /&gt;
&lt;br /&gt;
Make sure the file is correctly named, as any typo means the studio won&#039;t be able to find the file.&lt;br /&gt;
&lt;br /&gt;
=== HTTP Error 500 (when the BGA server is stable) ===&lt;br /&gt;
&lt;br /&gt;
The table has been created, but the setup hasn&#039;t been finished properly for some reason.&lt;br /&gt;
&lt;br /&gt;
== Game starts but I can&#039;t make a move ==&lt;br /&gt;
&lt;br /&gt;
=== When I do a move, I got &amp;quot;Move recorded, waiting for update ...&amp;quot; forever ===&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Move recorded&amp;quot; means that your ajaxcall request (bgaPerformAction) has been sent to the server and returned normally.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Waiting for update&amp;quot; means that your client interface is waiting for some notifications from the server that correspond to the move we just did.&lt;br /&gt;
&lt;br /&gt;
If this message stays forever, it is probably that your PHP code does not send any notification when the move happens, which is abnormal. To fix this: add a notifyAllPlayers or a notifyPlayer call in your PHP code.&lt;br /&gt;
&lt;br /&gt;
=== When I do a move, I get &amp;quot;Sending move to server...&amp;quot; then nothing and game resets to state before the move ===&lt;br /&gt;
&lt;br /&gt;
Its possible that server code get into infinite loops or thinks too much, in which case it will timeout and will be aborted without any extra logs (and db transaction you saw in the log won&#039;t be committed). You will usually see &amp;quot;Unable to connect to server&amp;quot; message on console in this case. You have to put more logging into server&lt;br /&gt;
to trace where it hangs.&lt;br /&gt;
&lt;br /&gt;
You may also see this error in the log in this case: &amp;quot;Error (2006) while processing SQL request: MySQL server has gone away&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== When I do a move, I get &amp;quot;Ajaxcall error: empty answer&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
You either have missing self::ajaxResponse(); in your [[Players actions: yourgamename.action.php|game.action.php]] method, or there is some problem with getting arguments (check that you are using btoa() on client when using AT_base64 arg type in action.php)&lt;br /&gt;
&lt;br /&gt;
=== When I do a move, I get &amp;quot;Gameserver is locked by configuration&amp;quot;. ===&lt;br /&gt;
&lt;br /&gt;
You may have an error in your AJAX path, such as /reversi/reversi when your game&#039;s name is different.&lt;br /&gt;
&lt;br /&gt;
=== Some player action is triggered randomly when I click somewhere on the game area ===&lt;br /&gt;
&lt;br /&gt;
You probably used &amp;quot;dojo.connect&amp;quot; on a null object. In this case, dojo.connect associate the event (ex: &amp;quot;onclick&amp;quot;) to the whole game area.&lt;br /&gt;
&lt;br /&gt;
Most of the time it happens in this situation, when my_object element does not exists:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   dojo.connect( $(&amp;quot;my_object&amp;quot;), &amp;quot;onclick&amp;quot;, this, (event)=&amp;gt;{})&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To determine if this is the case, place &amp;quot;alert( $(&amp;quot;my_object&amp;quot;) )&amp;quot; before the dojo.connect to check if the object exists or not.&lt;br /&gt;
&lt;br /&gt;
=== Error: This is not your turn ===&lt;br /&gt;
&lt;br /&gt;
This happens when checkAction() is called and current player is NOT the active player.&lt;br /&gt;
&lt;br /&gt;
You can change the active player in studio by clicking the red arrow next to their name in the player panel (right side of the page).&lt;br /&gt;
&lt;br /&gt;
[[File:Change_active_player.jpg]]&lt;br /&gt;
&lt;br /&gt;
=== Error: Please wait, an action is already in progress ===&lt;br /&gt;
Its followed by error &amp;quot;(Generated by checkAction / XXX)&amp;quot; on studio.&lt;br /&gt;
&lt;br /&gt;
This error is triggered in the JS by the checkAction function for XXX action.&lt;br /&gt;
&lt;br /&gt;
This can happen when the player sent an Ajax request action earlier, and:&lt;br /&gt;
* action is not complete yet - i.e. takes some time, and user clicked something again &lt;br /&gt;
* if there is bug in interface where MULTIPLE handlers are fired on same click. To debug this add some console.trace() in place this specific checkAction is called.&lt;br /&gt;
* did not get any notification from the PHP side. To avoid this, put an empty notifyPlayer in the PHP side of the Ajax handler to ensure the client receives a response. This line of code should do it:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    $this-&amp;gt;notifyPlayer($this-&amp;gt;getCurrentPlayerId(), &#039;message&#039;, &#039;&#039;, []); // sent to current player, who originated the action&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Error: This move is not authorized now ===&lt;br /&gt;
This is generic error message generated by this.showMoveUnauthorized() function. If you did not call this function yourself, check the console log, it may have additional information.&lt;br /&gt;
If you see &amp;quot;Move not authorized now : XXX&amp;quot; in the log, where XXX is your action name - this means that action XXX is not defined in list of possible actions for your current state. This error generated by checkAction() function.&lt;br /&gt;
&lt;br /&gt;
=== Error: You are not connected - after waiting for the submitted move ===&lt;br /&gt;
In the log you may find: &lt;br /&gt;
  Query execution was interrupted, maximum statement execution time exceeded - Request: SELECT global_id, global_value FROM global WHERE 1&lt;br /&gt;
&lt;br /&gt;
The error message above is because of failed attempt to lock a table, which happens because of infinite loop in you game.&lt;br /&gt;
* Check that don&#039;t enter same game state over and over again&lt;br /&gt;
* Check that you reverse for loop actually descrease counter or other loop issues&lt;br /&gt;
* Check that recursive function ends&lt;br /&gt;
&lt;br /&gt;
=== 502 Bad Gateway ===&lt;br /&gt;
This error is similar to the infinite loop just above this section, but the loop occurred in view.php or somewhere unusual (e.g. module).&lt;br /&gt;
&lt;br /&gt;
== Predefined server errors ==&lt;br /&gt;
&lt;br /&gt;
=== Unexpected error: Unexpected final game state (XX) ===&lt;br /&gt;
&lt;br /&gt;
The action function does not transition to any state, i.e.&lt;br /&gt;
  function selectField($field) {&lt;br /&gt;
    self::checkAction ( &#039;selectField&#039; );&lt;br /&gt;
    if ($field!=0) $this-&amp;gt;gamestate-&amp;gt;nextState ( &#039;next&#039; );&lt;br /&gt;
  }&lt;br /&gt;
Here if $field is 0 there is no transition&lt;br /&gt;
&lt;br /&gt;
=== This game action is impossible right now ===&lt;br /&gt;
&lt;br /&gt;
Check the game log. Usually your state does not define the action you trying to perform in &#039;possibleactions&#039; array.&lt;br /&gt;
&lt;br /&gt;
Also check your onActionName javascript function. Make sure you are calling the right &amp;quot;actionname.html&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Unexpected error: This transition (playerTurn) is impossible at this state (42) ===&lt;br /&gt;
&lt;br /&gt;
This is pretty self explanatory. Function nextState() takes transition name not a state name, so you probably did not&lt;br /&gt;
define this transition that the given state&lt;br /&gt;
&lt;br /&gt;
== Game interface hangs during reload or on start ==&lt;br /&gt;
&lt;br /&gt;
Showing &amp;quot;Application Loading...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Javascript error: During pageload undefined no_stack_avail Script: ===&lt;br /&gt;
&lt;br /&gt;
This error usually has no useful data, but it means you called somes API that require a callback and did not define callback function, i.e&lt;br /&gt;
in dojo.connect, this.connectClass, dojo.subscribe, etc&lt;br /&gt;
   &lt;br /&gt;
      this.connectClass(&#039;field&#039;, &#039;onclick&#039;, &#039;onField&#039;); // &amp;lt;-- onField is not defined&lt;br /&gt;
&lt;br /&gt;
=== Javascript error: During pageload n is null ===&lt;br /&gt;
&lt;br /&gt;
When calling dojo.place(), the name of the container (second parameter) to place the new block into is not defined in the page template.&lt;br /&gt;
&lt;br /&gt;
=== Other errors with &amp;quot;Application loading...&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
You probably have a syntax error in your Javascript code, and the interface refuses to load.&lt;br /&gt;
&lt;br /&gt;
To find this error, check if there is an error message in the Javascript console (F12).&lt;br /&gt;
&lt;br /&gt;
If there is really nothing on the log, it&#039;s probably that the system was unable to load your Javascript because of an syntax error that affect the structure of the Javascript file, typically a missing &amp;quot;}&amp;quot; or a missing &amp;quot;,&amp;quot; after a method definition.&lt;br /&gt;
&lt;br /&gt;
If you have &amp;quot;Uncaught ReferenceError: bgagame is not defined&amp;quot; you have major syntax error in your js file, you should see some other clues in the log where the errors is.&lt;br /&gt;
&lt;br /&gt;
If you have &amp;quot;dojo.publish is not defined&amp;quot; or something similar, this could be caused by another error earlier. For example, a syntax error caused by a malformed generated file (such as using newlines in tiebreaker description). Also you might have left some images in the /img directory with special characters in the name which must be removed. If you edited images for the game box and website, ensure that you have not left any unnecessary files there.&lt;br /&gt;
&lt;br /&gt;
=== Unexpected Syntax Error: ===&lt;br /&gt;
&lt;br /&gt;
No further details in the log. When log is filling with some social connect errors.&lt;br /&gt;
&lt;br /&gt;
Possible Reason: Syntax error in of the php script which is loaded before the start, such as gameoptions.inc.php, gameinfos.inc.php and such. This can also occur if the gamedatas returned from getAllDatas() in  *.game.php contains objects that cannot be properly serialized. For example, a class that defines functions as well as scalars.&lt;br /&gt;
&lt;br /&gt;
=== Game interface spins in a loop throwing error ===&lt;br /&gt;
&lt;br /&gt;
Errors is something like &amp;quot;Cannot read property &#039;is_ai&#039; of undefined&amp;quot;. Cannot restart the game because cannot access UI to stop.&lt;br /&gt;
Likely you get in actplayer state with player id == 0. The only way to fix it is to edit database, globals index == 2 set player id to one of your test dudes&lt;br /&gt;
(can copy from row 5 for example).&lt;br /&gt;
&lt;br /&gt;
=== Unable to find table database (1): ebd_yourgame_112222 ===&lt;br /&gt;
&lt;br /&gt;
Its either temporarily server error especially on studio it timeouts sometimes, just try reloading again.&lt;br /&gt;
Or check if you have syntax errors in your php game file or sql.&lt;br /&gt;
&lt;br /&gt;
== Type conversion / juggling errors ==&lt;br /&gt;
&lt;br /&gt;
=== On php side I get a number instead of string I expect ===&lt;br /&gt;
&lt;br /&gt;
 $num = 3;&lt;br /&gt;
 $meeple = &amp;quot;meeple_&amp;quot; + $num; // &amp;lt;-- suppose to be &amp;quot;meeple_3&amp;quot;!&lt;br /&gt;
&lt;br /&gt;
When you switch between JS and PHP it easy to type this and not notice the +. Plus sign (+) in php does not mean string concatenation (in javascript does!),&lt;br /&gt;
in php + means integer arithmetic. So change + to . (dot)&lt;br /&gt;
&lt;br /&gt;
=== On php side my string comparison does not work ===&lt;br /&gt;
&lt;br /&gt;
   if ($color == &#039;4baae2&#039; || $color == &#039;000000&#039;) { &lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
Apparently you should not be using &#039;==&#039; in php to compare strings! You should use &#039;===&#039;. The (==) operator will typecast the strings &lt;br /&gt;
to numbers then do comparison!&lt;br /&gt;
Its not very apparent because usually you can get away with it, but not when strings resemble numbers like hex &#039;colors&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Integer columns in the database are returned as strings ===&lt;br /&gt;
&lt;br /&gt;
This is normal PHP behavior. All fields are returned as string type, regardless of their actual type in the database. This also applies to global variables accessed via getGameStateValue(), since they are stored in a database table.&lt;br /&gt;
&lt;br /&gt;
You can use type-casting to convert them to the correct type after they come out of the database.&lt;br /&gt;
&lt;br /&gt;
   $myValueInt = (int)self::getGameStateValue(GLOBAL_ROUND_NUMBER);&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
   $myValueInt = self::getGameStateValue(GLOBAL_ROUND_NUMBER) + 0; // adding 0 casts to int&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
same with direct qdb ueries&lt;br /&gt;
   $sql = &amp;quot;SELECT my_int_column FROM my_table WHERE my_condition&amp;quot;;&lt;br /&gt;
   $myResult = self::getUniqueValueFromDB($sql); &amp;lt;-- this is a string&lt;br /&gt;
   $myResultAsInt = (int)$myResult;&lt;br /&gt;
&lt;br /&gt;
https://stackoverflow.com/questions/5323146/mysql-integer-field-is-returned-as-string-in-php&lt;br /&gt;
&lt;br /&gt;
== Zombie mode ==&lt;br /&gt;
&lt;br /&gt;
=== Unexpected error: Propagating error from GS 1 (method: zombie): Not logged ===&lt;br /&gt;
&lt;br /&gt;
You are probably calling getCurrentPlayerId() or getCurrentPlayerName() in your zombieTurn method or any of the methods it uses. Instead, use the $active_player_id provided as parameter to zombieTurn().&lt;br /&gt;
&lt;br /&gt;
If you do not see these commands within &amp;quot;function zombieTurn( $state, $active_player ){}&amp;quot;, check all the functions called from zombieTurn, also &amp;quot;function getGameProgression(){}&amp;quot; and all the functions THAT calls.&lt;br /&gt;
&lt;br /&gt;
=== Unexpected error: Can&#039;t manage zombie player in this game state ===&lt;br /&gt;
&lt;br /&gt;
The state the game was in at the time the error was generated didn&#039;t have &amp;quot;transitions&amp;quot; =&amp;gt; array( &amp;quot;zombiePass&amp;quot; =&amp;gt; 27 )&amp;quot; in states.inc.php (27 was an arbitrary example, but everything else must be spelled exactly that way.)&lt;br /&gt;
&lt;br /&gt;
To correct this error, either add &amp;quot;zombiePass&amp;quot; =&amp;gt; ## to the transitions array or work out why the game is in a state it should not be in.&lt;br /&gt;
&lt;br /&gt;
=== Unexpected error: Wrong formatted data from BGA gameserver 1 (method: zombie): ===&lt;br /&gt;
&lt;br /&gt;
This is almost certainly an undefined value in PHP code. Look for a warning or error message in the game replay log on the right side of the table UI.&lt;br /&gt;
&lt;br /&gt;
=== Unexpected error: BGA gameserver 1 do not respond (method: zombie) (timeout: cluster) ===&lt;br /&gt;
&lt;br /&gt;
You are trying to end the game from a zombie method. This is not allowed. The zombie logic must continue the game as best it can. See [[Main_game_logic:_yourgamename.game.php#Zombie_mode|Zombie mode]] for more info.&lt;br /&gt;
&lt;br /&gt;
=== Game unexpectedly ends when one player becomes zombie ===&lt;br /&gt;
&lt;br /&gt;
There is an error in handling zombie mode, check error log. Example: if the zombie turn is called again, framework detects a infinite loop and cancels the game. On the studio there is a notification called ZombieTurnFailed&lt;br /&gt;
&lt;br /&gt;
== Dead locks ==&lt;br /&gt;
&lt;br /&gt;
=== Database dead lock in multiplayer state ===&lt;br /&gt;
You normally won&#039;t see this error until game is released because to reproduce game it have to be hit with 2 players doing an action simultaneosly.&lt;br /&gt;
You only can reprodoce this on studio if you either very fast or you use a script (with direct REST calls).&lt;br /&gt;
&lt;br /&gt;
There is few types of deadlocks&lt;br /&gt;
I) Try-lock - this one you don&#039;t need to worry about even it does appear in the log, this is 2 player doing the action and second cannot lock db, it will re-try up to 3 times and hopefully it be ok&lt;br /&gt;
II) Real dead lock - when 2 tables are locked in reversed by 2 actions, its unclar if this really  happen  but workaround number 2 theorically should solved it (but it will increase number of deadlocks of type I)&lt;br /&gt;
&lt;br /&gt;
There are two known workarounds:&lt;br /&gt;
&lt;br /&gt;
1) Use $this-&amp;gt;bIndependantMultiactiveTable=true in constructor which will force usage of playermultiactive table, but this does not eliminate dead lock completely.&lt;br /&gt;
&lt;br /&gt;
2) Before every action explictly lock tables in specific order (add this code in your game.php file)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   // Due to deadlock issues involving the playersmultiactive and player tables,&lt;br /&gt;
   //   standard tables are queried FOR UPDATE when any operation occurs -- AJAX or refreshing a game table.&lt;br /&gt;
   //&lt;br /&gt;
   // Otherwise at least two situations have been observed to cause deadlocks:&lt;br /&gt;
   //   * Multiple players in a live game with tabs open, two players trading multiactive state back and forth.&lt;br /&gt;
   //   * Two players trading multiactive state back and forth, another player refreshes their game page.&lt;br /&gt;
   private function queryStandardTables() {&lt;br /&gt;
      // Query the standard global table.&lt;br /&gt;
      $this-&amp;gt;DbQuery(&amp;quot;SELECT global_id, global_value FROM global WHERE 1 ORDER BY global_id FOR UPDATE&amp;quot;);&lt;br /&gt;
      // Query the standard player table.&lt;br /&gt;
      $this-&amp;gt;DbQuery(&amp;quot;SELECT player_id id, player_score score FROM player WHERE 1 ORDER BY player_id FOR UPDATE&amp;quot;);&lt;br /&gt;
      // Query the playermultiactive  table. DO NOT USE THIS is you don&#039;t use $this-&amp;gt;bIndependantMultiactiveTable=true&lt;br /&gt;
      $this-&amp;gt;DbQuery(&amp;quot;SELECT ma_player_id player_id, ma_is_multiactive player_is_multiactive FROM playermultiactive ORDER BY player_id FOR UPDATE&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
      // TODO should the stats table be queried as well?&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
    /** This is action function that canbe called from multiplayer state */&lt;br /&gt;
    protected function actionXXX() {&lt;br /&gt;
        $this-&amp;gt;queryStandardTables();&lt;br /&gt;
        ... // your arg function code&lt;br /&gt;
    }&lt;br /&gt;
    /** This is arg function of multiplayer state, XXX is replaced by actual name of state. &lt;br /&gt;
        You need to do it for EVERY arg function in multiplayer states which accesses the database. &lt;br /&gt;
        You don&#039;t need to do it for arg function for single player states  &lt;br /&gt;
    */&lt;br /&gt;
    protected function argXXX() {&lt;br /&gt;
        $this-&amp;gt;queryStandardTables();&lt;br /&gt;
        ... // your arg function code&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Other errors ==&lt;br /&gt;
&lt;br /&gt;
=== Javascript does not know how to sum two numbers ===&lt;br /&gt;
&lt;br /&gt;
Be careful when you manipulate integers returned by notifications: most of the time, Javascript considers they are Strings and not Integers.&lt;br /&gt;
&lt;br /&gt;
As a result:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    let i = 1;&lt;br /&gt;
    i += notif.args.increment;  // With notif.args.increment=&#039;1&#039;&lt;br /&gt;
    console.log( i );                 // i=11 instead of 2 !! Javascript concatenate 2 strings !&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To solve this, you should use the &amp;quot;parseInt&amp;quot; function:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    let i = 1;&lt;br /&gt;
    i += parseInt(notif.args.increment, 10);  // With notif.args.increment=&#039;1&#039;&lt;br /&gt;
    console.log( i );                 // i=2 :)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Javascript: do not use substr with negative numbers ===&lt;br /&gt;
&lt;br /&gt;
To get the last characters of a string, use &amp;quot;slice&amp;quot; instead of &amp;quot;substr&amp;quot; which has a bug on IE:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    var three_last_characters = string.substr( -3 );   // Wrong&lt;br /&gt;
    var three_last_characters = string.slice( -3 );    // Correct&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Game &amp;quot;spontaneously&amp;quot; transition to a new state without user input ===&lt;br /&gt;
&lt;br /&gt;
Make sure on php side you have no code after   $this-&amp;gt;gamestate-&amp;gt;nextState(...) code.&lt;br /&gt;
Because if you do accidentally have code that goes to another state it will cause another state transition without user interaction.&lt;br /&gt;
&lt;br /&gt;
 function selectField($field) {&lt;br /&gt;
   self::checkAction ( &#039;selectField&#039; );&lt;br /&gt;
   if ($field!=0) $this-&amp;gt;gamestate-&amp;gt;nextState ( &#039;next&#039; );&lt;br /&gt;
   $this-&amp;gt;gamestate-&amp;gt;nextState ( &#039;last&#039; ); // &amp;lt;-- here is missing else, so it will cause double state transition&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Message &amp;quot;Invalid or missing substitution argument for log message: ${actplayer} ... &amp;quot; when entering a state ===&lt;br /&gt;
&lt;br /&gt;
You probably have an args function defined for that state that does &#039;&#039;&#039;not&#039;&#039;&#039; return an array&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Server syntax error: Warning: count(): Parameter must be an array or an object that implements Countable in /var/tournoi/release/tournoi-220308-1000-gs/www/game/module/table/gamestate.game.php on line 823 ===&lt;br /&gt;
&lt;br /&gt;
Generally comes with that syntax error : Warning: implode(): Invalid arguments passed in /var/tournoi/release/tournoi-220308-1000-gs/www/game/module/table/gamestate.game.php on line 845&lt;br /&gt;
&lt;br /&gt;
It is most probable that you used setPlayersMultiactive method with id of a single player not included in an array -&amp;gt; you should use: ... setPlayersMultiactive( array($player_id), ...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Red banner &amp;quot;Uncaught EvalError: Possible side-effect in debug-evaluate&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
This is a known issue that can be ignored (for most of case). Generally happening when working on devtool.&lt;br /&gt;
A workaround is to disable the &amp;quot;error&amp;quot; event listener. To do so, you can temporarily disable the event listener in DevTools, like this:&lt;br /&gt;
&lt;br /&gt;
 - At the top of DevTools, open the &amp;quot;Elements&amp;quot; tab&lt;br /&gt;
 - Press &amp;quot;»&amp;quot;, on the right of &amp;quot;Styles&amp;quot;, &amp;quot;Computed&amp;quot;, &amp;quot;Layout&amp;quot;&lt;br /&gt;
 - Choose &amp;quot;Event listeners&amp;quot;&lt;br /&gt;
 - Find and expand &amp;quot;error&amp;quot;&lt;br /&gt;
 - Click &amp;quot;Remove&amp;quot;&lt;br /&gt;
&lt;br /&gt;
This will remove the event listener, but the issue will return after you refresh the page.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Studio]]&lt;/div&gt;</summary>
		<author><name>C12h22o11</name></author>
	</entry>
	<entry>
		<id>https://en.doc.boardgamearena.com/index.php?title=Bugsclarification_distilled&amp;diff=21519</id>
		<title>Bugsclarification distilled</title>
		<link rel="alternate" type="text/html" href="https://en.doc.boardgamearena.com/index.php?title=Bugsclarification_distilled&amp;diff=21519"/>
		<updated>2024-06-14T05:50:21Z</updated>

		<summary type="html">&lt;p&gt;C12h22o11: Created page with &amp;quot; Before filing a bug report of being blocked from making a certain spirit, please ensure the spirit should have been distillable. These are in order of most commonly missed.  1) You have *ONLY* the correct type of sugars. Most recipes other than vodka and aquavit require just one type of sugar in the spirit. For example, If you try to make pisco (which requires 3 fruit sugars) and you have 4 fruit sugars, 4 alcohol, 1 yeast, and 1 mixed grains, you have made Vodka, not P...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Before filing a bug report of being blocked from making a certain spirit, please ensure the spirit should have been distillable. These are in order of most commonly missed.&lt;br /&gt;
&lt;br /&gt;
1) You have *ONLY* the correct type of sugars. Most recipes other than vodka and aquavit require just one type of sugar in the spirit. For example, If you try to make pisco (which requires 3 fruit sugars) and you have 4 fruit sugars, 4 alcohol, 1 yeast, and 1 mixed grains, you have made Vodka, not Pisco because of the mixed grains.&lt;br /&gt;
2) You have the correct barrel type in your store room&lt;br /&gt;
3) You have the correct number of sugars and the correct type of sugars. &lt;br /&gt;
4) You have purchased the recipe cube&lt;br /&gt;
5) If you are distilling a signature spirit, it must include a particular type of sugar, for example, Grapes or Potatoes. This can be your signature ingredient or an ingredient from the premium market.&lt;/div&gt;</summary>
		<author><name>C12h22o11</name></author>
	</entry>
	<entry>
		<id>https://en.doc.boardgamearena.com/index.php?title=Gamehelpdistilled&amp;diff=21514</id>
		<title>Gamehelpdistilled</title>
		<link rel="alternate" type="text/html" href="https://en.doc.boardgamearena.com/index.php?title=Gamehelpdistilled&amp;diff=21514"/>
		<updated>2024-06-13T20:41:03Z</updated>

		<summary type="html">&lt;p&gt;C12h22o11: /* Differences Between Physical and BGA */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Differences Between Physical and BGA ===&lt;br /&gt;
Please be aware that there are a few meaningful differences between a physical copy of Distilled and the BGA implementation:&lt;br /&gt;
&lt;br /&gt;
* On BGA, the distill phase is taken in player order. This is to facilitate the flow of the game, especially in asynchronous play. Each player distills their spirit and claims their label in player order starting with the first player token.&lt;br /&gt;
* On BGA, the Drone Camera is not part of the Distillery Upgrade deck.&lt;br /&gt;
* On BGA, the choice of flavor cards for Doig Ventilator is automated to pick the most valuable flavor.&lt;br /&gt;
&lt;br /&gt;
===Overview===&lt;br /&gt;
&lt;br /&gt;
Create, age, and sell Spirits in order to be the best distiller over 7 rounds&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Phases===&lt;br /&gt;
&lt;br /&gt;
The rounds are broken up into 4 Phases&lt;br /&gt;
&lt;br /&gt;
Market&lt;br /&gt;
&lt;br /&gt;
Distill&lt;br /&gt;
&lt;br /&gt;
Sell&lt;br /&gt;
&lt;br /&gt;
Age&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Market===&lt;br /&gt;
&lt;br /&gt;
In clockwise order, each player either makes a purchase or passes&lt;br /&gt;
&lt;br /&gt;
Passing takes you out of the Market phase until all other players have passed, which ends the phase&lt;br /&gt;
&lt;br /&gt;
You can purchase as much as you wish over this phase, but can only purchase a maximum of 2 basic items in each Market Phase. Purchases you can make are distillery upgrades, premium ingredients, premium items like bottles or barrels and recipes.&lt;br /&gt;
&lt;br /&gt;
Your Recipe List shows you what grade a recipe is and thus how much it costs to purchase&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Distill===&lt;br /&gt;
&lt;br /&gt;
In clockwise order, starting with the first player, select ingredients to put into your washback.&lt;br /&gt;
&lt;br /&gt;
You may exchange an ingredient or premium item for a basic ingredient of equal or lower value once&lt;br /&gt;
&lt;br /&gt;
All ingredients not being used are put in your Pantry&lt;br /&gt;
&lt;br /&gt;
Make sure to play at least one Yeast, one Water, and one Sugar card otherwise you cannot distill&lt;br /&gt;
&lt;br /&gt;
Add one Alcohol card for each Sugar card played&lt;br /&gt;
&lt;br /&gt;
Shuffle all the cards together, the uppermost and lowest card are returned to the Pantry&lt;br /&gt;
&lt;br /&gt;
The remaining cards are revealed and see if they match a Known Recipe&lt;br /&gt;
&lt;br /&gt;
Vodka requires any sugar and Moonshine requires no sugar, so these are always available, but you are trying to aim for the better recipes if you can&lt;br /&gt;
&lt;br /&gt;
Select the spirit you would like to make and claim a label for it if it is available.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Sell===&lt;br /&gt;
&lt;br /&gt;
If a Recipe you just distilled has the egg timer symbol, it cannot be sold in the same round&lt;br /&gt;
&lt;br /&gt;
Alternatively, if a Recipe you just distilled has the red blocked egg timer symbol, it MUST be sold this round&lt;br /&gt;
&lt;br /&gt;
Similar to the Market phase, this is done in turn order with each player making one sale per turn until everyone has passed&lt;br /&gt;
&lt;br /&gt;
Check the cards relating to the Spirit you wish to sell and the total value is the money you will receive for the sale&lt;br /&gt;
&lt;br /&gt;
If there are any SP icons on this, these are victory points you will also gain&lt;br /&gt;
&lt;br /&gt;
Place the label on your bonus board and gain the bonus immediately&lt;br /&gt;
&lt;br /&gt;
If you used the starting Metal Barrel or Glass Bottle, return this to your storeroom for later use&lt;br /&gt;
&lt;br /&gt;
Place Premium Bottles in your display for end game points&lt;br /&gt;
&lt;br /&gt;
Basic cards, Alcohol cards, Premium Ingredients, Flavor Cards, Signature Ingredients, and Premium barrels are all discarded&lt;br /&gt;
&lt;br /&gt;
Selling an greater Aged Spirit will gain more points than a lesser aged spirit, but will still gain the same money&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Age===&lt;br /&gt;
&lt;br /&gt;
Age all Spirits in your warehouse one step&lt;br /&gt;
&lt;br /&gt;
If this is the last round, warehouse Spirits will still age, but cannot be sold, however there are still points for retained Spirits in warehouse&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Round End===&lt;br /&gt;
&lt;br /&gt;
After Aging, check the Awards, if you achieve one gain the points and make it inactive&lt;br /&gt;
&lt;br /&gt;
If multiple players gain the same Award, split the points evenly and make it inactive&lt;br /&gt;
&lt;br /&gt;
If you made no sales this round, you can exchange up to 4 points into the same amount of money, but cannot transfer points you don&#039;t have&lt;br /&gt;
&lt;br /&gt;
If this is round 3, discard one of your personal goals&lt;br /&gt;
&lt;br /&gt;
Then change the starting player clockwise&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Game End===&lt;br /&gt;
&lt;br /&gt;
The game ends at the end of the 7th round&lt;br /&gt;
&lt;br /&gt;
Gain points for Spirits in your warehouse with a few changes, no flavor bonus, no label bonus, no bottle, no money&lt;br /&gt;
&lt;br /&gt;
Gain points for displayed bottles of the same region and/or if you have 3 or more regions represented&lt;br /&gt;
&lt;br /&gt;
Gain points from distillery upgrades if applicable&lt;br /&gt;
&lt;br /&gt;
Gain points from personal goals you have achieved&lt;br /&gt;
&lt;br /&gt;
Gain 1 point per 5 money remaining&lt;br /&gt;
&lt;br /&gt;
The player with the most points, wins!&lt;br /&gt;
&lt;br /&gt;
If tied, the player with the most money, wins!&lt;/div&gt;</summary>
		<author><name>C12h22o11</name></author>
	</entry>
	<entry>
		<id>https://en.doc.boardgamearena.com/index.php?title=Gamehelpdistilled&amp;diff=21348</id>
		<title>Gamehelpdistilled</title>
		<link rel="alternate" type="text/html" href="https://en.doc.boardgamearena.com/index.php?title=Gamehelpdistilled&amp;diff=21348"/>
		<updated>2024-05-26T15:10:52Z</updated>

		<summary type="html">&lt;p&gt;C12h22o11: /* Game End */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Differences Between Physical and BGA ===&lt;br /&gt;
Please be aware that there are a few meaningful differences between a physical copy of Distilled and the BGA implementation:&lt;br /&gt;
&lt;br /&gt;
* On BGA, the distill phase is taken in player order. This is to facilitate the flow of the game, especially in asynchronous play. Each player distills their spirit and claims their label in player order starting with the first player token.&lt;br /&gt;
* On BGA, the Drone Camera is not part of the Distillery Upgrade deck.&lt;br /&gt;
&lt;br /&gt;
===Overview===&lt;br /&gt;
&lt;br /&gt;
Create, age, and sell Spirits in order to be the best distiller over 7 rounds&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Phases===&lt;br /&gt;
&lt;br /&gt;
The rounds are broken up into 4 Phases&lt;br /&gt;
&lt;br /&gt;
Market&lt;br /&gt;
&lt;br /&gt;
Distill&lt;br /&gt;
&lt;br /&gt;
Sell&lt;br /&gt;
&lt;br /&gt;
Age&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Market===&lt;br /&gt;
&lt;br /&gt;
In clockwise order, each player either makes a purchase or passes&lt;br /&gt;
&lt;br /&gt;
Passing takes you out of the Market phase until all other players have passed, which ends the phase&lt;br /&gt;
&lt;br /&gt;
You can purchase as much as you wish over this phase, but can only purchase a maximum of 2 basic items in each Market Phase. Purchases you can make are distillery upgrades, premium ingredients, premium items like bottles or barrels and recipes.&lt;br /&gt;
&lt;br /&gt;
Your Recipe List shows you what grade a recipe is and thus how much it costs to purchase&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Distill===&lt;br /&gt;
&lt;br /&gt;
In clockwise order, starting with the first player, select ingredients to put into your washback.&lt;br /&gt;
&lt;br /&gt;
You may exchange an ingredient or premium item for a basic ingredient of equal or lower value once&lt;br /&gt;
&lt;br /&gt;
All ingredients not being used are put in your Pantry&lt;br /&gt;
&lt;br /&gt;
Make sure to play at least one Yeast, one Water, and one Sugar card otherwise you cannot distill&lt;br /&gt;
&lt;br /&gt;
Add one Alcohol card for each Sugar card played&lt;br /&gt;
&lt;br /&gt;
Shuffle all the cards together, the uppermost and lowest card are returned to the Pantry&lt;br /&gt;
&lt;br /&gt;
The remaining cards are revealed and see if they match a Known Recipe&lt;br /&gt;
&lt;br /&gt;
Vodka requires any sugar and Moonshine requires no sugar, so these are always available, but you are trying to aim for the better recipes if you can&lt;br /&gt;
&lt;br /&gt;
Select the spirit you would like to make and claim a label for it if it is available.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Sell===&lt;br /&gt;
&lt;br /&gt;
If a Recipe you just distilled has the egg timer symbol, it cannot be sold in the same round&lt;br /&gt;
&lt;br /&gt;
Alternatively, if a Recipe you just distilled has the red blocked egg timer symbol, it MUST be sold this round&lt;br /&gt;
&lt;br /&gt;
Similar to the Market phase, this is done in turn order with each player making one sale per turn until everyone has passed&lt;br /&gt;
&lt;br /&gt;
Check the cards relating to the Spirit you wish to sell and the total value is the money you will receive for the sale&lt;br /&gt;
&lt;br /&gt;
If there are any SP icons on this, these are victory points you will also gain&lt;br /&gt;
&lt;br /&gt;
Place the label on your bonus board and gain the bonus immediately&lt;br /&gt;
&lt;br /&gt;
If you used the starting Metal Barrel or Glass Bottle, return this to your storeroom for later use&lt;br /&gt;
&lt;br /&gt;
Place Premium Bottles in your display for end game points&lt;br /&gt;
&lt;br /&gt;
Basic cards, Alcohol cards, Premium Ingredients, Flavor Cards, Signature Ingredients, and Premium barrels are all discarded&lt;br /&gt;
&lt;br /&gt;
Selling an greater Aged Spirit will gain more points than a lesser aged spirit, but will still gain the same money&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Age===&lt;br /&gt;
&lt;br /&gt;
Age all Spirits in your warehouse one step&lt;br /&gt;
&lt;br /&gt;
If this is the last round, warehouse Spirits will still age, but cannot be sold, however there are still points for retained Spirits in warehouse&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Round End===&lt;br /&gt;
&lt;br /&gt;
After Aging, check the Awards, if you achieve one gain the points and make it inactive&lt;br /&gt;
&lt;br /&gt;
If multiple players gain the same Award, split the points evenly and make it inactive&lt;br /&gt;
&lt;br /&gt;
If you made no sales this round, you can exchange up to 4 points into the same amount of money, but cannot transfer points you don&#039;t have&lt;br /&gt;
&lt;br /&gt;
If this is round 3, discard one of your personal goals&lt;br /&gt;
&lt;br /&gt;
Then change the starting player clockwise&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Game End===&lt;br /&gt;
&lt;br /&gt;
The game ends at the end of the 7th round&lt;br /&gt;
&lt;br /&gt;
Gain points for Spirits in your warehouse with a few changes, no flavor bonus, no label bonus, no bottle, no money&lt;br /&gt;
&lt;br /&gt;
Gain points for displayed bottles of the same region and/or if you have 3 or more regions represented&lt;br /&gt;
&lt;br /&gt;
Gain points from distillery upgrades if applicable&lt;br /&gt;
&lt;br /&gt;
Gain points from personal goals you have achieved&lt;br /&gt;
&lt;br /&gt;
Gain 1 point per 5 money remaining&lt;br /&gt;
&lt;br /&gt;
The player with the most points, wins!&lt;br /&gt;
&lt;br /&gt;
If tied, the player with the most money, wins!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Summarised by https://boardgamearena.com/player?id=90078516&lt;/div&gt;</summary>
		<author><name>C12h22o11</name></author>
	</entry>
	<entry>
		<id>https://en.doc.boardgamearena.com/index.php?title=Gamehelpdistilled&amp;diff=21347</id>
		<title>Gamehelpdistilled</title>
		<link rel="alternate" type="text/html" href="https://en.doc.boardgamearena.com/index.php?title=Gamehelpdistilled&amp;diff=21347"/>
		<updated>2024-05-26T15:10:06Z</updated>

		<summary type="html">&lt;p&gt;C12h22o11: /* Distill */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Differences Between Physical and BGA ===&lt;br /&gt;
Please be aware that there are a few meaningful differences between a physical copy of Distilled and the BGA implementation:&lt;br /&gt;
&lt;br /&gt;
* On BGA, the distill phase is taken in player order. This is to facilitate the flow of the game, especially in asynchronous play. Each player distills their spirit and claims their label in player order starting with the first player token.&lt;br /&gt;
* On BGA, the Drone Camera is not part of the Distillery Upgrade deck.&lt;br /&gt;
&lt;br /&gt;
===Overview===&lt;br /&gt;
&lt;br /&gt;
Create, age, and sell Spirits in order to be the best distiller over 7 rounds&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Phases===&lt;br /&gt;
&lt;br /&gt;
The rounds are broken up into 4 Phases&lt;br /&gt;
&lt;br /&gt;
Market&lt;br /&gt;
&lt;br /&gt;
Distill&lt;br /&gt;
&lt;br /&gt;
Sell&lt;br /&gt;
&lt;br /&gt;
Age&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Market===&lt;br /&gt;
&lt;br /&gt;
In clockwise order, each player either makes a purchase or passes&lt;br /&gt;
&lt;br /&gt;
Passing takes you out of the Market phase until all other players have passed, which ends the phase&lt;br /&gt;
&lt;br /&gt;
You can purchase as much as you wish over this phase, but can only purchase a maximum of 2 basic items in each Market Phase. Purchases you can make are distillery upgrades, premium ingredients, premium items like bottles or barrels and recipes.&lt;br /&gt;
&lt;br /&gt;
Your Recipe List shows you what grade a recipe is and thus how much it costs to purchase&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Distill===&lt;br /&gt;
&lt;br /&gt;
In clockwise order, starting with the first player, select ingredients to put into your washback.&lt;br /&gt;
&lt;br /&gt;
You may exchange an ingredient or premium item for a basic ingredient of equal or lower value once&lt;br /&gt;
&lt;br /&gt;
All ingredients not being used are put in your Pantry&lt;br /&gt;
&lt;br /&gt;
Make sure to play at least one Yeast, one Water, and one Sugar card otherwise you cannot distill&lt;br /&gt;
&lt;br /&gt;
Add one Alcohol card for each Sugar card played&lt;br /&gt;
&lt;br /&gt;
Shuffle all the cards together, the uppermost and lowest card are returned to the Pantry&lt;br /&gt;
&lt;br /&gt;
The remaining cards are revealed and see if they match a Known Recipe&lt;br /&gt;
&lt;br /&gt;
Vodka requires any sugar and Moonshine requires no sugar, so these are always available, but you are trying to aim for the better recipes if you can&lt;br /&gt;
&lt;br /&gt;
Select the spirit you would like to make and claim a label for it if it is available.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Sell===&lt;br /&gt;
&lt;br /&gt;
If a Recipe you just distilled has the egg timer symbol, it cannot be sold in the same round&lt;br /&gt;
&lt;br /&gt;
Alternatively, if a Recipe you just distilled has the red blocked egg timer symbol, it MUST be sold this round&lt;br /&gt;
&lt;br /&gt;
Similar to the Market phase, this is done in turn order with each player making one sale per turn until everyone has passed&lt;br /&gt;
&lt;br /&gt;
Check the cards relating to the Spirit you wish to sell and the total value is the money you will receive for the sale&lt;br /&gt;
&lt;br /&gt;
If there are any SP icons on this, these are victory points you will also gain&lt;br /&gt;
&lt;br /&gt;
Place the label on your bonus board and gain the bonus immediately&lt;br /&gt;
&lt;br /&gt;
If you used the starting Metal Barrel or Glass Bottle, return this to your storeroom for later use&lt;br /&gt;
&lt;br /&gt;
Place Premium Bottles in your display for end game points&lt;br /&gt;
&lt;br /&gt;
Basic cards, Alcohol cards, Premium Ingredients, Flavor Cards, Signature Ingredients, and Premium barrels are all discarded&lt;br /&gt;
&lt;br /&gt;
Selling an greater Aged Spirit will gain more points than a lesser aged spirit, but will still gain the same money&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Age===&lt;br /&gt;
&lt;br /&gt;
Age all Spirits in your warehouse one step&lt;br /&gt;
&lt;br /&gt;
If this is the last round, warehouse Spirits will still age, but cannot be sold, however there are still points for retained Spirits in warehouse&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Round End===&lt;br /&gt;
&lt;br /&gt;
After Aging, check the Awards, if you achieve one gain the points and make it inactive&lt;br /&gt;
&lt;br /&gt;
If multiple players gain the same Award, split the points evenly and make it inactive&lt;br /&gt;
&lt;br /&gt;
If you made no sales this round, you can exchange up to 4 points into the same amount of money, but cannot transfer points you don&#039;t have&lt;br /&gt;
&lt;br /&gt;
If this is round 3, discard one of your personal goals&lt;br /&gt;
&lt;br /&gt;
Then change the starting player clockwise&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Game End===&lt;br /&gt;
&lt;br /&gt;
The game ends at the end of the 7th round&lt;br /&gt;
&lt;br /&gt;
Gain points for Spirits in your warehouse with a few changes, no flavor bonus, no label bonus, no bottle, no money&lt;br /&gt;
&lt;br /&gt;
Gain points for displayed bottles of the same region&lt;br /&gt;
&lt;br /&gt;
Gain points from distillery upgrades if applicable&lt;br /&gt;
&lt;br /&gt;
Gain points from personal goals you have achieved&lt;br /&gt;
&lt;br /&gt;
Gain 1 point per 5 money remaining&lt;br /&gt;
&lt;br /&gt;
The player with the most points, wins!&lt;br /&gt;
&lt;br /&gt;
If tied, the player with the most money, wins!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Summarised by https://boardgamearena.com/player?id=90078516&lt;/div&gt;</summary>
		<author><name>C12h22o11</name></author>
	</entry>
	<entry>
		<id>https://en.doc.boardgamearena.com/index.php?title=Gamehelpdistilled&amp;diff=21346</id>
		<title>Gamehelpdistilled</title>
		<link rel="alternate" type="text/html" href="https://en.doc.boardgamearena.com/index.php?title=Gamehelpdistilled&amp;diff=21346"/>
		<updated>2024-05-26T15:08:09Z</updated>

		<summary type="html">&lt;p&gt;C12h22o11: Added differences with physical&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Differences Between Physical and BGA ===&lt;br /&gt;
Please be aware that there are a few meaningful differences between a physical copy of Distilled and the BGA implementation:&lt;br /&gt;
&lt;br /&gt;
* On BGA, the distill phase is taken in player order. This is to facilitate the flow of the game, especially in asynchronous play. Each player distills their spirit and claims their label in player order starting with the first player token.&lt;br /&gt;
* On BGA, the Drone Camera is not part of the Distillery Upgrade deck.&lt;br /&gt;
&lt;br /&gt;
===Overview===&lt;br /&gt;
&lt;br /&gt;
Create, age, and sell Spirits in order to be the best distiller over 7 rounds&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Phases===&lt;br /&gt;
&lt;br /&gt;
The rounds are broken up into 4 Phases&lt;br /&gt;
&lt;br /&gt;
Market&lt;br /&gt;
&lt;br /&gt;
Distill&lt;br /&gt;
&lt;br /&gt;
Sell&lt;br /&gt;
&lt;br /&gt;
Age&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Market===&lt;br /&gt;
&lt;br /&gt;
In clockwise order, each player either makes a purchase or passes&lt;br /&gt;
&lt;br /&gt;
Passing takes you out of the Market phase until all other players have passed, which ends the phase&lt;br /&gt;
&lt;br /&gt;
You can purchase as much as you wish over this phase, but can only purchase a maximum of 2 basic items in each Market Phase. Purchases you can make are distillery upgrades, premium ingredients, premium items like bottles or barrels and recipes.&lt;br /&gt;
&lt;br /&gt;
Your Recipe List shows you what grade a recipe is and thus how much it costs to purchase&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Distill===&lt;br /&gt;
&lt;br /&gt;
Simultaneously pick ingredients you wish to use this phase and put them in your Washback&lt;br /&gt;
&lt;br /&gt;
You may exchange an ingredient or item for a basic ingredient of equal or lower value once&lt;br /&gt;
&lt;br /&gt;
All ingredients not being used are put in your Pantry&lt;br /&gt;
&lt;br /&gt;
Make sure to play at least one Yeast, one Water, and one Sugar card otherwise you cannot distill&lt;br /&gt;
&lt;br /&gt;
Add one Alcohol card for each Sugar card played&lt;br /&gt;
&lt;br /&gt;
Shuffle all the cards together, the uppermost and lowest card are returned to the Pantry&lt;br /&gt;
&lt;br /&gt;
The remaining cards are revealed and see if they match a Known Recipe&lt;br /&gt;
&lt;br /&gt;
Vodka requires any sugar and Moonshine requires no sugar, so these are always available, but you are trying to aim for the better recipes if you can&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Sell===&lt;br /&gt;
&lt;br /&gt;
If a Recipe you just distilled has the egg timer symbol, it cannot be sold in the same round&lt;br /&gt;
&lt;br /&gt;
Alternatively, if a Recipe you just distilled has the red blocked egg timer symbol, it MUST be sold this round&lt;br /&gt;
&lt;br /&gt;
Similar to the Market phase, this is done in turn order with each player making one sale per turn until everyone has passed&lt;br /&gt;
&lt;br /&gt;
Check the cards relating to the Spirit you wish to sell and the total value is the money you will receive for the sale&lt;br /&gt;
&lt;br /&gt;
If there are any SP icons on this, these are victory points you will also gain&lt;br /&gt;
&lt;br /&gt;
Place the label on your bonus board and gain the bonus immediately&lt;br /&gt;
&lt;br /&gt;
If you used the starting Metal Barrel or Glass Bottle, return this to your storeroom for later use&lt;br /&gt;
&lt;br /&gt;
Place Premium Bottles in your display for end game points&lt;br /&gt;
&lt;br /&gt;
Basic cards, Alcohol cards, Premium Ingredients, Flavor Cards, Signature Ingredients, and Premium barrels are all discarded&lt;br /&gt;
&lt;br /&gt;
Selling an greater Aged Spirit will gain more points than a lesser aged spirit, but will still gain the same money&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Age===&lt;br /&gt;
&lt;br /&gt;
Age all Spirits in your warehouse one step&lt;br /&gt;
&lt;br /&gt;
If this is the last round, warehouse Spirits will still age, but cannot be sold, however there are still points for retained Spirits in warehouse&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Round End===&lt;br /&gt;
&lt;br /&gt;
After Aging, check the Awards, if you achieve one gain the points and make it inactive&lt;br /&gt;
&lt;br /&gt;
If multiple players gain the same Award, split the points evenly and make it inactive&lt;br /&gt;
&lt;br /&gt;
If you made no sales this round, you can exchange up to 4 points into the same amount of money, but cannot transfer points you don&#039;t have&lt;br /&gt;
&lt;br /&gt;
If this is round 3, discard one of your personal goals&lt;br /&gt;
&lt;br /&gt;
Then change the starting player clockwise&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Game End===&lt;br /&gt;
&lt;br /&gt;
The game ends at the end of the 7th round&lt;br /&gt;
&lt;br /&gt;
Gain points for Spirits in your warehouse with a few changes, no flavor bonus, no label bonus, no bottle, no money&lt;br /&gt;
&lt;br /&gt;
Gain points for displayed bottles of the same region&lt;br /&gt;
&lt;br /&gt;
Gain points from distillery upgrades if applicable&lt;br /&gt;
&lt;br /&gt;
Gain points from personal goals you have achieved&lt;br /&gt;
&lt;br /&gt;
Gain 1 point per 5 money remaining&lt;br /&gt;
&lt;br /&gt;
The player with the most points, wins!&lt;br /&gt;
&lt;br /&gt;
If tied, the player with the most money, wins!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Summarised by https://boardgamearena.com/player?id=90078516&lt;/div&gt;</summary>
		<author><name>C12h22o11</name></author>
	</entry>
	<entry>
		<id>https://en.doc.boardgamearena.com/index.php?title=Game_layout:_view_and_template:_yourgamename.view.php_and_yourgamename_yourgamename.tpl&amp;diff=21297</id>
		<title>Game layout: view and template: yourgamename.view.php and yourgamename yourgamename.tpl</title>
		<link rel="alternate" type="text/html" href="https://en.doc.boardgamearena.com/index.php?title=Game_layout:_view_and_template:_yourgamename.view.php_and_yourgamename_yourgamename.tpl&amp;diff=21297"/>
		<updated>2024-05-24T17:52:07Z</updated>

		<summary type="html">&lt;p&gt;C12h22o11: addded new warning not to use ID&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Studio_Framework_Navigation}}&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
[[File:bga-pages-from-templates.PNG|700px]]&lt;br /&gt;
&lt;br /&gt;
There are two files involved in overall game layout: yourgamename.view.php and yourgamename_yourgamename.tpl.&lt;br /&gt;
&lt;br /&gt;
These files work together to provide the HTML layout of your game.&lt;br /&gt;
&lt;br /&gt;
Using these 2 files, you specify what HTML is rendered in your game client interface.&lt;br /&gt;
&lt;br /&gt;
In .tpl file you can directly write raw HTML that will be displayed by the browser.&lt;br /&gt;
&lt;br /&gt;
Example: extract of &amp;quot;hearts_hearts.tpl&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  &amp;lt;div id=&amp;quot;myhand_wrap&amp;quot; class=&amp;quot;whiteblock&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;h3&amp;gt;{MY_HAND}&amp;lt;/h3&amp;gt;&lt;br /&gt;
    &amp;lt;div id=&amp;quot;myhand&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Things in curly braces are template variables. You cannot put any english text directly there.&lt;br /&gt;
&lt;br /&gt;
Your view and your template are supposed to generate only the BASE layout of the game.&lt;br /&gt;
&lt;br /&gt;
You shouldn&#039;t try to setup the current game situation in the view: this is the role of your Javascript code. Why? Because you&#039;ll have to write Javascript code to put game elements in place anyway, and you don&#039;t want to write it twice :)&lt;br /&gt;
&lt;br /&gt;
Example of things to generate in your view:&lt;br /&gt;
* The overall layout of your game interface (what is displayed where).&lt;br /&gt;
* The board and fixed elements on the board (ex: places for cards, squares, ...).&lt;br /&gt;
* The tokens which are always on the board (but JS code may move them around during setup)&lt;br /&gt;
&lt;br /&gt;
Example of things that shouldn&#039;t be generate by your view:&lt;br /&gt;
* Game elements that come and go from the game area.&lt;br /&gt;
* Game elements that normally hidden from players (other players cards, cards in the deck).&lt;br /&gt;
&lt;br /&gt;
== Template system ==&lt;br /&gt;
&lt;br /&gt;
BGA is using the phplib template system, used for example in PHPbb forums.&lt;br /&gt;
&lt;br /&gt;
More details about how to use phplib template system here:&lt;br /&gt;
https://web.archive.org/web/20170506065401/http://www.phpbuilder.com:80/columns/david20000512.php3&lt;br /&gt;
&lt;br /&gt;
== Variables ==&lt;br /&gt;
&lt;br /&gt;
In your template (.tpl) file, you can use variables. Then in your view (.view.php) file, you fill these variables with values.&lt;br /&gt;
&lt;br /&gt;
In the example above, &amp;quot;{MY_HAND}&amp;quot; is a variable. As you can see, a variable is uppercase characters surrounded by &amp;quot;{&amp;quot; and &amp;quot;}&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
This is example of how to assign values to these variables in .view.php:&lt;br /&gt;
&lt;br /&gt;
Examples:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   // Display a translated version of &amp;quot;My hand&amp;quot; at the place of the variable in the template&lt;br /&gt;
   $this-&amp;gt;tpl[&#039;MY_HAND&#039;] = self::_(&amp;quot;My hand&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
   // Display some raw HTML material at the place of the variable&lt;br /&gt;
   $this-&amp;gt;tpl[&#039;MY_HAND&#039;] = self::raw( &amp;quot;&amp;lt;div class=&#039;myhand_icon&#039;&amp;gt;&amp;lt;/div&amp;gt;&amp;quot; );&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
WARNING: do not use a variable called {id} as it will interfere with action buttons.&lt;br /&gt;
&lt;br /&gt;
WARNING: do not use a variable called {LB_[whatever]} as any variable starting with LB_ will interfere with the translation system.&lt;br /&gt;
&lt;br /&gt;
WARNING: do not use a variable called {ID} as it could receive unexpected values.&lt;br /&gt;
&lt;br /&gt;
== Template Blocks ==&lt;br /&gt;
&lt;br /&gt;
Using &amp;quot;blocks&amp;quot;, you can repeat a piece of HTML from your template several time.&lt;br /&gt;
&lt;br /&gt;
You should use &amp;quot;blocks&amp;quot; whenever you have a block of HTML that must be repeated many times. For example, for &#039;&#039;Reversi&#039;&#039;, we have to generate 64 (8x8) squares:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(in reversi_reversi.tpl)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;board&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;!-- BEGIN square --&amp;gt;&lt;br /&gt;
        &amp;lt;div id=&amp;quot;square_{X}_{Y}&amp;quot; class=&amp;quot;square&amp;quot; style=&amp;quot;left: {LEFT}px; top: {TOP}px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;!-- END square --&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;div id=&amp;quot;discs&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(in reversi.view.php)&lt;br /&gt;
&lt;br /&gt;
 $this-&amp;gt;page-&amp;gt;begin_block( &amp;quot;reversi_reversi&amp;quot;, &amp;quot;square&amp;quot; );&lt;br /&gt;
        &lt;br /&gt;
 $hor_scale = 64.8;&lt;br /&gt;
 $ver_scale = 64.4;&lt;br /&gt;
 for( $x=1; $x&amp;lt;=8; $x++ ) {&lt;br /&gt;
    for( $y=1; $y&amp;lt;=8; $y++ ) {&lt;br /&gt;
       $this-&amp;gt;page-&amp;gt;insert_block( &amp;quot;square&amp;quot;, array(&lt;br /&gt;
         &#039;X&#039; =&amp;gt; $x,&lt;br /&gt;
         &#039;Y&#039; =&amp;gt; $y,&lt;br /&gt;
         &#039;LEFT&#039; =&amp;gt; round( ($x-1)*$hor_scale+10 ),&lt;br /&gt;
         &#039;TOP&#039; =&amp;gt; round( ($y-1)*$ver_scale+7 )&lt;br /&gt;
        ) );&lt;br /&gt;
    }        &lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Explanations:&lt;br /&gt;
* You specify a block in your template file, using &amp;quot;BEGIN&amp;quot; and &amp;quot;END&amp;quot; keywords as xml comment. In the example above, we are creating a block named &amp;quot;square&amp;quot;.&lt;br /&gt;
* In your view, you declare your block using &amp;quot;begin_block&amp;quot; method.&lt;br /&gt;
* Then, you can insert as many block as you want to, using &amp;quot;insert_block&amp;quot; method.&lt;br /&gt;
&lt;br /&gt;
The insert_block method takes 2 parameters:&lt;br /&gt;
* the name of the block to insert.&lt;br /&gt;
* an associative array you can use to assign values to template variables of this block. In the example above, there are 4 parameters in the block (X, Y, LEFT and TOP).&lt;br /&gt;
&lt;br /&gt;
== Nested blocks ==&lt;br /&gt;
&lt;br /&gt;
You can use nested blocks. In the example below, we are going to add a mini-board for each player of the game, with 4 card places on each of it:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
ggg_ggg.tpl file:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!-- BEGIN player --&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;miniboard&amp;quot; id=&amp;quot;miniboard_{PLAYER_ID}&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;div class=&amp;quot;card_places&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;!-- BEGIN card_place --&amp;gt;&lt;br /&gt;
            &amp;lt;div id=&amp;quot;card_place_{PLAYER_ID}_{PLACE_ID}&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;/div&amp;gt;&lt;br /&gt;
            &amp;lt;!-- END card_place --&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;!-- END player --&amp;gt;&lt;br /&gt;
 &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ggg.view.php file:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$this-&amp;gt;page-&amp;gt;begin_block( &amp;quot;mygame_mygame.tpl&amp;quot;, &amp;quot;card_place&amp;quot; ); // Nested block must be declared first&lt;br /&gt;
$this-&amp;gt;page-&amp;gt;begin_block( &amp;quot;mygame_mygame.tpl&amp;quot;, &amp;quot;player&amp;quot; );&lt;br /&gt;
&lt;br /&gt;
foreach( $players as $player_id =&amp;gt; $player ) {&lt;br /&gt;
    // Important: nested block must be reset here, otherwise the second player miniboard will&lt;br /&gt;
    //  have 8 card_place, the third will have 12 card_place, and so one...&lt;br /&gt;
    $this-&amp;gt;page-&amp;gt;reset_subblocks( &#039;card_place&#039; ); &lt;br /&gt;
&lt;br /&gt;
    for( $i=1; $i&amp;lt;=4; $i++ ) {&lt;br /&gt;
       $this-&amp;gt;page-&amp;gt;insert_block( &amp;quot;card_place&amp;quot;, array( &lt;br /&gt;
             &#039;PLAYER_ID&#039; =&amp;gt; $player_id,&lt;br /&gt;
             &#039;PLACE_ID&#039; =&amp;gt; $i&lt;br /&gt;
          )&lt;br /&gt;
       );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    $this-&amp;gt;page-&amp;gt;insert_block( &#039;player&#039;, array( &#039;PLAYER_ID&#039; =&amp;gt; $player_id );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Conditional blocks ==&lt;br /&gt;
There is no if blocks but you can just have 2 blocks and make one to be &amp;quot;empty&amp;quot; i.e.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
            &amp;lt;!-- BEGIN a --&amp;gt;&lt;br /&gt;
            &amp;lt;div id=&amp;quot;something&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
            &amp;lt;!-- END a --&amp;gt;&lt;br /&gt;
            &amp;lt;!-- BEGIN not_a --&amp;gt;&lt;br /&gt;
            &amp;lt;div id=&amp;quot;something_else&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
            &amp;lt;!-- END not_a --&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
code in view.php&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    if ($condition_a) {&lt;br /&gt;
      // hide not_a&lt;br /&gt;
      $this-&amp;gt;page-&amp;gt;begin_block(&amp;quot;mygame_mygame.tpl&amp;quot;, &amp;quot;not_a&amp;quot;);&lt;br /&gt;
      $this-&amp;gt;page-&amp;gt;insert_template( &amp;quot;not_a&amp;quot;, &#039;&#039;, []);&lt;br /&gt;
    } else {&lt;br /&gt;
     // hide a&lt;br /&gt;
      $this-&amp;gt;page-&amp;gt;begin_block(&amp;quot;mygame_mygame.tpl&amp;quot;, &amp;quot;a&amp;quot;);&lt;br /&gt;
      $this-&amp;gt;page-&amp;gt;insert_template( &amp;quot;a&amp;quot;, &#039;&#039;, []);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Note: if you need variable in these block do the insert_block on one that stays as usual&lt;br /&gt;
&lt;br /&gt;
== Javascript templates ==&lt;br /&gt;
&lt;br /&gt;
For game elements that come and go from the game area, we suggest you to define a Javascript template.&lt;br /&gt;
&lt;br /&gt;
These will allow to separate all html from javascript and php files and keep it strictly in template file.&lt;br /&gt;
&lt;br /&gt;
A Javascript template is defined in your template file like this:&lt;br /&gt;
&lt;br /&gt;
(Reversi Token from Reversi example):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// Templates&lt;br /&gt;
&lt;br /&gt;
var jstpl_disc=&#039;&amp;lt;div class=&amp;quot;disc disccolor_${color}&amp;quot; id=&amp;quot;disc_${xy}&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/script&amp;gt;  &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note: a section for javascript templates is already available at the end of your template skeleton file.&lt;br /&gt;
&lt;br /&gt;
Then, you can use this javascript template to insert this piece of HTML in your game interface, like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    dojo.place( this.format_block( &#039;jstpl_disc&#039;, {&lt;br /&gt;
           xy: x+&#039;&#039;+y,&lt;br /&gt;
           color: color&lt;br /&gt;
    } ) , &#039;discs&#039; );&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
WARNING: always use lowercase for substitution variables in your Javascript templates, in order to avoid collision with phplib template variables (in particular, do not use ${ID}).&lt;br /&gt;
&lt;br /&gt;
Note that &#039;&#039;&#039;you must translate&#039;&#039;&#039; any text arguments passed to &#039;&#039;this.format_block()&#039;&#039; that will be rendered on the screen, for example [[Translations#On_client_side_.28Javascript.29|using &amp;quot;_()&amp;quot;]].&lt;br /&gt;
&lt;br /&gt;
== How to access game information from .view.php ==&lt;br /&gt;
&lt;br /&gt;
From your .view.php, you can access the following:&lt;br /&gt;
&lt;br /&gt;
=== Access current player id===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  global $g_user;&lt;br /&gt;
  $current_player_id = $g_user-&amp;gt;get_id();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Access game object ===&lt;br /&gt;
&lt;br /&gt;
In your view file, &amp;quot;$this-&amp;gt;game&amp;quot; contains an instance of your main game class.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   // Access to some game elements description described in your &amp;quot;material.inc.php&amp;quot;:&lt;br /&gt;
   $my_cards_types = $this-&amp;gt;game-&amp;gt;card_types;&lt;br /&gt;
&lt;br /&gt;
   // Access to any (public) method defined in my .game.php file:&lt;br /&gt;
   $result = $this-&amp;gt;game-&amp;gt;myMethod();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Access spectator status ===&lt;br /&gt;
&lt;br /&gt;
For spectators (players who are not part of the game but just spectating it) you must be careful of displaying all public information, but no private information.&lt;br /&gt;
&lt;br /&gt;
In your view file, you can use $this-&amp;gt;game-&amp;gt;isSpectator() to know if the player is not part of the game, and adapt the interface to this case.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Studio]]&lt;/div&gt;</summary>
		<author><name>C12h22o11</name></author>
	</entry>
</feed>