Добавление Существ
Существо это Javascript объект:
const WhiteWalker = {
// Unit definition.
};
Давайте начнём с того, что добавим существу имя:
const WhiteWalker = {
name: 'White Walker',
};
Мы не добавляем имя Воину, т. к. значение имени Воина присваивается игроком во время игры.
Подобно Воину, остальные существа так же нуждаются в символьном обозначении и значении максимального здоровья:
const WhiteWalker = {
name: 'White Walker',
character: 'w',
maxHealth: 12,
};
Давайте определим новую способность для атаки:
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`);
}
},
};
}
И добавим её "Белому Ходоку" (White Walker). Давайте, также добавим аналогичную способность ощущать, которую мы уже определили:
const WhiteWalker = {
name: 'White Walker',
character: 'w',
maxHealth: 12,
abilities: {
attack: iceCrystalSwordAttack,
feel: feel,
},
};
Наконец, мы должны определить AI нашего White Walker. Это будет весьма примитивный AI: Белый Ходок начнёт свой ход, если почувствует в любом из направлений присутствие врага (Воина). Если он найдёт Воина в каком-либо из направлений, он атакует в этом направлении. Давайте опишем логику в методе 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);
}
},
};
Мы, так же не будем описывать AI для Воина, предоставив эту задачу игроку во время игрового процесса.
Теперь нам нужно добавить Белого Ходока на второй уровень. Существа, отличные от Воина, добавляются массивом в качестве значения свойства units
объекта floor
, который в свою очередь, так же является свойством:
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',
},
},
],
},
};
Здесь мы использовали spread оператор для вставки существа на своё место в объекте
floor
.
Поздравляем! Вы создали свою первую Башню. На данный момент Башня полностью готова к игре, но, как мы увидим далее, её код можно улучшить.