سجل المباراة يتوقّف عن سرد كل شيء
كانت رمية نرد واحدة تطبع خمسة أسطر، اثنان منها يسمّيان الخانة نفسها. صار السجل يُقرأ كتعليق لا كمحضر — ودون حذف أي شيء.
بكلمات بسيطة
كانت اللوحة الجانبية تدوّن كل شيء تفعله اللعبة. الرمية العادية كانت تنتج خمسة أسطر منفصلة — رمى، وتحرّك، وحطّ، وأنهى دوره، وغالبًا سطرًا إضافيًا — اثنان منها يسمّيان الخانة نفسها. اضرب ذلك في أربعة لاعبين وثلاثين جولة، فيصير السجل جدارًا تتوقّف عن قراءته، وهذه خسارة لأن السطرين أو الثلاثة التي تهم فعلًا كانت هناك في مكان ما.
الآن الرمية وكل ما نتج عنها سطر واحد. الحطّ، وإنهاء الدور، وإعلان دين قبل سداده، ورفض الشراء قبل افتتاح المزاد — لم يعد أي منها يُقال بصوت عالٍ، لأن اللوحة أو السطر التالي يقوله أصلًا. سلسلة من عمليات البناء على حقل واحد تنطوي في سطر واحد، والمزاد بلا منافس يكفّ عن إعلان المبلغ نفسه مرتين، وفي النمط السريع لا يتكلّم عدّاد الرهن إلا حين تتبقّى جولتان للتصرّف.
ورسائلك في الدردشة لم تعد تُدفَع خارج الشاشة. كانت اللوحة تحتفظ بنافذة تاريخ واحدة لكل شيء، فكانت لوحة مزدحمة قادرة بهدوء على طرد ما كتبه إنسان. صار النشاط والدردشة يُحفظان منفصلين، ولا قدر من النرد يستطيع دفن رسالة كتبها أحدهم فعلًا.
للمهتمين بالتفاصيل التقنية
لم تكن التصفية عند المصدر خيارًا أصلًا. إعادة تشغيل مباراة تعني طيّ سجل الأحداث الكامل ليعود حالة، وهكذا تعمل إعادة تحميل الصفحة والمتفرّج وشاشة الإعادة ومولّد المقاطع. احذف حدثًا لتجميل السجل، وستفسد هذه كلها. لذلك يبقى السجل كاملًا ويقتصر الاختصار على وقت العرض، في بانٍ واحد مشترك تستخدمه اللوحة الحية وشاشة المتفرّج والإعادات والمقاطع والنسخة دون اتصال.
ما يفعله كل حدث بالسجل هو مبدّل شامل على أنواع أحداث المحرّك، ما يعني أن نوعًا جديدًا من الأحداث لا يُترجَم حتى يقرّر أحدهم كيف ينبغي أن يُقرأ:
// lib/game/feedDigest.ts — an exhaustive switch over every engine event
case 'dice_rolled':
return 'move'; // the roll opens a line
case 'moved':
case 'passed_start':
case 'jail_attempt_failed':
return 'absorb'; // …and what it caused folds into that line
case 'landed': // names the cell 'moved' just named
case 'turn_ended': // the board already shows whose turn it is (14% of events)
case 'payment_due': // the intent; 'debt_paid' is the settlement, with the amount
case 'buy_declined': // always followed by 'auction_started', which says it better
case 'auction_passed':// carries no information, and outnumbers real bids 2:1
return 'hidden';ظهر عيبان لم يكن أي اختبار ليجدهما، لأن كليهما يتعلّق بكيفية قراءة المخرجات لا بمحتواها. المزاد بلا منافس كان يعلن الرقم نفسه مرتين — «P1 زايد 2600k» ثم «P1 فاز بها بـ 2600k» — فصارت المزايدة الختامية تُبتلَع، وهي وحدها، كي تبقى حرب المزايدة الحقيقية مقروءة كمنافسة. وحدث يقع في منتصف الرمية كان ينهي كل سطر حركة قبل أوانه إلى أن تعلّم البانِي أن يتخطّاه.
