Definiendo Unidades
Una unidad es un objeto JavaScript:
const WhiteWalker = {
// Unit definition.
};
Comencemos por agregar el nombre de la unidad:
const WhiteWalker = {
name: 'White Walker',
};
No agregamos un number para el Guerrero porque este es proporcionado por el jugador durante el juego.
Al igual que el Guerrero, otras unidad también necesitan un caracter y un valor máximo de salud:
const WhiteWalker = {
name: 'White Walker',
character: 'w',
maxHealth: 12,
};
Definamos una nueva habilidad de atacar:
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`);
}
},
};
}
Y agreguémosla al Caminante Blanco. Agreguemos también la misma habilidad de sentir que ya habíamos definido:
const WhiteWalker = {
name: 'White Walker',
character: 'w',
maxHealth: 12,
abilities: {
attack: iceCrystalSwordAttack,
feel: feel,
},
};
Finalmente, vamos a definir la IA de nuestro Caminante Blanco. Será una IA muy rudimentaria: el Caminante Blanco comenzará su turno sintiendo en todas las direcciones en busca de un enemigo (el Guerrero). Si lo encuentra en alguna dirección, entonces atacará en esa dirección. Escribamos esa lógica en la función 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);
}
},
};
No escribimos la IA del Guerrero tampoco porque esta es también proporcionada por el jugador durante el juego.
Ahora debemos agregar el Caminante Blanco al segundo nivel. Con excepción del Guerrero, las unidades se agregan al array units
del piso:
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',
},
},
],
},
};
Aquí utilizamos la sintáxis spread para combinar la definición de la unidad con su posición en el piso.
¡Felicidades! Has creado tu primera torre. En este momento, tu torre es completamente jugable, pero puede ser conveniente refactorizar el código.