Definendo le Unità
Un’unità è un oggetto JavaScript:
const WhiteWalker = {
// Unit definition.
};
Iniziamo dall'aggiungere il nome dell'unità:
const WhiteWalker = {
name: 'White Walker',
};
Non abbiamo ancora aggiunto un nome per il Guerriero perché verrà fornito dal giocatore durante il gioco.
Così come il Guerriero, anche le altre unità necessitano di un carattere e di un valore per la salute massima:
const WhiteWalker = {
name: 'White Walker',
character: 'w',
maxHealth: 12,
};
Definiamo una nuova abilità di attacco:
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`);
}
},
};
}
E aggiungiamola al White Walker. Aggiungiamo anche la stessa abilità di percepire che abbiamo già precedentemente definito:
const WhiteWalker = {
name: 'White Walker',
character: 'w',
maxHealth: 12,
abilities: {
attack: iceCrystalSwordAttack,
feel: feel,
},
};
Infine, dobbiamo definire l'IA del nostro White Walker. Sarà un IA molto rudimentale: il White Walker inizierà il suo turno percependo in ogni direzione alla ricerca di un nemico (il Guerriero). Se lo trova in qualsiasi direzione, attaccherà in quella direzione. Scriviamo questa logica nella funzione 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);
}
},
};
Non abbiamo scritto nemmeno l'IA del Guerriero perché anche questa viene fornita dal giocatore durante il gioco.
Ora dobbiamo aggiungere il White Walker al secondo livello. Le unità diverse dal Guerriero vengono aggiunte all'elenco units
del piano:
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',
},
},
],
},
};
Qui, abbiamo usato spread properties per unire la definizione dell'unità con la sua posizione sul piano.
Congratulazioni! Hai appena creato la tua prima torre. A questo punto la torre è completamente giocabile, anche se un po' di refactoring potrebbe tornare utile.