صار لِـ opolyx صوت: مؤثرات صوتية وزر كتم
كانت اللعبة صامتة تمامًا. أما الآن فللنرد والقطع والنقود ومؤقت المزاد ونغمة الفوز صوت — مع زر واحد لإيقاف كل ذلك.

بكلمات بسيطة
حتى هذا التحديث لم تكن opolyx تصدر أي صوت. لم تكن لعبة هادئة، بل صامتة حرفيًا: لم يكن في التطبيق أي صوت على الإطلاق. كان رمي ستة والإفلاس يبدوان متماثلين تمامًا.
أما الآن فاللحظات المهمة مسموعة. لا شيء يتكرر في حلقة، ولا شيء يعمل في الخلفية — كل صوت مرتبط بشيء حدث للتو على اللوحة:
- النرد لحظة ضغطك على "ارمِ" — ثم مرة أخرى حين يستقر على أرقامه؛
- قطعتك، خطوة لكل خانة أثناء تنقلها حول اللوحة؛
- انتقال المال: الإيجار والضريبة وشراء ميدان والبناء؛
- عدّاد المزاد وهو يمرّ بالثواني الخمس الأخيرة من مزايدتك؛
- عجلة الجاكبوت، ونغمة الفوز أو الخسارة في نهاية اللعبة.
الصوت مفعّل افتراضيًا. وإذا فضّلت اللعب بصمت، فزر السماعة في الشريط العلوي يوقف كل شيء بنقرة واحدة، ويُحفظ اختيارك على هذا الجهاز — وهذا أول إعداد تحتفظ به opolyx لك على الإطلاق.
كانت المقاطع التي ننشرها على YouTube وInstagram وTikTok صامتة أيضًا. وهي الآن تحمل الإشارات الصوتية نفسها الموجودة في اللعبة، فيبدو الإفلاس في المقطع كما يبدو على الطاولة.
للمهتمين بالتفاصيل التقنية
يعتمد التشغيل على Web Audio بدلًا من عنصر صوت لكل إشارة. فالمخازن المفكوكة تتيح تعدد الأصوات (هبوط نرد فوق خطوة حركة)، وجدولة دقيقة على مستوى العيّنة، وتبقى ضمن سياسة أمان المحتوى القائمة — إذ يُقدَّم كل ملف من نطاقنا نفسه.
أما تحديد الصوت المناسب لكل حدث فيتم عبر تفريع شامل على اتحاد أحداث المحرّك، بحيث تفشل مطابقة الأنواع عند إضافة حدث جديد إلى أن يقرّر أحدهم ما إذا كان له صوت:
// 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
}
}أربع إشارات مرتبطة بالتوقيت لا بالحدث، لأن وصول حدث الخادم ليس اللحظة التي يشعر فيها اللاعب بالفعل. فصوت الرمي ينطلق عند الضغط (عند الصفر)، وصوت الهبوط عند انتهاء استقرار النرد ثلاثي الأبعاد، وصوت الخطوة مع كل خانة في طابور تنقّل القطعة، وصوتا الفوز والخسارة عند ظهور شاشة النتيجة.
| الإشارة | تنطلق عند |
|---|---|
| dice-roll | الضغط، لا استجابة الخادم |
| dice-land | انتهاء حركة استقرار النرد ثلاثي الأبعاد |
| move-step | كل خانة في طابور تنقّل القطعة |
| tick | آخر 5 ثوانٍ من دورك أو مزايدتك |
| victory / defeat | ظهور شاشة النتيجة |
الملفات الـ26 جميعها برخصة CC0، مقصوصة، ومعايَرة إلى ذروة −3 dBFS، ومُرمَّزة بصيغة MP3 أحادية القناة — MP3 لا Ogg لأن Safari على iOS لا يستطيع فك ترميز Ogg Vorbis. ويتحقق سكربت البناء من الذروة بعد الترميز: فقد شحنت نسخة سابقة ملفات بالمدة الصحيحة والحجم الصحيح ومن دون أي صوت مسموع، لأن مرشّح تلاشٍ أسكت كل ما بعد نافذته.
