Définition des unités
Une unité est un objet JavaScript :
const WhiteWalker = {
// Unit definition.
};
Commençons par donner un nom à cette unité :
const WhiteWalker = {
name: 'White Walker',
};
Nous n'avons pas renseigné de nom pour le guerrier car c'est le joueur qui lui en donne un pendant la partie.
Tout comme le guerrier, d'autres unités requièrent un personnage et une valeur maximale de points de santé :
const WhiteWalker = {
name: 'White Walker',
character: 'w',
maxHealth: 12,
};
Définissons maintenant une nouvelle aptitude de combat :
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`);
}
},
};
}
Et ajoutons-la au White Walker. N'oublions pas d'ajouter également l'aptitude que nous avons déjà définie :
const WhiteWalker = {
name: 'White Walker',
character: 'w',
maxHealth: 12,
abilities: {
attack: iceCrystalSwordAttack,
feel: feel,
},
};
Pour terminer, nous devons définir l'IA de notre White Walker. Ce sera une IA basique : le White Walker commencera son tour en essayant de ressentir la présence d'un ennemi (le guerrier) dans toutes les directions. Il lancera une attaque en direction du guerrier. Notons ce comportement dans la fonction 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);
}
},
};
Nous n'avons pas non plus écrit l'IA pour le guerrier car elle est également fournie par le joueur pendant la partie.
Maintenant, nous devons ajouter le White Walker au deuxième niveau. Les unités autres que le guerrier sont ajoutées à la gamme units
au sol :
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',
},
},
],
},
};
Ici, nous avons utilisé des propriétés espacées pour combiner la définition de l'unité et sa position au sol.
Félicitations ! Vous avez créé votre première tour. Vous pouvez déjà l'utiliser, mais il serait bon d'y travailler encore un peu.