Добавление Способностей
Способность это JavaScript функция, которая получает существо, применяющее эту способность, в качестве единственного параметра, и возвращает JavaScript объект:
function walk(unit) {
return {
// Ability definition.
};
}
Способность "walk" это действие, поэтому для начала, давайте отобразим это:
function walk(unit) {
return {
action: true,
};
}
Затем, нам нужно задать описание способности, чтобы игрок понимал, за что она отвечает:
function walk(unit) {
return {
action: true,
description: 'Move one space in the given direction (forward by default).',
};
}
И, наконц, мы должны описать локику способности в коде функции perform
. Здесь, мы можем использовать любые методы в Unit Maker API. Давайте сделаем это:
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}`);
}
},
};
}
Способности, добавляемые существам, должны быть доступны по ключам объекта abilities
. Давайте добавим Воину способность "идти" под ключем walk
(т.к. мы предполагаем, что игрок должен вызывать её, обращаясь к 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,
},
},
},
};
На втором уровне мы хотим добавить ещё две способности: атаковать и чувствовать.
Сперва, давайте определим способность атаковать:
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`);
}
},
};
}
После, давайте определим и способность восприятия. В отличии от атаки, восприятие это чувство, поэтому мы можем опустить ключ action
:
function feel(unit) {
return {
description:
'Return the adjacent space in the given direction (forward by default).',
perform(direction = 'forward') {
return unit.getSensedSpaceAt(direction);
},
};
}
ВАЖНО: Когда возвращается одна или несколько областей при использовании чувств, используйте
unit.getSensedSpaceAt()
вместоunit.getSpaceAt()
. Первый метод возвращает область, содержащюю только Space Player API, в то время как, последний метод содержит Space Maker API, и предназначен, для внутреннего использования, подобно в способности атаковать, рассмотренной выше.
Наконец, давайте добавим их Воину второго уровня:
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,
},
},
},
};
Мы не добавляем снова способность ходить на втором уровне, потому что Воин уже научился этому на первом.
Выглядит неплохо, но Воин не должен быть вооружён мечом из Валерианской стали просто так. Давайте добавим врагов, чтобы он мог сражаться с ними!