Chơi 2 đấu 2 và 3 đấu 3: chế độ đội
Lập đội cùng một người bạn, gộp chung tài sản và giành chiến thắng cùng nhau — opolyx giờ đã có các ván đấu theo đội 2×2 và 3×3.

Nói đơn giản
Có những ván chơi thú vị hơn khi có người đồng hành. Chế độ đội đưa hai phe đối đầu nhau — 2 đấu 2 trong ván bốn người hoặc 3 đấu 3 trong ván sáu người — để bạn và bạn bè chơi vì một màu, chứ không chỉ vì riêng mình.
Đứng cùng một phe thay đổi hoàn toàn cách các bạn chơi cùng nhau. Đồng đội của bạn là đồng minh chứ không phải đối thủ, nên bàn cờ rộng mở ra:
- Dừng trên tài sản của đồng đội thì bạn chẳng phải trả gì — tiền thuê chỉ luôn được thu từ đội kia.
- Chuyển tiền mặt và tài sản giữa các đồng đội thoải mái — không có quy tắc 50%, nên bạn có thể tặng thẳng cho người đồng đội đang gặp khó những gì họ cần.
- Nếu một đồng đội phá sản, toàn bộ cơ nghiệp của họ về tay bạn chứ không về ngân hàng — một đội chỉ bị loại khi mọi thành viên đều đã ra đi.
- Các bạn thắng với tư cách một đội: phe trụ lại sau cùng, hoặc phe giàu nhất khi chạm giới hạn vòng — và cả hai đồng đội đều nhận phần thưởng chiến thắng (XP và một thẻ).
Hãy phối hợp các cuộc trao đổi, yểm trợ lẫn nhau và cùng nhau ép đội đối thủ ra khỏi bàn cờ. Vẫn là opolyx mà bạn quen thuộc — chỉ là có thêm một người đồng hành bên cạnh.
Cho người thích chi tiết kỹ thuật
Chế độ đội chính là bộ quy tắc Classic với một khái niệm mới cho mỗi người chơi: đội. Engine bổ sung trường PlayerState.team cùng một nhúm bộ chọn (sameTeam, teamOf, aliveTeams, teamNetWorth) mà các quy tắc đọc đến: computeRent miễn cho đồng đội, doProposeTrade bỏ qua quy tắc 50% giữa họ, và việc bị loại sẽ chuyển cơ nghiệp cho người đồng đội còn sống có ô thấp nhất thay vì cho ngân hàng. Điều kiện kết thúc được xét theo từng đội — đội trụ lại sau cùng, hoặc đội giàu nhất khi chạm trần số vòng.
Ba lần migration hiện thực nó. Postgres cấm dùng một giá trị enum mới trong chính giao dịch đã thêm nó, nên 0028 commit riêng game_mode của đội; sau đó 0029 cho phép create_game chấp nhận nó (kèm kiểm tra đội hình đầy đủ và cân bằng) và bổ sung award_game_winners cho phần thưởng nhiều người thắng; còn 0030 thêm cột team có thể chọn cùng RPC phòng chờ của nó.
-- 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 $$ ... $$;Không cần thay đổi enum event_kind — dữ liệu đội đi nhờ trên các trường payload tùy chọn của những sự kiện đã có (game_started.players[].team, player_eliminated.inheritedBySlot, game_finished.winnerTeam). Các đội đã chọn (chứ không phải tính chẵn lẻ) được luồn vào initializeGame; daemon từ chối khởi động một ván đội mà đội hình chưa đầy (team_roster_not_full) hoặc chưa cân bằng (team_not_balanced). Các bài kiểm thử Engine 214 / daemon 82 đều xanh, và thuộc tính kết thúc của fast-check giờ đưa các ván 2×2 và 3×3 đi đến hồi kết.
