الدرس 9 من 10
حساب الضرر
- 14 دقيقة
- 6 فحوص
- 3 تلميحات
- إلى المطلوب
هدف الدرس
الدرع والضربة الحرجة والموت مرّة واحدة
الشرح
تمرّ كل ضربة في لعبة قتال بالخطوات نفسها، فتبدأ بقوّة المهاجم، ثم احتمال ضربة حرجة (critical hit) تضاعف هذه القوّة، ثم يُطرح منها درع الهدف. وإن نسيت أن الدرع قد يكون أكبر من القوّة حصلت على ضرر سالب، فتشفي الضربةُ من أصابته.
ولا تستدعي الدالة math.random بنفسها، بل يصلها مصدر الحظّ في المُعامل rng، فتمرّر في اللعبة math.random نفسها، وتمرّر في الفحص دالة تُرجع القيمة التي تختارها، فتختبر الضربة الحرجة وغيرها بنتيجة لا تتغيّر. وتقع الضربة الحرجة حين يكون rng() < critChance، فالاحتمال 0 لا يعطي ضربة حرجة أبدًا، والاحتمال 1 يعطيها دائمًا.
وانتبه عند الموت، فالسطر if target.hp <= 0 then onDeath(target) end يُطلق الموت مع كل ضربة تصيب الجثّة، فتسقط الغنيمة مرّتين ويُحسب القتل مرّتين، وتستطيع أن تشغّل الكود لترى ذلك. فالموت انتقال من حيّ إلى ميّت يحدث مرّة واحدة فقط. والصحّة محصورة بين 0 وmaxHp، فلا تنزل تحت الصفر، ولا يرفعها العلاج فوق الحدّ الأعلى.
المطلوب
أصلح rollDamage(attacker, target, rng) لتُرجع الضرر ومعه true أو false بحسب وقوع الضربة الحرجة، على أن تضاعف الضربة الحرجة power قبل طرح armor، وألّا يقلّ الضرر عن صفر. وأصلح changeHp(target, delta, onDeath) لتضيف delta (وهو سالب عند الضرر)، ثم تحصر الصحّة بين 0 وmaxHp، وتستدعي onDeath(target) مرّة واحدة حين تنتقل الصحّة من رقم موجب إلى صفر.
الفحوص
6 فحوص- الدرع يُطرح من القوّة
- الضربة الحرجة تضاعف القوّة قبل طرح الدرع
- الاحتمال 0 لا يعطي حرجة والاحتمال 1 يعطيها دائمًا
- درع أكبر من القوّة لا يعطي ضررًا سالبًا
- الصحّة تبقى بين 0 وmaxHp
- الموت يحدث مرّة واحدة فقط