Définition des capacités
Une capacité est une fonction JavaScript qui reçoit en seul paramètre l'unité qui la possède et retourne un objet JavaScript :
function walk(unit) {
return {
// Ability definition.
};
}
La capacité de marcher étant une action, il faut donc l'indiquer :
function walk(unit) {
return {
action: true,
};
}
Maintenant, nous devons écrire une description de la capacité pour que le joueur sache ce qu'il fait :
function walk(unit) {
return {
action: true,
description: 'Move one space in the given direction (forward by default).',
};
}
Et pour finir, nous devons écrire la logique de la capacité dans la fonction perform
. Ici, nous pouvons utiliser différentes méthodes de Unit Maker API. Voici comment faire :
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}`);
}
},
};
}
Les capacités sont ajoutées à l'unité avec une clé dans l'objet abilities
. Ajoutons la capacité de marcher à notre Warrior sous la clé walk
(parce-que nous voulons que le joueur l'utilise en appelant 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,
},
},
},
};
Pour le second niveau, nous allons ajouter deux nouvelles capacités : "attack" (attaquer) et "feel" (ressentir).
Premièrement, nous allons définir la capacité "attack" :
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`);
}
},
};
}
Deuxièmement, définissons la capacité "feel". Contrairement à "attack", "feel" est un sens, donc nous pouvons oublier la clé action
:
function feel(unit) {
return {
description:
'Return the adjacent space in the given direction (forward by default).',
perform(direction = 'forward') {
return unit.getSensedSpaceAt(direction);
},
};
}
IMPORTANT : Quand on retourne un ou plusieurs emplacement avec un sens, il faut utiliser
unit.getSensedSpaceAt()
au lieu deunit.getSpaceAt()
. La première option renvoie un espace qui n'affiche que l'API du joueur d'espace alors que la deuxième affiche l'API de constructeur d'espace et doit être utilisée en interne, comme dans la capacité d'attaque précédente.
Pour finir, ajoutons-les au Warrior du second niveau :
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,
},
},
},
};
Nous n'avons pas ajouté la capacité "walk" dans le second niveau car le Warrior l'a déjà apprise lors du premier niveau.
C'est super, mais le Warrior ne manie pas une épée en métal Valérien pour rien. Ajoutons un ennemi qu'il pourra affronter !