暢玩 2 對 2 與 3 對 3:隊伍模式
與好友組隊,彙集你們的地產,一同取勝——opolyx 現已推出 2×2 與 3×3 的隊伍對局。

通俗版
有些對局有搭檔才更有意思。隊伍模式讓兩方對壘——四人局中 2 對 2,六人局中 3 對 3——這樣你和好友就是為同一種顏色而戰,而不只是為自己。
站在同一邊,會徹底改變你們攜手遊玩的方式。隊友是盟友而非對手,棋盤也隨之豁然開朗:
- 落在隊友的地產上無需付費——租金只會向另一支隊伍收取。
- 現金和地產可在隊友之間自由轉交——沒有 50% 規則,你可以把陷入困境的搭檔所需的東西直接贈予對方。
- 如果隊友破產,他的全部產業歸你而非銀行——只有當全體成員都出局時,一支隊伍才算淘汰。
- 你們以隊伍為單位取勝:堅持到最後的一方,或在回合上限到達時最富有的一方——而且兩名隊友都能獲得勝利獎勵(XP 和一張卡牌)。
| 隊友之間 | 隊伍規則 |
|---|---|
| 租金 | 落在隊友地產上無需付費 |
| 交易 | 自由轉交——沒有 50% 規則 |
| 破產 | 產業歸你的隊友,而非銀行 |
| 獲勝 | 堅持到最後的一方;兩人都獲獎勵 |
協調你們的交易,相互掩護,齊心協力把對手隊伍趕下棋盤。這還是你熟悉的那個 opolyx——只是身邊多了一位並肩作戰的搭檔。
技術細節
隊伍模式沿用 Classic 規則集,只新增了一個針對每位玩家的概念:隊伍。引擎新增了一個 PlayerState.team 欄位,以及一組供規則讀取的選擇器(sameTeam、teamOf、aliveTeams、teamNetWorth):computeRent 對隊友免收租金,doProposeTrade 在隊友之間跳過 50% 規則,淘汰時則將產業轉交給座位號最小的存活隊友,而非銀行。結束條件按隊伍評定——堅持到最後的隊伍,或回合上限到達時最富有的隊伍。
由三個遷移共同實現。Postgres 禁止在新增新 enum 值的同一事務中使用該值,因此 0028 單獨提交隊伍的 game_mode;隨後 0029 讓 create_game 接受它(並附帶完整且均衡的名單檢查),併為多勝者獎勵新增 award_game_winners;0030 則新增可選擇的 team 列及其等候室 RPC。
-- 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 $$ ... $$;無需改動 event_kind 列舉——隊伍資料搭載在現有事件的可選 payload 欄位上(game_started.players[].team、player_eliminated.inheritedBySlot、game_finished.winnerTeam)。所選隊伍(而非奇偶配對)會被串入 initializeGame;若隊伍對局的名單不完整(team_roster_not_full)或不均衡(team_not_balanced),daemon 會拒絕開局。Engine 214 / daemon 82 測試全部通過,fast-check 的終止性質現在也能驅動 2×2 與 3×3 對局走向終局。
