بطاقاتك القابلة للجمع تفعل شيئاً أخيراً: تعزيزات الإيجار
البطاقات العقارية التي تربحها تعزّز الآن إيجارك أنت على تلك الخلية — كلما ندرت البطاقة زاد التعزيز، بحدٍّ أقصى +30%.

بكلمات بسيطة
الفوز بلعبة يُسقِط بطاقة عقارية قابلة للجمع في مخزونك. حتى الآن كانت تلك البطاقة زينةً محضة. أما الآن فهي تعمل لصالحك: امتلاك بطاقة يعزّز الإيجار الذي تجنيه على تلك الخلية بالذات طوال اللعبة.
يتناسب التعزيز مع الندرة، ولا تُحتسب إلا أندر بطاقة تمتلكها على خلية ما — التعزيزات لا تتراكم أبداً. والإجمالي محدود بـ +30%، فلا تنفرد بطاقة واحدة باللعبة أبداً.
للمهتمين بالتفاصيل التقنية
وحدة محرّك جديدة cards.ts هي المصدر الوحيد للحقيقة بشأن سُلّم الندرة (عادية 5 / نادرة 10 / ملحمية 20 / أسطورية 30، بحدٍّ أقصى صارم عند 30). اكتسبت GameState خريطة لكل خانة من الخلية ← نسبة التعزيز؛ ويطبّق computeRent وrentForDisplay القيمة round(rent × (1 + pct/100)) بعد مضاعفة الاحتكار غير المطوَّر ×2، فيتبادل المُضاعِفان الترتيب وتحتفظ الألعاب الافتراضية الخالية من البطاقات بإيجارات صحيحة متطابقة بايتاً ببايت.
// cards.ts — the single source of truth (web catalog.ts re-exports it)
export const CARD_RARITY_BOOST = { common: 5, rare: 10, epic: 20, legendary: 30 };
export const MAX_CARD_BOOST_PCT = 30; // total cap; boosts never stackيقرأ الخادم مخزون كل لاعب جالس مرةً واحدة عند بدء اللعبة (user_inventory ⋈ inventory_items)، ويحتفظ بأعلى ندرة لكل خلية، ويدمج خريطة كل خانة في الحالة الأولية — فتبقى اللعبة كلها قابلة لإعادة التشغيل بحتمية دون أي قراءة لقاعدة البيانات أثناء اللعب. الروبوتات لا تملك أي بطاقات، وتُحذف الخريطة بالكامل عندما لا يملك أحد على الطاولة أي بطاقة.
شُحنت المرحلة 2 بالشيفرة فقط — تعيش التعزيزات في engine_state بصيغة JSON. ثم صنّف الترحيل اللاحق 0032 البطاقات الأصلية الـ28 حسب مجموعة الخلايا وأضاف مُنتقياً موزوناً (70 / 20 / 8 / 2 عبر عادية / نادرة / ملحمية / أسطورية) بحيث تُسقِط الانتصارات فعلاً بطاقات أندر مع الوقت بدلاً من العادية فقط.
