تحديد القدرات
القدرة هي دالة جافا سكريبت التي بدورها تتلقى الوحدة التي تمتلك القدرة كمتغير وحيد فقط وتقوم بإرجاع نص جافا سكريبت البرمجي:
function walk(unit) {
return {
// Ability definition.
};
}
القدرة على المشي هي حركة، لهذا أولاً و قبل كل شئ دعونا نشير لذالك:
function walk(unit) {
return {
action: true,
};
}
ثم يتوجب علينا كتابة وصف للقدرة بحيث يعرف اللاعب ماذا يفعل:
function walk(unit) {
return {
action: true,
description: 'Move one space in the given direction (forward by default).',
};
}
وأخيراً وليس أخراً، نحن بحاجة إلى كتابة منطق القدرة في دالةأداء المهمة
. هنا، يمكننا استخدام أي من الطرق في واجهة برمجة تطبيقات (API) صانع الوحدات. لنفعل ذالك:
function walk(unit) {
return {
action: true,
description: 'Move one space in the given direction (forward by default).',
perform(direction = 'forward') {
const space = unit.getSpaceAt(direction);
if (space.isEmpty()) {
unit.move(direction);
unit.log(`walks ${direction}`);
} else {
unit.log(`walks ${direction} and bumps into ${space}`);
}
},
};
}
القدرات تضاف إلى الوحدات تحت المفتاح في كائنالقدرات
. دعونا نضيف القدرة على المشي للمحارب تحت مفتاح المشي
(لأننا نريد من اللاعب أن يطلبه من خلال استدعاء) warrior.walk()
:
const Level1 = {
description:
"You've entered the ancient castle of Eastwatch to escape from a blizzard. But it's deadly cold inside too.",
tip:
"Call `warrior.walk()` to walk forward in the Player's `playTurn` method.",
timeBonus: 15,
aceScore: 10,
floor: {
size: {
width: 8,
height: 1,
},
stairs: {
x: 7,
y: 0,
},
warrior: {
character: '@',
maxHealth: 20,
position: {
x: 0,
y: 0,
facing: 'east',
},
abilities: {
walk: walk,
},
},
},
};
للمستوى الثاني، يتوجب علينا إضافة اثنين من القدرات الأخرى: الهجوم والشعور.
أولاً، دعونا نحدد القدرة على الهجوم:
function valyrianSteelSwordAttack(unit) {
return {
action: true,
description:
'Attack a unit in the given direction (forward by default) with your Valyrian steel sword, dealing 5 HP of damage.',
perform(direction = 'forward') {
const receiver = unit.getSpaceAt(direction).getUnit();
if (receiver) {
unit.log(`attacks ${direction} and hits ${receiver}`);
unit.damage(receiver, 5);
} else {
unit.log(`attacks ${direction} and hits nothing`);
}
},
};
}
ثانياً/ دعونا نحدد القدرة على الشعور. خلاف للهجوم، الشعور هو إحساس، لهذا يمكننا حذف مفتاحالفعل
:
function feel(unit) {
return {
description:
'Return the adjacent space in the given direction (forward by default).',
perform(direction = 'forward') {
return unit.getSensedSpaceAt(direction);
},
};
}
هام: عند إعادة واحدة أو عدة أحياز من الحواس، استخدم
unit.getSensedSpaceAt()
بدلاً منunit.getSpaceAt()
. السابق يقوم بإرجاع الفضاء الذي تعرض فيه واجهة برمجة التطبيقات (API) لـحيز اللاعب، حيث يعرض هذا الأخير واجهة برمجة التطبيقات (API) الخاصة بـ مشكل الحيز و المقصود أن يستخدم داخلياً، مثل القدرة على الهجوم.
و أخيراً، دعونا نضيفهم لمحارب المستوى الثاني:
const Level2 = {
description:
'The cold became more intense. In the distance, you see a pair of deep and blue eyes, a blue that burns like ice.',
tip:
"Use `warrior.feel().isEmpty()` to see if there's anything in front of you, and `warrior.attack()` to fight it. Remember, you can only do one action per turn.",
clue:
'Add an if/else condition using `warrior.feel().isEmpty()` to decide whether to attack or walk.',
timeBonus: 20,
aceScore: 26,
floor: {
size: {
width: 8,
height: 1,
},
stairs: {
x: 7,
y: 0,
},
warrior: {
character: '@',
maxHealth: 20,
position: {
x: 0,
y: 0,
facing: 'east',
},
abilities: {
attack: valyrianSteelSwordAttack,
feel: feel,
},
},
},
};
لا يمكننا إضافة القدرة على المشي مرة أخرى في المستوى الثاني لأن المحارب لأن المحارب تعلم ذالك في المستوى الأول.
هذا جيد جداً، لكن المحارب لا يمسك بسيف فاليريان الصلب من أجل لا شئ. دعونا نضيف عدو له لكي يقاتله!