تعريف الوحدات
الوحدة هي كائن جافا سكريبت:
const WhiteWalker = {
// Unit definition.
};
دعونا نبدأ بإضافة اسم الوحدة:
const WhiteWalker = {
name: 'White Walker',
};
لم نضف اسم للمحارب، لأن اللاعب يختاره بنفسه أثناء اللعب.
تمامًا مثل المحارب، تحتاج الوحدات الأخرى أيضًا إلى شخصية وقيمة صحية قصوى:
const WhiteWalker = {
name: 'White Walker',
character: 'w',
maxHealth: 12,
};
دعونا نحدد قدرة الهجوم الجديدة:
function iceCrystalSwordAttack(unit) {
return {
action: true,
description:
'Attack a unit in the given direction (forward by default) with your ice blade, dealing 3 HP of damage.',
perform(direction = 'forward') {
const receiver = unit.getSpaceAt(direction).getUnit();
if (receiver) {
unit.log(`attacks ${direction} and hits ${receiver}`);
unit.damage(receiver, 3);
} else {
unit.log(`attacks ${direction} and hits nothing`);
}
},
};
}
و إضافتها إلى السائر الأبيض. دعونا أيضًا نضيف نفس قدرة الشعور التي قمنا بتحديدها:
const WhiteWalker = {
name: 'White Walker',
character: 'w',
maxHealth: 12,
abilities: {
attack: iceCrystalSwordAttack,
feel: feel,
},
};
أخيراً، يجب علينا تحديد الذكاء الصناعي الخاص بالسائر الأبيض خاصتنا. هذا الذكاء الصناعي سيكون بدائي جداً: السائر الأبيض سوف يبدء دوره من خلال الشعور بالبحث عن العدو (المحارب) في كل اتجاه. إذا وجده في أي إتجاه، سيقوم بمهاجمته في ذالك الاتجاه. دعونا نكتب هذا المنطق في دالةplayTurn
:
const WhiteWalker = {
name: 'White Walker',
character: 'w',
maxHealth: 12,
abilities: {
attack: iceCrystalSwordAttack,
feel: feel,
},
playTurn(whiteWalker) {
const enemyDirection = ['forward', 'right', 'backward', 'left'].find(
direction => {
const unit = whiteWalker.feel(direction).getUnit();
return unit && unit.isEnemy();
},
);
if (enemyDirection) {
whiteWalker.attack(enemyDirection);
}
},
};
لم نقم بكتابة الذكاء الصناعي للمحارب، لأنه قد تم اختياره من طرف اللاعب أثناء اللعب.
الآن علينا إضافة السائر الأبيض إلى المستوى الثاني. الوحدات الأخرى والمحارب قم تم إضافتهم إلى وحدات
ترتيب الأرضية:
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,
},
},
units: [
{
...WhiteWalker,
position: {
x: 4,
y: 0,
facing: 'west',
},
},
],
},
};
هنا، نستخدم خصائص الانتشار لدمج تعريف الوحدة مع موضعها في الأرضية.
تهانينا! لقد قمت بإنشاء برجك الأولى. ففي هذه المرحلة، يعد البرج قابل للعب بشكل تام، لكن يمكن إعادة بناء بعض التعليمات البرمجية الخاصة به.