Definiendo Abilidades
Una habilidad es una función JavaScript que recibe la unidad que posee la habilidad como su único parámetro y devuelve un objeto JavaScript:
function walk(unit) {
return {
// Ability definition.
};
}
La habilidad de caminar es una acción, así que indiquemos eso primero que nada:
function walk(unit) {
return {
action: true,
};
}
Luego, necesitamos escribir una descripción para la habilidad para que el jugador sepa lo que esta hace:
function walk(unit) {
return {
action: true,
description: 'Move one space in the given direction (forward by default).',
};
}
Y por último pero no menos importante, debemos escribir la lógica de la habilidad en la función perform
. Aquí, podemos utilizar cualquiera de los métodos en la API de la Unidad del Creador. Hagámoslo:
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}`);
}
},
};
}
Las habilidades son agregadas a las unidades bajo una clave en el objeto abilities
. Agreguemos la habilidad de caminar bajo la clave walk
(ya que queremos que el jugador la invoque llamando 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,
},
},
},
};
Para el segundo nivel, necesitamos agregar dos habilidades más: atacar y sentir.
Primero, definamos la habilidad de atacar:
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`);
}
},
};
}
Luego, definamos la habilidad de sentir. Al contrario que atacar, sentir es un sentido, por lo que podemos omitir la clave action
:
function feel(unit) {
return {
description:
'Return the adjacent space in the given direction (forward by default).',
perform(direction = 'forward') {
return unit.getSensedSpaceAt(direction);
},
};
}
IMPORTANTE: Cuando devuelvas uno o más espacios desde los sentidos, utiliza
unit.getSensedSpaceAt()
en lugar deunit.getSpaceAt()
. El primero devuelve un espacio que expone solo la API del Espacio del Jugador, mientras que el último expone la API del Espacio del Creador y esta pensada para ser usada internamente, como en la habilidad de atacar que creamos anteriormente.
Finalmente, agreguémoslas al Guerrero del segundo nivel:
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,
},
},
},
};
No agregamos la habilidad de caminar nuevamente en el segundo nivel porque el Guerrero ya la aprendió en el primer nivel.
Esto esta muy bien, pero el Guerrero no esta blandiendo esa espada de acero Valyrio por nada. ¡Agreguemos un enemigo con el que pueda combatir!