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 enum में कोई बदलाव ज़रूरी नहीं था — टीम का डेटा मौजूदा इवेंट्स के वैकल्पिक payload फ़ील्ड पर सवार होकर चलता है (game_started.players[].team, player_eliminated.inheritedBySlot, game_finished.winnerTeam)। चुनी गई टीमें (पैरिटी नहीं) initializeGame में पिरो दी जाती हैं; daemon ऐसे किसी टीम गेम को शुरू करने से इनकार कर देता है जिसका रोस्टर पूरा न हो (team_roster_not_full) या संतुलित न हो (team_not_balanced)। Engine 214 / daemon 82 टेस्ट हरे हैं, और fast-check की समाप्ति प्रॉपर्टी अब 2×2 और 3×3 गेम को अंत तक पहुंचाती है।
