畅玩 2 对 2 与 3 对 3:队伍模式
与好友组队,汇集你们的地产,一同取胜——opolyx 现已推出 2×2 与 3×3 的队伍对局。

通俗版
有些对局有搭档才更有意思。队伍模式让两方对垒——四人局中 2 对 2,六人局中 3 对 3——这样你和好友就是为同一种颜色而战,而不只是为自己。
站在同一边,会彻底改变你们携手游玩的方式。队友是盟友而非对手,棋盘也随之豁然开朗:
- 落在队友的地产上无需付费——租金只会向另一支队伍收取。
- 现金和地产可在队友之间自由转交——没有 50% 规则,你可以把陷入困境的搭档所需的东西直接赠予对方。
- 如果队友破产,他的全部产业归你而非银行——只有当全体成员都出局时,一支队伍才算淘汰。
- 你们以队伍为单位取胜:坚持到最后的一方,或在回合上限到达时最富有的一方——而且两名队友都能获得胜利奖励(XP 和一张卡牌)。
协调你们的交易,相互掩护,齐心协力把对手队伍赶下棋盘。这还是你熟悉的那个 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 对局走向终局。
