مستواك صار له معنى أخيرًا
كل مقعد على الطاولة صار يكسب نقاط خبرة، وأول ارتقاء في المستوى يكلّف 60 نقطة بدل أسبوعين من اللعب، والمستويات تمنح رتبة وبطاقات قابلة للجمع.

بكلمات بسيطة
كانت نقاط الخبرة رقمًا لا يفعل شيئًا. لم يكن أي شيء في اللعبة مرهونًا بمستواك، ولم يكن يكسب النقاط إلا الفائز بالمباراة — أي أن نحو ثلثي الجالسين على كل طاولة لعبوا مباراة كاملة وخسروا ورأوا «نقاط المباراة +0»، فلم يكن لديهم سبب ليظنوا أن هذا الرقم يخصّهم.
الآن كل مقعد يكسب. ترتيبك يُدفع عنه، والاحتكارات التي تملكها عند نهاية المباراة تُدفع عنها، والوصول إلى النهاية دون خروج يُدفع عنه. الفوز ما زال هو الأعلى — فالفوز يساوي أكثر من ضعف أفضل نتيجة خاسرة ممكنة — لكن الخسارة الجيدة لم تعد تساوي صفرًا.
| ما الذي فعلته | نقاط الخبرة |
|---|---|
| فزت بالمباراة | +200 |
| المركز الثاني | +50 |
| المركز الثالث | +30 |
| المركز الرابع فما دون | +15 |
| كل احتكار تملكه عند النهاية (حتى 3) | +10 |
| بلغت النهاية دون أن تخرج | +20 |
أُعيد بناء المنحنى حول ذلك. أول ارتقاء يكلّف الآن 60 نقطة، وهو ما تحقّقه مباراة واحدة جيدة — حتى لو خسرتها — بينما كان يستغرق سابقًا نحو عشرة أيام من اللعب. والمستويات التالية تغلو تدريجيًا لا دفعة واحدة.
والمستويات تمنح الآن أمرين. مستواك يحمل رتبة — 7 رتب، من «مؤهّل» حتى «أستاذ» — تظهر إلى جوار اسمك في ملفك وفي لوحة الصدارة. وعبور مستوى محطة يُسقط في مجموعتك بطاقة عقار قابلة للجمع: المستويات 3, 5, 7, 10, 13, 16, 20، ثم كل 5 مستويات بعد ذلك.

للمهتمين بالتفاصيل التقنية
النصف المثير في هذا كان حذف النسخ. القاعدة القديمة — مستوى لكل 500 نقطة — كانت مكتوبة بخط اليد في خمس ترحيلات لقاعدة البيانات وثلاثة ملفات TypeScript، وكانت قد تباعدت بالفعل: بيانات الاختبار كانت تزرع مستوى لا تنتجه أي نسخة من القاعدة. الآن هناك منحنى واحد في ملف واحد، منعكس حرفيًا في قاعدة البيانات:
// packages/game-engine/src/progression.ts — one curve, mirrored exactly in SQL
step(L → L+1) = min(60 + 100·(L−1), 1500)
level 2 3 4 5 10 16 17+
xp 60 220 480 840 4,140 11,400 +1,500 eachالحساب صحيح عمدًا بالأعداد الصحيحة فقط — بلا جذور تربيعية وبلا فاصلة عائمة — كي تتفق SQL مع TypeScript عند كل حد بالضبط لا تقريبًا، ويقارن بينهما اختبار يعمل على قاعدة بيانات حقيقية قيمةً بقيمة. وكلا المنحنيين متزايد، فلم يتجاوز أحد أحدًا في لوحة الصدارة عند إعادة الحساب.
أظهر البناء ثلاثة عيوب كانت حيّة منذ فترة ولم يمسك بها أي اختبار: شريط المستوى في شاشة النتيجة كان يقرأ مكافأة المباراة بدل رصيدك الكلي، فرأى كل لاعب في كل مستوى الشريط نفسه متجمّدًا عند 40%؛ والفوز بمباراة قصيرة كان يُسجَّل خسارةً، فلم تُقدّم تلك الانتصارات أي مهمة فوز؛ وفي نمط الفرق كان الزميل الفائز لا يتقاضى شيئًا ويُسجَّل مهزومًا، لأن أحد الفائزَين لم يكن في المركز الأول بحسب ترتيب الصفوف. أُصلحت الثلاثة، ولكل منها اختبار يفشل بدون الإصلاح.
