Merge branch 'main' into feat/93-add-serverside-create-lobby-command

This commit is contained in:
Jona Walpert
2026-04-12 11:27:11 +02:00
159 changed files with 19963 additions and 304 deletions
-28
View File
@@ -1,28 +0,0 @@
# Blog
## Purpose
This folder contains a collection of blog posts documenting the development process of our application. These blogs serve two key purposes:
1. **For External Audiences**
The blogs provide insights into the internal program flow and the interaction between components without requiring readers to dive into the source code. They offer a mixed-level overview of how different parts of the system work together.
2. **For Our Team**
The blogs serve as a record of our decision-making process. By documenting what decisions were made and why, we can track the evolution of our design choices and understand the reasoning behind them. This is invaluable for maintaining consistency across the team.
But keep in mind that these blogs **do not replace** the detailed source code documentation.
## Format
All blog posts follow the naming convention: `<YYYY-MM-DD>_<Title>.md`
## Blog Posts
### General
*(No posts yet)*
### Client
*(No posts yet)*
### Server
*(No posts yet)*
+9
View File
@@ -0,0 +1,9 @@
# Besprechung über Veränderung der Aufgabenteilung
## Verschieben von Aufgaben
Da die Implementation der client server Kommunikation länger dauerte als geplant, wurden achivements erfüllt, die erst bei späteren Meilensteinen relevant sein werden.
## Aufgabeverteilung
Um zu vermeiden, dass sich Personen erst lange Zeit in den Code anderer einarbeiten müssen um zu helfen, wurden Dokumentation und das Erstellen von Materialien für MS4 auf ein Teammitgleid (Jona) ausgelagert um das Projekt nicht zu verlangsamen
@@ -0,0 +1,537 @@
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" lang="" xml:lang="">
<head>
<meta charset="utf-8" />
<meta name="generator" content="pandoc" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
<title>casono-rules-easy-description</title>
<style>
html {
color: #1a1a1a;
background-color: #fdfdfd;
}
body {
margin: 0 auto;
max-width: 36em;
padding-left: 50px;
padding-right: 50px;
padding-top: 50px;
padding-bottom: 50px;
hyphens: auto;
overflow-wrap: break-word;
text-rendering: optimizeLegibility;
font-kerning: normal;
}
@media (max-width: 600px) {
body {
font-size: 0.9em;
padding: 12px;
}
h1 {
font-size: 1.8em;
}
}
@media print {
html {
background-color: white;
}
body {
background-color: transparent;
color: black;
font-size: 12pt;
}
p, h2, h3 {
orphans: 3;
widows: 3;
}
h2, h3, h4 {
page-break-after: avoid;
}
}
p {
margin: 1em 0;
}
a {
color: #1a1a1a;
}
a:visited {
color: #1a1a1a;
}
img {
max-width: 100%;
}
h1, h2, h3, h4, h5, h6 {
margin-top: 1.4em;
}
h5, h6 {
font-size: 1em;
font-style: italic;
}
h6 {
font-weight: normal;
}
ol, ul {
padding-left: 1.7em;
margin-top: 1em;
}
li > ol, li > ul {
margin-top: 0;
}
blockquote {
margin: 1em 0 1em 1.7em;
padding-left: 1em;
border-left: 2px solid #e6e6e6;
color: #606060;
}
code {
font-family: Menlo, Monaco, Consolas, 'Lucida Console', monospace;
font-size: 85%;
margin: 0;
hyphens: manual;
}
pre {
margin: 1em 0;
overflow: auto;
}
pre code {
padding: 0;
overflow: visible;
overflow-wrap: normal;
}
.sourceCode {
background-color: transparent;
overflow: visible;
}
hr {
background-color: #1a1a1a;
border: none;
height: 1px;
margin: 1em 0;
}
table {
margin: 1em 0;
border-collapse: collapse;
width: 100%;
overflow-x: auto;
display: block;
font-variant-numeric: lining-nums tabular-nums;
}
table caption {
margin-bottom: 0.75em;
}
tbody {
margin-top: 0.5em;
border-top: 1px solid #1a1a1a;
border-bottom: 1px solid #1a1a1a;
}
th {
border-top: 1px solid #1a1a1a;
padding: 0.25em 0.5em 0.25em 0.5em;
}
td {
padding: 0.125em 0.5em 0.25em 0.5em;
}
header {
margin-bottom: 4em;
text-align: center;
}
#TOC li {
list-style: none;
}
#TOC ul {
padding-left: 1.3em;
}
#TOC > ul {
padding-left: 0;
}
#TOC a:not(:hover) {
text-decoration: none;
}
code{white-space: pre-wrap;}
span.smallcaps{font-variant: small-caps;}
div.columns{display: flex; gap: min(4vw, 1.5em);}
div.column{flex: auto; overflow-x: auto;}
div.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;}
/* The extra [class] is a hack that increases specificity enough to
override a similar rule in reveal.js */
ul.task-list[class]{list-style: none;}
ul.task-list li input[type="checkbox"] {
font-size: inherit;
width: 0.8em;
margin: 0 0.8em 0.2em -1.6em;
vertical-align: middle;
}
.display.math{display: block; text-align: center; margin: 0.5rem auto;}
</style>
</head>
<body>
<h1 id="casono-rules-easy-description">Casono Rules Easy
Description</h1>
<blockquote>
<p>Source:
https://www.youtube.com/watch?v=h-1WyU5Wqsw&amp;pp=ygUZbGVybmVuIHBva2VyIHRleGFzIGhvbGRlbQ%3D%3D
<!-- vim-markdown-toc GFM --></p>
</blockquote>
<ul>
<li><a href="#deustch">Deustch</a>
<ul>
<li><a href="#blinds-small-blind--big-blind">Blinds (Small Blind &amp;
Big Blind)</a></li>
<li><a href="#erste-setzrunde-preflop">Erste Setzrunde
(Preflop)</a></li>
<li><a href="#beispiel-preflop">Beispiel Preflop</a></li>
<li><a href="#flop-3-gemeinschaftskarten">Flop (3
Gemeinschaftskarten)</a></li>
<li><a href="#beispiel-flop">Beispiel Flop</a></li>
<li><a href="#turn-4-karte">Turn (4. Karte)</a></li>
<li><a href="#river-5-karte">River (5. Karte)</a></li>
<li><a href="#showdown-gewinnentscheidung">Showdown
(Gewinnentscheidung)</a></li>
<li><a href="#poker-hand-rankings-gewichtung">Poker Hand Rankings
(Gewichtung)</a></li>
<li><a href="#fazit">Fazit</a></li>
</ul></li>
<li><a href="#english">English</a>
<ul>
<li><a href="#blinds-small-blind--big-blind-1">Blinds (Small Blind &amp;
Big Blind)</a></li>
<li><a href="#first-betting-round-preflop">First Betting Round
(Preflop)</a></li>
<li><a href="#preflop-example">Preflop Example</a></li>
<li><a href="#flop-3-community-cards">Flop (3 Community Cards)</a></li>
<li><a href="#flop-example">Flop Example</a></li>
<li><a href="#turn-4th-card">Turn (4th Card)</a></li>
<li><a href="#river-5th-card">River (5th Card)</a></li>
<li><a href="#showdown-winning-decision">Showdown (Winning
Decision)</a></li>
<li><a href="#poker-hand-rankings-hierarchy">Poker Hand Rankings
(Hierarchy)</a></li>
<li><a href="#conclusion">Conclusion</a></li>
</ul></li>
</ul>
<!-- vim-markdown-toc -->
<h2 id="deutsch">Deutsch</h2>
<p>Der Pokertisch ist ein unglaublich faszinierender Erlebnisraum, in
dem man sehr viel lernen kann: über sich selbst, über andere Menschen
und über Fragen wie: wie treffe ich eigentlich Entscheidungen, wie gehe
ich mit Stress und Unsicherheit um und wie gut ich darin bin, mich in
andere hineinzuversetzen und Situationen richtig einzuschätzen.</p>
<p>Damit Du in diesem Erlebnisraum starten kannst, ist es wie bei
jedem Spiel notwendig, zuerst die Grundregeln und den Spielablauf zu
verstehen.</p>
<p>Also los geht es:</p>
<p>Wir haben am Tisch <strong>4 Spieler</strong>: Julian, Mathis, Jona
und Lars. Jeder Spieler startet mit <strong>20.000 Chips</strong>. Jeder
bekommt <strong>2 Karten auf die Hand</strong> und es gibt zusätzlich
<strong>5 Gemeinschaftskarten</strong>, die später in der Mitte
aufgedeckt werden.</p>
<figure>
<img src="./images/1.png" alt="1. image" />
<figcaption aria-hidden="true">1. image</figcaption>
</figure>
<p>Die Spieler sitzen in folgender Reihenfolge: Julian, Mathis, Jona und
Lars. Einer davon hat den Dealer-Button, der bestimmt, wer die Karten
austeilt und von wo die Runde beginnt. Dieser Button wandert nach jeder
Runde im Uhrzeigersinn weiter und verändert damit die Position
ständig.</p>
<p>Regel: <em>34 Button Placement and Movement 🟢</em></p>
<h3 id="blinds-small-blind-big-blind">Blinds (Small Blind &amp; Big
Blind)</h3>
<p>Bevor die Karten verteilt werden, gibt es zwei Pflicht-Einsätze:</p>
<p>Der Small Blind und der Big Blind. Der Big Blind ist immer doppelt so
hoch wie der Small Blind.</p>
<figure>
<img src="./images/2.png" alt="2. image" />
<figcaption aria-hidden="true">2. image</figcaption>
</figure>
<p>Regel: <em>32 Dead Button 🟡</em></p>
<p>Diese Einsätze sorgen dafür, dass sofort ein Pot entsteht und das
Spiel überhaupt beginnt, weil jeder schon “im Spiel” ist.</p>
<p>Danach werden die Karten verteilt: zuerst Small Blind, dann Big Blind
und dann im Uhrzeigersinn alle anderen Spieler.</p>
<h3 id="erste-setzrunde-preflop">Erste Setzrunde (Preflop)</h3>
<p>Die erste Setzrunde beginnt immer bei dem Spieler links vom Big
Blind.</p>
<p>Jetzt muss jeder Spieler entscheiden:</p>
<ul>
<li>Fold (aussteigen)</li>
<li>Call (mitgehen)</li>
<li>Raise (erhöhen)</li>
</ul>
<p>Regel: <em>40 Methods of Betting 🟢</em> Regel: <em>41 Methods of
Calling 🟢</em> Regel: <em>42 Methods of Raising 🟢</em> Regel: <em>50
Acting in Turn 🟢</em></p>
<h3 id="beispiel-preflop">Beispiel Preflop</h3>
<p>Julian schaut seine Karten an und entscheidet sich direkt für einen
Call von <strong>600 Chips</strong>.</p>
<figure>
<img src="./images/3.png" alt="3. image" />
<figcaption aria-hidden="true">3. image</figcaption>
</figure>
<p>Mathis sieht seine Karten an und merkt, dass sie nicht gut sind, also
foldet er und steigt aus.</p>
<figure>
<img src="./images/4.png" alt="4. image" />
<figcaption aria-hidden="true">4. image</figcaption>
</figure>
<p>Jona ist nun dran und entscheidet sich ebenfalls für einen Call, weil
seine Hand spielbar ist.</p>
<figure>
<img src="./images/5.png" alt="5. image" />
<figcaption aria-hidden="true">5. image</figcaption>
</figure>
<p>Lars schaut seine Karten an, erkennt eine starke Hand und erhöht auf
<strong>1200 Chips</strong>.</p>
<figure>
<img src="./images/6.png" alt="6. image" />
<figcaption aria-hidden="true">6. image</figcaption>
</figure>
<p>Damit verändert sich sofort die Situation: Julian und Jona müssen
entscheiden, ob sie diesen Raise bezahlen, selbst erhöhen oder
aussteigen.</p>
<h3 id="flop-3-gemeinschaftskarten">Flop (3 Gemeinschaftskarten)</h3>
<p>Jetzt werden <strong>3 Gemeinschaftskarten</strong> in die Mitte
gelegt. Ab hier verändert sich das Spiel komplett, weil alle Spieler
zusätzliche Informationen bekommen.</p>
<figure>
<img src="./images/7.png" alt="7. image" />
<figcaption aria-hidden="true">7. image</figcaption>
</figure>
<p>Es beginnt eine neue Setzrunde.</p>
<p>Regel: <em>49 Accepted Action 🟢</em></p>
<h3 id="beispiel-flop">Beispiel Flop</h3>
<p>Lars setzt <strong>1000 Chips</strong> als Erstes. Julian entscheidet
sich mitzugehen (Call), weil seine Karten durch die Gemeinschaftskarten
stärker geworden sind.</p>
<figure>
<img src="./images/8.png" alt="8. image" />
<figcaption aria-hidden="true">8. image</figcaption>
</figure>
<p>Jona steigt aus, weil er keine gute Verbindung mehr sieht. Mathis ist
bereits raus.</p>
<h3 id="turn-4.-karte">Turn (4. Karte)</h3>
<p>Jetzt kommt die <strong>4. Gemeinschaftskarte</strong>.</p>
<p>Wieder beginnt eine neue Setzrunde.</p>
<p>Lars setzt diesmal <strong>3000 Chips</strong>. Julian bezahlt erneut
(Call), weil seine Hand weiterhin gut spielbar ist.</p>
<figure>
<img src="./images/9.png" alt="9. image" />
<figcaption aria-hidden="true">9. image</figcaption>
</figure>
<p>Regel: <em>53 Action Out of Turn 🟡</em></p>
<h3 id="river-5.-karte">River (5. Karte)</h3>
<p>Jetzt wird die letzte Gemeinschaftskarte aufgedeckt.</p>
<p>Dies ist die letzte Entscheidung im Spiel.</p>
<p>Lars setzt <strong>5000 Chips</strong>.</p>
<figure>
<img src="./images/10.png" alt="10. image" />
<figcaption aria-hidden="true">10. image</figcaption>
</figure>
<p>Julian muss jetzt entscheiden: Fold, Call oder Raise auf
<strong>10000 Chips</strong>.</p>
<p>Regel: <em>54 Pot Size Bets 🟡</em></p>
<h3 id="showdown-gewinnentscheidung">Showdown (Gewinnentscheidung)</h3>
<p>Wenn nach der letzten Setzrunde noch zwei Spieler übrig sind, kommt
es zum Showdown.</p>
<p>Beide Spieler zeigen ihre Karten offen. Gewonnen hat die
<strong>beste 5-Karten-Kombination aus Handkarten und
Gemeinschaftskarten</strong>.</p>
<figure>
<img src="./images/11.png" alt="11. image" />
<figcaption aria-hidden="true">11. image</figcaption>
</figure>
<p>Regel: <em>12 Cards Speak at Showdown 🟢</em> Regel: <em>16 Face Up
for All-Ins 🟢</em> Regel: <em>17 Non All-In Showdowns 🟢</em></p>
<p>Wenn Julian den letzten Einsatz bezahlt, werden die Hände verglichen.
Wenn er foldet, gewinnt Lars automatisch den gesamten Pot.</p>
<h3 id="poker-hand-rankings-gewichtung">Poker Hand Rankings
(Gewichtung)</h3>
<p>Die Kartenkombinationen sind klar geordnet von schwach bis extrem
stark:</p>
<figure>
<img src="./images/12.png" alt="12. image" />
<figcaption aria-hidden="true">12. image</figcaption>
</figure>
<p>Je höher die Kombination, desto stärker die Hand und desto
wahrscheinlicher der Gewinn.</p>
<p>Julian: 2. Paar:</p>
<figure>
<img src="./images/13.png" alt="13. image" />
<figcaption aria-hidden="true">13. image</figcaption>
</figure>
<p>Lars: 1. Paar:</p>
<figure>
<img src="./images/14.png" alt="14. image" />
<figcaption aria-hidden="true">14. image</figcaption>
</figure>
<p>Da zwei Paare in der Rangfolge über einem einzelnen Paar stehen,
gewinnt Julian diese Runde.</p>
<h3 id="fazit">Fazit</h3>
<p>Poker ist kein Glücksspiel im klassischen Sinn, sondern ein Spiel aus
Strategie, Psychologie und Mathematik. Jede Entscheidung von Julian,
Mathis, Jona oder Lars verändert die komplette Dynamik am Tisch. Wer die
Regeln versteht, versteht nicht nur Karten, sondern auch Menschen und
Entscheidungen unter Druck.</p>
<p>Regel: <em>67 One Player One Hand 🟢</em> Regel: <em>52 Incorrect
Bets 🟡</em> Regel: <em>57 Non-Standard Betting 🟡</em></p>
<h2 id="english">English</h2>
<p>The poker table is an incredibly fascinating experiential space where
you can learn a great deal: about yourself, about other people, and
about questions such as: How do I actually make decisions? How do I
handle stress and uncertainty? And how good am I at empathizing with
others and correctly assessing situations?</p>
<p>To enter this experiential space, its necessary—like with any
game—to first understand the basic rules and game flow.</p>
<p>So lets begin:</p>
<p>We have <strong>4 players</strong> at the table: Julian, Mathis,
Jona, and Lars. Each player starts with <strong>20,000 chips</strong>.
Each receives <strong>2 hole cards</strong>, and there are <strong>5
community cards</strong> that will later be revealed in the center.</p>
<figure>
<img src="./images/1.png" alt="1. image" />
<figcaption aria-hidden="true">1. image</figcaption>
</figure>
<p>The players are seated as follows: Julian, Mathis, Jona, and Lars.
One of them holds the dealer button, which determines who deals the
cards and where the round begins. This button moves clockwise after each
hand, constantly changing the positions.</p>
<p>Rule: <em>34 Button Placement and Movement 🟢</em></p>
<h3 id="blinds-small-blind-big-blind-1">Blinds (Small Blind &amp; Big
Blind)</h3>
<p>Before cards are dealt, there are two mandatory bets:</p>
<p>The Small Blind and the Big Blind. The Big Blind is always double the
amount of the Small Blind.</p>
<figure>
<img src="./images/2.png" alt="2. image" />
<figcaption aria-hidden="true">2. image</figcaption>
</figure>
<p>Rule: <em>32 Dead Button 🟡</em></p>
<p>These forced bets ensure that a pot exists from the start, making the
game begin with everyone already involved.</p>
<p>After this, the cards are dealt: first to the Small Blind, then the
Big Blind, and then clockwise to all other players.</p>
<h3 id="first-betting-round-preflop">First Betting Round (Preflop)</h3>
<p>The first betting round always begins with the player to the left of
the Big Blind.</p>
<p>Now each player must decide:</p>
<ul>
<li>Fold (exit the hand)</li>
<li>Call (match the current bet)</li>
<li>Raise (increase the bet)</li>
</ul>
<p>Rule: <em>40 Methods of Betting 🟢</em><br />
Rule: <em>41 Methods of Calling 🟢</em><br />
Rule: <em>42 Methods of Raising 🟢</em><br />
Rule: <em>50 Acting in Turn 🟢</em></p>
<h3 id="preflop-example">Preflop Example</h3>
<p>Julian looks at his cards and decides to Call for <strong>600
chips</strong>.</p>
<figure>
<img src="./images/3.png" alt="3. image" />
<figcaption aria-hidden="true">3. image</figcaption>
</figure>
<p>Mathis sees his cards and realizes they arent strong, so he Folds
and exits the hand.</p>
<figure>
<img src="./images/4.png" alt="4. image" />
<figcaption aria-hidden="true">4. image</figcaption>
</figure>
<p>Jona is next and decides to Call as well, because his hand is
playable.</p>
<figure>
<img src="./images/5.png" alt="5. image" />
<figcaption aria-hidden="true">5. image</figcaption>
</figure>
<p>Lars looks at his cards, recognizes a strong hand, and Raises to
<strong>1200 chips</strong>.</p>
<figure>
<img src="./images/6.png" alt="6. image" />
<figcaption aria-hidden="true">6. image</figcaption>
</figure>
<p>This immediately changes the situation: Julian and Jona must now
decide whether to call this raise, re-raise, or fold.</p>
<h3 id="flop-3-community-cards">Flop (3 Community Cards)</h3>
<p>Now <strong>3 community cards</strong> are placed face-up in the
center. From this point, the game changes completely, as all players
gain additional information.</p>
<figure>
<img src="./images/7.png" alt="7. image" />
<figcaption aria-hidden="true">7. image</figcaption>
</figure>
<p>A new betting round begins.</p>
<p>Rule: <em>49 Accepted Action 🟢</em></p>
<h3 id="flop-example">Flop Example</h3>
<p>Lars bets <strong>1,000 chips</strong> first. Julian decides to Call
because his hand has improved with the community cards.</p>
<figure>
<img src="./images/8.png" alt="8. image" />
<figcaption aria-hidden="true">8. image</figcaption>
</figure>
<p>Jona folds, as he no longer sees a strong connection. Mathis is
already out.</p>
<h3 id="turn-4th-card">Turn (4th Card)</h3>
<p>Now the <strong>4th community card</strong> is revealed.</p>
<p>Another betting round begins.</p>
<p>Lars bets <strong>3,000 chips</strong> this time. Julian calls again,
as his hand remains strong.</p>
<figure>
<img src="./images/9.png" alt="9. image" />
<figcaption aria-hidden="true">9. image</figcaption>
</figure>
<p>Rule: <em>53 Action Out of Turn 🟡</em></p>
<h3 id="river-5th-card">River (5th Card)</h3>
<p>Now the final community card is revealed.</p>
<p>This is the last decision point in the hand.</p>
<p>Lars bets <strong>5,000 chips</strong>.</p>
<figure>
<img src="./images/10.png" alt="10. image" />
<figcaption aria-hidden="true">10. image</figcaption>
</figure>
<p>Julian must now decide: Fold, Call, or even Raise to <strong>10,000
chips</strong>.</p>
<p>Rule: <em>54 Pot Size Bets 🟡</em></p>
<h3 id="showdown-winning-decision">Showdown (Winning Decision)</h3>
<p>If two or more players remain after the final betting round, a
showdown occurs.</p>
<p>All active players reveal their cards. The winner is the one with the
<strong>best 5-card combination using any combination of their hole
cards and the community cards</strong>.</p>
<figure>
<img src="./images/11.png" alt="11. image" />
<figcaption aria-hidden="true">11. image</figcaption>
</figure>
<p>Rule: <em>12 Cards Speak at Showdown 🟢</em><br />
Rule: <em>16 Face Up for All-Ins 🟢</em><br />
Rule: <em>17 Non All-In Showdowns 🟢</em></p>
<p>If Julian calls the final bet, the hands are compared. If he folds,
Lars wins the entire pot automatically.</p>
<h3 id="poker-hand-rankings-hierarchy">Poker Hand Rankings
(Hierarchy)</h3>
<p>The card combinations are clearly ranked—from weakest to
strongest:</p>
<figure>
<img src="./images/12.png" alt="12. image" />
<figcaption aria-hidden="true">12. image</figcaption>
</figure>
<p>The higher the combination, the stronger the hand, and the greater
the chance of winning.</p>
<p>Julian: Two Pair:</p>
<figure>
<img src="./images/13.png" alt="13. image" />
<figcaption aria-hidden="true">13. image</figcaption>
</figure>
<p>Lars: One Pair:</p>
<figure>
<img src="./images/14.png" alt="14. image" />
<figcaption aria-hidden="true">14. image</figcaption>
</figure>
<p>Since two pair ranks higher than one pair, Julian wins this
round.</p>
<h3 id="conclusion">Conclusion</h3>
<p>Poker is not gambling in the traditional sense, but rather a game of
strategy, psychology, and mathematics. Every decision made by Julian,
Mathis, Jona, or Lars changes the entire dynamic at the table.
Understanding the rules means not only understanding cards, but also
people and decision-making under pressure.</p>
</body>
</html>
@@ -50,6 +50,42 @@ This document describes the protocol for client-server communication in our appl
- [Error Response](#error-response-6)
- [Example Request](#example-request-4)
- [Example Response](#example-response-4)
- [GET_LOBBY_LIST command](#get_lobby_list-command)
- [Required pre-execution checks](#required-pre-execution-checks)
- [Request Parameters](#request-parameters)
- [Success Response](#success-response)
- [Example Request](#example-request)
- [Example Response](#example-response)
- [GET_GAME_STATE command](#get_game_state-command)
- [Required pre-execution checks](#required-pre-execution-checks)
- [Request Parameters](#request-parameters)
- [Success Response](#success-response)
- [Example Request](#example-request)
- [Example Response](#example-response)
- [RAISE command](#raise-command)
- [CALL command](#call-command)
- [FOLD command](#fold-command)
- [BET command](#bet-command)
- [SEND_MESSAGE command](#send_message-command)
- [Required pre-execution checks](#required-pre-execution-checks)
- [Request Parameters](#request-parameters)
- [Success Response](#success-response)
- [GET_MESSAGE_COUNT command](#get_message_count-command)
- [Required pre-execution checks](#required-pre-execution-checks)
- [Request Parameters](#request-parameters)
- [Success Response](#success-response)
- [GET_NEXT_MESSAGE command](#get_next_message-command)
- [Required pre-execution checks](#required-pre-execution-checks)
- [Request Parameters](#request-parameters)
- [Success Response](#success-response)
- [JOIN_LOBBY command](#join_lobby-command)
- [Required pre-execution checks](#required-pre-execution-checks)
- [Request Parameters](#request-parameters)
- [Success Response](#success-response)
- [GET_LOBBY_STATUS command](#get_lobby_status-command)
- [Required pre-execution checks](#required-pre-execution-checks)
- [Request Parameters](#request-parameters)
- [Success Response](#success-response)
<!-- Please see the comments for copy n' paste ready examples -->
@@ -455,6 +491,628 @@ TYPE=GLOBAL GAME=-1 USER=player1 TARGET=null TIME=9:30 TEXT="Guten Tag"
END
```
### Example Response (success)
```
+OK
END
```
## JOIN_LOBBY command
The `JOIN_LOBBY` command requests the server to add the currently logged-in user to the lobby with the given identifier. The server resolves the username from the session; clients must only provide the `ID` parameter.
### Required pre-execution checks
- [`UserLoggedInCheck`](#userloggedincheck)
### Request Parameters
| Parameter Name | Type | Optional | Description |
| :------------- | :--- | :------: | :---------- |
| `ID` | `int` | no | Numeric id of the target lobby |
### Implementation notes
- Parser: `JoinLobbyParser` — reads the `ID` parameter and builds `JoinLobbyRequest`.
- Handler: `JoinLobbyHandler` — resolves the username from `UserRegistry` using the session id, attempts to add the user to the lobby via `LobbyManager.addPlayerToLobby(...)` and returns appropriate responses.
### Success Response
No additional response fields. The server replies with a simple `+OK` on success.
### Error Response
| Code | Description |
| :--- | :---------- |
| `USER_NOT_LOGGED_IN` | No user associated with the session (pre-execution check failed) |
| `LOBBY_NOT_FOUND` | The specified lobby id does not exist |
| `LOBBY_FULL_OR_ALREADY_IN` | Lobby is full or the user is already in the lobby |
### Example Request
```
JOIN_LOBBY ID=1
```
### Example Response (success)
```
+OK
END
```
### Example Response (error)
```
-ERR
CODE=LOBBY_NOT_FOUND
MESSAGE=Lobby not found
END
```
## GET_LOBBY_LIST command
The `GET_LOBBY_LIST` command requests the server to return a list of currently available lobbies with basic metadata.
### Required pre-execution checks
None.
### Request Parameters
No parameters.
### Implementation notes
- Parser: `GetLobbyListParser` — creates `GetLobbyListRequest` (no parameters).
- Handler: `GetLobbyListHandler` — queries `LobbyManager#getAllLobbies()` and returns `GetLobbyListResponse`.
- Response: `GetLobbyListResponse` — builds a `LOBBIES` collection with repeated `LOBBY` blocks containing `ID`, `NAME`, `PLAYER_COUNT`.
### Success Response
The response contains a `LOBBIES` collection with nested `LOBBY` entries.
Example response structure:
```
+OK
LOBBIES
LOBBY
ID=1
NAME=Room 1
PLAYER_COUNT=2
END
LOBBY
ID=2
NAME=Room 2
PLAYER_COUNT=3
END
END
END
```
### Example Request
```
GET_LOBBY_LIST
```
### Example Response (error)
```
-ERR
CODE=NO_LOBBIES_AVAILABLE
MESSAGE=No lobbies available
END
```
## GET_GAME_STATE command
The `GET_GAME_STATE` command returns a snapshot of the current game for a lobby. It includes global fields (`PHASE`, `POT`, `CURRENT_BET`, `DEALER`, `ACTIVE_PLAYER`), repeated `CARD` blocks for community cards and repeated `PLAYER` blocks for per-player information. If the requester is a player in the game, their hole cards are included inside their `PLAYER` block as nested `CARD` blocks.
### Required pre-execution checks
- [`UserLoggedInCheck`](#userloggedincheck)
### Request Parameters
| Parameter Name | Type | Optional | Description |
| :------------- | :----- | :------: | :---------- |
| `GAME_ID` | `int` | yes | Numeric id of the lobby/game to query. If omitted the server will resolve the lobby by the requesting session's associated user.
| `USERNAME` | `String` | yes | Optional username to query the game state for (server will also accept session resolution).
### Implementation notes
- Parser: `GetGameStateParser` — accepts optional `GAME_ID` and `USERNAME` and builds `GetGameStateRequest`.
- Handler: `GetGameStateHandler` — resolves the target lobby by `GAME_ID` when provided, otherwise by `USERNAME` or session user; if a game is running a `GetGameStateResponse` is returned.
- Response: `GetGameStateResponse` — uses repeated `CARD` and `PLAYER` blocks to match the client parser expectations.
### Success Response
Top-level fields and collections (example):
```
+OK
PHASE=PRE_FLOP
POT=150
CURRENT_BET=50
DEALER=2
ACTIVE_PLAYER=1
CARD
VALUE=K
SUIT=H
END
PLAYER
NAME=player1
CHIPS=1000
BET=50
STATE=ACTIVE
CARD
VALUE=A
SUIT=S
END
END
END
```
### Example Request
```
GET_GAME_STATE GAME_ID=1
```
### Example Response (error)
```
-ERR
CODE=GAME_NOT_STARTED
MESSAGE=Game not started
END
```
## BET command
The `BET` command lets the currently logged-in player place a bet in the ongoing game for their lobby.
### Required pre-execution checks
- [`UserLoggedInCheck`](#userloggedincheck)
### Request Parameters
| Parameter Name | Type | Optional | Description |
| :------------- | :--- | :------: | :---------- |
| `GAME_ID` | `int` | yes | Numeric id of the lobby/game to target. If omitted the server resolves the lobby by the requesting session's user. |
| `AMOUNT` | `int` | no | Amount the player wants to bet |
### Implementation notes
- Parser: `PlayerBetParser` — reads `AMOUNT` and optionally `GAME_ID`.
- Handler: `PlayerBetHandler` — validates the session, lobby (by id when provided or else by session), player's turn and balance and forwards to `GameController`.
### Success Response
No additional response fields. Server replies with `+OK` on success.
### Error Response
| Code | Description |
| :--- | :---------- |
| `NOT_YOUR_TURN` | The player attempted to bet when not their turn |
| `INSUFFICIENT_FUNDS` | Player does not have enough chips |
| `INVALID_AMOUNT` | Amount parameter is invalid |
| `GAME_NOT_STARTED` | No game is running in the lobby |
| `NOT_IN_LOBBY` | Requesting user is not a member of the lobby |
| `LOBBY_NOT_FOUND` | The specified `GAME_ID` does not exist |
### Example Request
```
BET GAME_ID=1 AMOUNT=50
```
### Example Response (success)
```
+OK
END
```
### Example Response (error)
```
-ERR
CODE=INSUFFICIENT_FUNDS
MSG=Not enough chips
END
```
## RAISE command
The `RAISE` command lets the currently logged-in player increase the current bet in the ongoing game for their lobby.
### Required pre-execution checks
- [`UserLoggedInCheck`](#userloggedincheck)
### Request Parameters
| Parameter Name | Type | Optional | Description |
| :------------- | :--- | :------: | :---------- |
| `GAME_ID` | `int` | yes | Numeric id of the lobby/game to target. If omitted the server resolves the lobby by the requesting session's user. |
| `AMOUNT` | `int` | no | Amount the player wants to raise |
### Implementation notes
- Parser: `PlayerRaiseParser` — reads `AMOUNT` and optionally `GAME_ID`.
- Handler: `PlayerRaiseHandler` — validates the session, lobby (by id when provided or else by session), player's turn and balance and forwards to `GameController`.
### Success Response
No additional response fields. Server replies with `+OK` on success.
### Error Response
| Code | Description |
| :--- | :---------- |
| `NOT_YOUR_TURN` | The player attempted to raise when not their turn |
| `INSUFFICIENT_FUNDS` | Player does not have enough chips |
| `INVALID_AMOUNT` | Amount parameter is invalid |
| `GAME_NOT_STARTED` | No game is running in the lobby |
| `NOT_IN_LOBBY` | Requesting user is not a member of the lobby |
| `LOBBY_NOT_FOUND` | The specified `GAME_ID` does not exist |
### Example Request
```
RAISE GAME_ID=1 AMOUNT=100
```
### Example Response (success)
```
+OK
END
```
### Example Response (error)
```
-ERR
CODE=INSUFFICIENT_FUNDS
MSG=Not enough chips
END
```
## CALL command
The `CALL` command lets the currently logged-in player match the current bet (call) in the ongoing game for their lobby.
### Required pre-execution checks
- [`UserLoggedInCheck`](#userloggedincheck)
### Request Parameters
| Parameter Name | Type | Optional | Description |
| :------------- | :--- | :------: | :---------- |
| `GAME_ID` | `int` | yes | Numeric id of the lobby/game to target. If omitted the server resolves the lobby by the requesting session's user. |
### Implementation notes
- Parser: `PlayerCallParser` — accepts optional `GAME_ID`.
- Handler: `PlayerCallHandler` — validates the session, resolves the lobby by id when provided or by session otherwise and forwards to `GameController`.
### Success Response
No additional response fields. Server replies with `+OK` on success.
### Error Response
| Code | Description |
| :--- | :---------- |
| `NOT_YOUR_TURN` | The player attempted to call when not their turn |
| `INSUFFICIENT_FUNDS` | Player does not have enough chips |
| `GAME_NOT_STARTED` | No game is running in the lobby |
| `NOT_IN_LOBBY` | Requesting user is not a member of the lobby |
| `LOBBY_NOT_FOUND` | The specified `GAME_ID` does not exist |
### Example Request
```
CALL GAME_ID=1
```
### Example Response (success)
```
+OK
END
```
### Example Response (error)
```
-ERR
CODE=NOT_YOUR_TURN
MSG=It is not your turn
END
```
## FOLD command
The `FOLD` command lets the currently logged-in player leave the current hand (fold) in the ongoing game for their lobby.
### Required pre-execution checks
- [`UserLoggedInCheck`](#userloggedincheck)
### Request Parameters
| Parameter Name | Type | Optional | Description |
| :------------- | :--- | :------: | :---------- |
| `GAME_ID` | `int` | yes | Numeric id of the lobby/game to target. If omitted the server resolves the lobby by the requesting session's user. |
### Implementation notes
- Parser: `PlayerFoldParser` — accepts optional `GAME_ID`.
- Handler: `PlayerFoldHandler` — validates the session, resolves the lobby by id when provided or by session otherwise and forwards to `GameController`.
### Success Response
No additional response fields. Server replies with `+OK` on success.
### Error Response
| Code | Description |
| :--- | :---------- |
| `NOT_YOUR_TURN` | The player attempted to fold when not their turn |
| `GAME_NOT_STARTED` | No game is running in the lobby |
| `NOT_IN_LOBBY` | Requesting user is not a member of the lobby |
| `LOBBY_NOT_FOUND` | The specified `GAME_ID` does not exist |
### Example Request
```
FOLD GAME_ID=1
```
### Example Response (success)
```
+OK
END
```
### Example Response (error)
```
-ERR
CODE=NOT_YOUR_TURN
MSG=It is not your turn
END
```
## FOLD command
The `FOLD` command lets the currently logged-in player leave the current hand (fold) in the ongoing game for their lobby.
### Required pre-execution checks
- [`UserLoggedInCheck`](#userloggedincheck)
### Request Parameters
| Parameter Name | Type | Optional | Description |
| :------------- | :--- | :------: | :---------- |
| `GAME_ID` | `int` | yes | Numeric id of the lobby/game to target. If omitted the server resolves the lobby by the requesting session's user. |
### Implementation notes
- Parser: `PlayerFoldParser` — accepts optional `GAME_ID`.
- Handler: `PlayerFoldHandler` — validates the session, resolves the lobby by id when provided or by session otherwise and forwards to `GameController`.
### Success Response
No additional response fields. Server replies with `+OK` on success.
### Error Response
| Code | Description |
| :--- | :---------- |
| `NOT_YOUR_TURN` | The player attempted to fold when not their turn |
| `GAME_NOT_STARTED` | No game is running in the lobby |
| `NOT_IN_LOBBY` | Requesting user is not a member of the lobby |
| `LOBBY_NOT_FOUND` | The specified `GAME_ID` does not exist |
### Example Request
```
FOLD GAME_ID=1
```
### Example Response (success)
```
+OK
END
```
### Example Response (error)
```
-ERR
CODE=NOT_YOUR_TURN
MSG=It is not your turn
END
```
## FOLD command
The `FOLD` command lets the currently logged-in player leave the current hand (fold) in the ongoing game for their lobby.
### Required pre-execution checks
- [`UserLoggedInCheck`](#userloggedincheck)
### Request Parameters
| Parameter Name | Type | Optional | Description |
| :------------- | :--- | :------: | :---------- |
| `GAME_ID` | `int` | yes | Numeric id of the lobby/game to target. If omitted the server resolves the lobby by the requesting session's user. |
### Implementation notes
- Parser: `PlayerFoldParser` — accepts optional `GAME_ID`.
- Handler: `PlayerFoldHandler` — validates the session, resolves the lobby by id when provided or by session otherwise and forwards to `GameController`.
### Success Response
No additional response fields. Server replies with `+OK` on success.
### Error Response
| Code | Description |
| :--- | :---------- |
| `NOT_YOUR_TURN` | The player attempted to fold when not their turn |
| `GAME_NOT_STARTED` | No game is running in the lobby |
| `NOT_IN_LOBBY` | Requesting user is not a member of the lobby |
| `LOBBY_NOT_FOUND` | The specified `GAME_ID` does not exist |
### Example Request
```
FOLD GAME_ID=1
```
### Example Response (success)
```
+OK
END
```
### Example Response (error)
```
-ERR
CODE=NOT_YOUR_TURN
MSG=It is not your turn
END
```
## FOLD command
The `FOLD` command lets the currently logged-in player leave the current hand (fold) in the ongoing game for their lobby.
### Required pre-execution checks
- [`UserLoggedInCheck`](#userloggedincheck)
### Request Parameters
| Parameter Name | Type | Optional | Description |
| :------------- | :--- | :------: | :---------- |
| `GAME_ID` | `int` | yes | Numeric id of the lobby/game to target. If omitted the server resolves the lobby by the requesting session's user. |
### Implementation notes
- Parser: `PlayerFoldParser` — accepts optional `GAME_ID`.
- Handler: `PlayerFoldHandler` — validates the session, resolves the lobby by id when provided or by session otherwise and forwards to `GameController`.
### Success Response
No additional response fields. Server replies with `+OK` on success.
### Error Response
| Code | Description |
| :--- | :---------- |
| `NOT_YOUR_TURN` | The player attempted to fold when not their turn |
| `GAME_NOT_STARTED` | No game is running in the lobby |
| `NOT_IN_LOBBY` | Requesting user is not a member of the lobby |
| `LOBBY_NOT_FOUND` | The specified `GAME_ID` does not exist |
### Example Request
```
FOLD GAME_ID=1
```
### Example Response (success)
```
+OK
END
```
### Example Response (error)
```
-ERR
CODE=NOT_YOUR_TURN
MSG=It is not your turn
END
```
## GET_LOBBY_STATUS command
The `GET_LOBBY_STATUS` command requests the server to return the current state of a lobby, including the list of players and their ready state.
### Required pre-execution checks
None.
### Request Parameters
| Parameter Name | Type | Optional | Description |
| :------------- | :--- | :------: | :---------- |
| `ID` | `int` | no | Numeric id of the target lobby |
### Implementation notes
- Parser: `GetLobbyStatusParser` — reads the `ID` parameter and builds `GetLobbyStatusRequest`.
- Handler: `GetLobbyStatusHandler` — queries `LobbyManager` for the lobby and builds a `GetLobbyStatusResponse` containing player entries.
### Success Response
The response contains a `LOBBY` collection with nested `PLAYERS` and one or more `PLAYER` entries. Each `PLAYER` entry contains `USERNAME` and `READY` fields.
Example response structure:
```
+OK
LOBBY
ID=1
PLAYERS
PLAYER
USERNAME=Lars_001
READY=false
END
PLAYER
USERNAME=Anna
READY=true
END
END
END
END
```
### Error Response
| Code | Description |
| :--- | :---------- |
| `LOBBY_NOT_FOUND` | The specified lobby id does not exist |
### Example Request
```
GET_LOBBY_STATUS ID=1
```
### Example Response (error)
```
-ERR
CODE=LOBBY_NOT_FOUND
MESSAGE=Lobby not found
END
```
## CREATE_LOBBY command
The `CREATE_LOBBY` command requests the server to create a new lobby and return its identifier.
@@ -0,0 +1,323 @@
# Casono Rules Easy Description
> Source: <https://www.youtube.com/watch?v=h-1WyU5Wqsw&pp=ygUZbGVybmVuIHBva2VyIHRleGFzIGhvbGRlbQ%3D%3D>
<!-- vim-markdown-toc GFM -->
* [Deustch](#deustch)
* [Blinds (Small Blind & Big Blind)](#blinds-small-blind--big-blind)
* [Erste Setzrunde (Preflop)](#erste-setzrunde-preflop)
* [Beispiel Preflop](#beispiel-preflop)
* [Flop (3 Gemeinschaftskarten)](#flop-3-gemeinschaftskarten)
* [Beispiel Flop](#beispiel-flop)
* [Turn (4. Karte)](#turn-4-karte)
* [River (5. Karte)](#river-5-karte)
* [Showdown (Gewinnentscheidung)](#showdown-gewinnentscheidung)
* [Poker Hand Rankings (Gewichtung)](#poker-hand-rankings-gewichtung)
* [Fazit](#fazit)
* [English](#english)
* [Blinds (Small Blind & Big Blind)](#blinds-small-blind--big-blind-1)
* [First Betting Round (Preflop)](#first-betting-round-preflop)
* [Preflop Example](#preflop-example)
* [Flop (3 Community Cards)](#flop-3-community-cards)
* [Flop Example](#flop-example)
* [Turn (4th Card)](#turn-4th-card)
* [River (5th Card)](#river-5th-card)
* [Showdown (Winning Decision)](#showdown-winning-decision)
* [Poker Hand Rankings (Hierarchy)](#poker-hand-rankings-hierarchy)
* [Conclusion](#conclusion)
<!-- vim-markdown-toc -->
## Deutsch
Der Pokertisch ist ein unglaublich faszinierender Erlebnisraum, in dem man sehr viel lernen kann: über sich selbst, über andere Menschen und über Fragen wie: wie treffe ich eigentlich Entscheidungen, wie gehe ich mit Stress und Unsicherheit um und wie gut ich darin bin, mich in andere hineinzuversetzen und Situationen richtig einzuschätzen.
Damit Du in diesem Erlebnisraum starten kannst, ist es wie bei jedem Spiel notwendig, zuerst die Grundregeln und den Spielablauf zu verstehen.
Also los geht es:
Wir haben am Tisch **4 Spieler**: Julian, Mathis, Jona und Lars. Jeder Spieler startet mit **20.000 Chips**. Jeder bekommt **2 Karten auf die Hand** und es gibt zusätzlich **5 Gemeinschaftskarten**, die später in der Mitte aufgedeckt werden.
![1. image](./images/1.png)
Die Spieler sitzen in folgender Reihenfolge: Julian, Mathis, Jona und Lars. Einer davon hat den Dealer-Button, der bestimmt, wer die Karten austeilt und von wo die Runde beginnt. Dieser Button wandert nach jeder Runde im Uhrzeigersinn weiter und verändert damit die Position ständig.
Regel: *34 Button Placement and Movement 🟢*
### Blinds (Small Blind & Big Blind)
Bevor die Karten verteilt werden, gibt es zwei Pflicht-Einsätze:
Der Small Blind und der Big Blind. Der Big Blind ist immer doppelt so hoch wie der Small Blind.
![2. image](./images/2.png)
Regel: *32 Dead Button 🟡*
Diese Einsätze sorgen dafür, dass sofort ein Pot entsteht und das Spiel überhaupt beginnt, weil jeder schon “im Spiel” ist.
Danach werden die Karten verteilt: zuerst Small Blind, dann Big Blind und dann im Uhrzeigersinn alle anderen Spieler.
### Erste Setzrunde (Preflop)
Die erste Setzrunde beginnt immer bei dem Spieler links vom Big Blind.
Jetzt muss jeder Spieler entscheiden:
* Fold (aussteigen)
* Call (mitgehen)
* Raise (erhöhen)
Regel: *40 Methods of Betting 🟢*
Regel: *41 Methods of Calling 🟢*
Regel: *42 Methods of Raising 🟢*
Regel: *50 Acting in Turn 🟢*
### Beispiel Preflop
Julian schaut seine Karten an und entscheidet sich direkt für einen Call von **600 Chips**.
![3. image](./images/3.png)
Mathis sieht seine Karten an und merkt, dass sie nicht gut sind, also foldet er und steigt aus.
![4. image](./images/4.png)
Jona ist nun dran und entscheidet sich ebenfalls für einen Call, weil seine Hand spielbar ist.
![5. image](./images/5.png)
Lars schaut seine Karten an, erkennt eine starke Hand und erhöht auf **1200 Chips**.
![6. image](./images/6.png)
Damit verändert sich sofort die Situation: Julian und Jona müssen entscheiden, ob sie diesen Raise bezahlen, selbst erhöhen oder aussteigen.
### Flop (3 Gemeinschaftskarten)
Jetzt werden **3 Gemeinschaftskarten** in die Mitte gelegt. Ab hier verändert sich das Spiel komplett, weil alle Spieler zusätzliche Informationen bekommen.
![7. image](./images/7.png)
Es beginnt eine neue Setzrunde.
Regel: *49 Accepted Action 🟢*
### Beispiel Flop
Lars setzt **1000 Chips** als Erstes. Julian entscheidet sich mitzugehen (Call), weil seine Karten durch die Gemeinschaftskarten stärker geworden sind.
![8. image](./images/8.png)
Jona steigt aus, weil er keine gute Verbindung mehr sieht. Mathis ist bereits raus.
### Turn (4. Karte)
Jetzt kommt die **4. Gemeinschaftskarte**.
Wieder beginnt eine neue Setzrunde.
Lars setzt diesmal **3000 Chips**. Julian bezahlt erneut (Call), weil seine Hand weiterhin gut spielbar ist.
![9. image](./images/9.png)
Regel: *53 Action Out of Turn 🟡*
### River (5. Karte)
Jetzt wird die letzte Gemeinschaftskarte aufgedeckt.
Dies ist die letzte Entscheidung im Spiel.
Lars setzt **5000 Chips**.
![10. image](./images/10.png)
Julian muss jetzt entscheiden: Fold, Call oder Raise auf **10000 Chips**.
Regel: *54 Pot Size Bets 🟡*
### Showdown (Gewinnentscheidung)
Wenn nach der letzten Setzrunde noch zwei Spieler übrig sind, kommt es zum Showdown.
Beide Spieler zeigen ihre Karten offen. Gewonnen hat die **beste 5-Karten-Kombination aus Handkarten und Gemeinschaftskarten**.
![11. image](./images/11.png)
Regel: *12 Cards Speak at Showdown 🟢*
Regel: *16 Face Up for All-Ins 🟢*
Regel: *17 Non All-In Showdowns 🟢*
Wenn Julian den letzten Einsatz bezahlt, werden die Hände verglichen. Wenn er foldet, gewinnt Lars automatisch den gesamten Pot.
### Poker Hand Rankings (Gewichtung)
Die Kartenkombinationen sind klar geordnet von schwach bis extrem stark:
![12. image](./images/12.png)
Je höher die Kombination, desto stärker die Hand und desto wahrscheinlicher der Gewinn.
Julian: 2. Paar:
![13. image](./images/13.png)
Lars: 1. Paar:
![14. image](./images/14.png)
Da zwei Paare in der Rangfolge über einem einzelnen Paar stehen, gewinnt Julian diese Runde.
### Fazit
Poker ist kein Glücksspiel im klassischen Sinn, sondern ein Spiel aus Strategie, Psychologie und Mathematik. Jede Entscheidung von Julian, Mathis, Jona oder Lars verändert die komplette Dynamik am Tisch. Wer die Regeln versteht, versteht nicht nur Karten, sondern auch Menschen und Entscheidungen unter Druck.
Regel: *67 One Player One Hand 🟢*
Regel: *52 Incorrect Bets 🟡*
Regel: *57 Non-Standard Betting 🟡*
## English
The poker table is an incredibly fascinating experiential space where you can learn a great deal: about yourself, about other people, and about questions such as: How do I actually make decisions? How do I handle stress and uncertainty? And how good am I at empathizing with others and correctly assessing situations?
To enter this experiential space, its necessary—like with any game—to first understand the basic rules and game flow.
So lets begin:
We have **4 players** at the table: Julian, Mathis, Jona, and Lars. Each player starts with **20,000 chips**. Each receives **2 hole cards**, and there are **5 community cards** that will later be revealed in the center.
![1. image](./images/1.png)
The players are seated as follows: Julian, Mathis, Jona, and Lars. One of them holds the dealer button, which determines who deals the cards and where the round begins. This button moves clockwise after each hand, constantly changing the positions.
Rule: *34 Button Placement and Movement 🟢*
### Blinds (Small Blind & Big Blind)
Before cards are dealt, there are two mandatory bets:
The Small Blind and the Big Blind. The Big Blind is always double the amount of the Small Blind.
![2. image](./images/2.png)
Rule: *32 Dead Button 🟡*
These forced bets ensure that a pot exists from the start, making the game begin with everyone already involved.
After this, the cards are dealt: first to the Small Blind, then the Big Blind, and then clockwise to all other players.
### First Betting Round (Preflop)
The first betting round always begins with the player to the left of the Big Blind.
Now each player must decide:
* Fold (exit the hand)
* Call (match the current bet)
* Raise (increase the bet)
Rule: *40 Methods of Betting 🟢*
Rule: *41 Methods of Calling 🟢*
Rule: *42 Methods of Raising 🟢*
Rule: *50 Acting in Turn 🟢*
### Preflop Example
Julian looks at his cards and decides to Call for **600 chips**.
![3. image](./images/3.png)
Mathis sees his cards and realizes they arent strong, so he Folds and exits the hand.
![4. image](./images/4.png)
Jona is next and decides to Call as well, because his hand is playable.
![5. image](./images/5.png)
Lars looks at his cards, recognizes a strong hand, and Raises to **1200 chips**.
![6. image](./images/6.png)
This immediately changes the situation: Julian and Jona must now decide whether to call this raise, re-raise, or fold.
### Flop (3 Community Cards)
Now **3 community cards** are placed face-up in the center. From this point, the game changes completely, as all players gain additional information.
![7. image](./images/7.png)
A new betting round begins.
Rule: *49 Accepted Action 🟢*
### Flop Example
Lars bets **1,000 chips** first. Julian decides to Call because his hand has improved with the community cards.
![8. image](./images/8.png)
Jona folds, as he no longer sees a strong connection. Mathis is already out.
### Turn (4th Card)
Now the **4th community card** is revealed.
Another betting round begins.
Lars bets **3,000 chips** this time. Julian calls again, as his hand remains strong.
![9. image](./images/9.png)
Rule: *53 Action Out of Turn 🟡*
### River (5th Card)
Now the final community card is revealed.
This is the last decision point in the hand.
Lars bets **5,000 chips**.
![10. image](./images/10.png)
Julian must now decide: Fold, Call, or even Raise to **10,000 chips**.
Rule: *54 Pot Size Bets 🟡*
### Showdown (Winning Decision)
If two or more players remain after the final betting round, a showdown occurs.
All active players reveal their cards. The winner is the one with the **best 5-card combination using any combination of their hole cards and the community cards**.
![11. image](./images/11.png)
Rule: *12 Cards Speak at Showdown 🟢*
Rule: *16 Face Up for All-Ins 🟢*
Rule: *17 Non All-In Showdowns 🟢*
If Julian calls the final bet, the hands are compared. If he folds, Lars wins the entire pot automatically.
### Poker Hand Rankings (Hierarchy)
The card combinations are clearly ranked—from weakest to strongest:
![12. image](./images/12.png)
The higher the combination, the stronger the hand, and the greater the chance of winning.
Julian: Two Pair:
![13. image](./images/13.png)
Lars: One Pair:
![14. image](./images/14.png)
Since two pair ranks higher than one pair, Julian wins this round.
### Conclusion
Poker is not gambling in the traditional sense, but rather a game of strategy, psychology, and mathematics. Every decision made by Julian, Mathis, Jona, or Lars changes the entire dynamic at the table. Understanding the rules means not only understanding cards, but also people and decision-making under pressure.
File diff suppressed because it is too large Load Diff