अब opolyx की आवाज़ है: ध्वनि प्रभाव और म्यूट बटन
गेम पूरी तरह ख़ामोश था। अब पासे, गोटियाँ, पैसा, नीलामी की टिक-टिक और जीत की धुन — सबकी आवाज़ है, और एक बटन से सब बंद।

आसान शब्दों में
इस अपडेट से पहले opolyx कोई आवाज़ नहीं करता था। शांत गेम नहीं — सचमुच ख़ामोश: पूरे ऐप में कहीं कोई ऑडियो था ही नहीं। छक्का आना और दिवालिया होना बिलकुल एक जैसा महसूस होता था।
अब वे पल सुनाई देते हैं जो मायने रखते हैं। कुछ भी लूप में नहीं चलता, कुछ भी पृष्ठभूमि में नहीं बजता — हर आवाज़ बोर्ड पर अभी-अभी हुई किसी घटना से जुड़ी है:
- जिस क्षण आप "फेंकें" दबाते हैं, पासों की आवाज़ — और फिर जब वे अपने अंकों पर ठहरते हैं;
- आपकी गोटी, बोर्ड पर घूमते हुए हर खाने पर एक क़दम;
- हाथ बदलता पैसा: किराया, कर, कोई फ़ील्ड ख़रीदना, निर्माण;
- आपकी बोली के आख़िरी पाँच सेकंड में नीलामी की टिक-टिक;
- जैकपॉट का चक्का, और गेम जीतने या हारने पर बजने वाली धुन।
ध्वनि डिफ़ॉल्ट रूप से चालू है। यदि आप चुपचाप खेलना पसंद करते हैं, तो शीर्ष पट्टी में स्पीकर बटन एक क्लिक में सब बंद कर देता है, और आपका चुनाव उस डिवाइस पर याद रखा जाता है — यह पहली सेटिंग है जो opolyx ने कभी आपके लिए सहेजी है।
YouTube, Instagram और TikTok पर हम जो हाइलाइट क्लिप डालते हैं, वे भी ख़ामोश थीं। अब उनमें गेम जैसी ही आवाज़ें हैं, इसलिए क्लिप में दिवालियापन वैसा ही सुनाई देता है जैसा मेज़ पर।
तकनीकी जानकारी
प्लेबैक हर ध्वनि के लिए अलग ऑडियो एलिमेंट के बजाय Web Audio पर आधारित है। डिकोड किए गए बफ़र पॉलीफ़ोनी देते हैं (गोटी के क़दम के ऊपर पासों का गिरना), सैंपल-स्तर पर सटीक शेड्यूलिंग देते हैं, और मौजूदा कंटेंट-सुरक्षा नीति के भीतर रहते हैं — हर फ़ाइल हमारे अपने डोमेन से सर्व होती है।
कौन-सी घटना पर कौन-सी ध्वनि बजेगी, यह इंजन के इवेंट यूनियन पर एक exhaustive switch तय करता है, इसलिए कोई नया डोमेन इवेंट जोड़ने पर टाइपचेक तब तक विफल रहता है जब तक कोई यह तय न कर ले कि उसकी आवाज़ होनी चाहिए या नहीं:
// lib/sound/events.ts — exhaustive over DomainEvent['kind']
export function soundForEvent(e: DomainEvent, viewerSlot: number | null): SoundId | null {
switch (e.kind) {
case 'rent_paid':
return e.payload.amount >= BIG_RENT ? 'cash-big' : 'cash';
case 'player_bankrupt':
return 'bankrupt';
// …every kind handled; no default, so a new event is a type error
}
}चार ध्वनियाँ घटना-आधारित नहीं, समय-आधारित हैं, क्योंकि सर्वर की घटना वह क्षण नहीं होती जब खिलाड़ी कार्रवाई को महसूस करता है। पासा फेंकने की आवाज़ क्लिक के समय (0 ms) बजती है, गिरने की आवाज़ 3D पासों के ठहरने पर, क़दम की आवाज़ गोटी की हॉप-क़तार के हर खाने पर, और जीत/हार की धुन परिणाम स्क्रीन के माउंट होने पर।
| ध्वनि | कब बजती है |
|---|---|
| dice-roll | क्लिक पर, सर्वर की प्रतिक्रिया पर नहीं |
| dice-land | 3D पासों के ठहरने वाले एनिमेशन के अंत पर |
| move-step | गोटी की हॉप-क़तार के हर खाने पर |
| tick | आपके अपने टर्न या बोली के आख़िरी 5 सेकंड में |
| victory / defeat | परिणाम स्क्रीन के माउंट होने पर |
सभी 26 फ़ाइलें CC0 हैं — ट्रिम की गईं, −3 dBFS पीक पर नॉर्मलाइज़ की गईं और मोनो MP3 में एन्कोड की गईं; Ogg नहीं बल्कि MP3, क्योंकि iOS का Safari Ogg Vorbis डिकोड नहीं कर सकता। बिल्ड स्क्रिप्ट एन्कोडिंग के बाद पीक की जाँच करती है: पहले का एक संस्करण सही अवधि और सही आकार वाली, पर बिलकुल न सुनाई देने वाली फ़ाइलें भेज चुका था, क्योंकि एक फ़ेड फ़िल्टर ने अपनी विंडो के बाद सब कुछ ख़ामोश कर दिया था।
