Καθορισμός Ικανοτήτων
Μια ικανότητα είναι μια λειτουργία της Javascript που λαμβάνει σαν μοναδική παράμετρο τη μονάδα που έχει την ικανότητα και επιστρέφει ένα αντικείμενο Javascript:
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).',
};
}
Και τέλος, πρέπει να γράψουμε τη λογική για τη δυνατότητα στη συνάρτηση perform
. Εδώ, μπορούμε να χρησιμοποιήσουμε οποιαδήποτε από τις μεθόδους που βρίσκονται στο 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}`);
}
},
};
}
Οι ικανότητες προστίθενται στις μονάδες κάτω από ένα κλειδί στο αντικείμενο abilities
. Ας προσθέσουμε την ικανότητα περπατήματος στον Πολεμιστή κάτω από το κλειδί walk
(γιατί θέλουμε τον παίκτη να το εφαρμόσει, καλώντας 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`);
}
},
};
}
Στη συνέχεια, ας ορίσουμε την ικανότητα αίσθησης. Σε αντίθεση με την επίθεση, η αίσθηση είναι μία έννοια; επομένως μπορούμε να παραλείψουμε το κλειδί action
:
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,
},
},
},
};
Δεν προσθέτουμε την ικανότητα περπατήματος στο δεύτερο επίπεδο γιατί ο Πολεμιστής το έχει ήδη μάθει στο πρώτο επίπεδο.
Όλα μια χαρά, αλλά ο Πολεμιστής δεν κρατά το σπαθί από Βαλυριανό ατσάλι για το τίποτα. Ας προσθέσουμε έναν εχθρό για να πολεμήσει μαζί του!