2 gegen 2 und 3 gegen 3: der Team-Modus
Tun Sie sich mit einem Freund zusammen, legen Sie Ihre Grundstücke zusammen und gewinnen Sie gemeinsam – opolyx hat jetzt Team-Partien 2×2 und 3×3.

Kurz gesagt
Manche Partien sind mit Partner besser. Der Team-Modus lässt zwei Seiten gegeneinander antreten – zwei gegen zwei in einer Partie zu viert oder drei gegen drei in einer zu sechst –, sodass Sie und Ihre Freunde für eine Farbe spielen und nicht nur für sich selbst.
Auf derselben Seite zu stehen ändert alles daran, wie Sie zusammen spielen. Ihre Teamkameraden sind Verbündete, keine Rivalen, und das Brett öffnet sich:
- Landen Sie auf dem Grundstück eines Teamkameraden, zahlen Sie nichts – Miete wird immer nur dem anderen Team berechnet.
- Reichen Sie Bargeld und Grundstücke frei zwischen Teamkameraden weiter – es gibt keine 50-%-Regel, Sie können einem schwächelnden Partner also einfach schenken, was er braucht.
- Geht ein Teamkamerad bankrott, fällt sein gesamter Besitz an einen verbliebenen Teamkameraden und nicht an die Bank – ein Team ist erst raus, wenn jedes Mitglied weg ist.
- Sie gewinnen als Team: die letzte verbliebene Seite oder die reichste Seite beim Erreichen der Rundenobergrenze – und jedes Teammitglied bekommt die Siegprämie (XP und eine Karte).
| Zwischen Teamkameraden | Teamregel |
|---|---|
| Miete | Auf dem Grundstück eines Teamkameraden zahlen Sie nichts |
| Handel | Freie Übertragung – keine 50-%-Regel |
| Bankrott | Der Besitz geht an Ihren Teamkameraden, nicht an die Bank |
| Sieg | Die letzte verbliebene Seite; das ganze Team bekommt die Prämie |
Stimmen Sie Ihre Handelsangebote ab, decken Sie sich gegenseitig und drängen Sie das gegnerische Team gemeinsam vom Brett. Es ist dasselbe opolyx, das Sie kennen – mit einem Partner an Ihrer Seite.
Für technisch Neugierige
Der Team-Modus ist das Regelwerk von Klassisch mit einem neuen Begriff pro Spieler: einem Team. Die Engine bekommt ein Feld PlayerState.team und eine Handvoll Selektoren (sameTeam, teamOf, aliveTeams, teamNetWorth), die die Regeln lesen: computeRent nimmt Teamkameraden aus, doProposeTrade überspringt zwischen ihnen die 50-%-Regel, und beim Ausscheiden geht der Besitz an den lebenden Teamkameraden mit dem niedrigsten Platz statt an die Bank. Die Endbedingungen werden pro Team ausgewertet – letztes verbliebenes Team oder reichstes Team bei Erreichen der Rundenobergrenze.
Drei Migrationen bringen das an Land. Postgres verbietet es, einen neuen Enum-Wert in derselben Transaktion zu benutzen, die ihn hinzufügt – 0028 committet den Modus team also für sich allein; 0029 lässt create_game ihn dann zu (mit einer Prüfung auf vollständige und gleich starke Besetzung) und ergänzt award_game_winners für die Belohnung mehrerer Sieger; 0030 fügt die wählbare Spalte team und ihre Lobby-RPC hinzu.
-- 0028_team_mode_enum.sql — its own migration (see above)
alter type game_mode add value 'team';
-- 0030_team_picker.sql — pickable side; NULL = slot-parity default (slot % 2)
alter table game_players
add column team smallint check (team is null or team in (0, 1));
-- SECURITY DEFINER lobby write (RLS has no user write on game_players):
-- a player sets their own seat; the creator may set any seat (to arrange bots).
create function set_player_team(p_game uuid, p_slot int, p_team smallint)
returns void language plpgsql security definer as $$ ... $$;Eine Änderung am Enum event_kind war nicht nötig – Teamdaten reisen in optionalen Nutzdatenfeldern bestehender Ereignisse mit (game_started.players[].team, player_eliminated.inheritedBySlot, game_finished.winnerTeam). Gewählte Teams (nicht die Platzparität) werden an initializeGame durchgereicht; der Daemon verweigert den Start einer Team-Partie, deren Besetzung nicht voll (team_roster_not_full) oder nicht ausgeglichen (team_not_balanced) ist. Engine 214 / Daemon 82 Tests grün, und die fast-check-Terminierungseigenschaft treibt jetzt auch Partien zu zweit und zu dritt pro Seite bis zum Ende.
