Дефинисање јединица
Јединица је 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`);
}
},
};
}
Додаћемо је Белом Ходачу. Такође ћемо додати идентичну способност осећаја коју смо већ дефинисали:
const WhiteWalker = {
name: 'White Walker',
character: 'w',
maxHealth: 12,
abilities: {
attack: iceCrystalSwordAttack,
feel: feel,
},
};
За крај, треба да дефинишемо ВИ нашег Белог Ходача. Ставићемо основну ВИ: Бели Ходач ће започети свој круг осећајући у свим правцима тражећи непријатеља (Ратника). Ако пронађе непријатеља у било ком правцу, напашће у том правцу. Хајде да напишемо ту логику у функцији 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);
}
},
};
Нисмо доделили ВИ Ратнику јер ће команде задавати играч у току игре.
Сада је потребно да убацимо Белог Ходача у други ниво. Јединице које нису Ратник додајемо у низ units
за тај спрат:
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',
},
},
],
},
};
Овде смо користили проширене карактеристике, да би спојили дефиницију јединице са њеном позицијом на спрату.
Честитамо! Управо сте направили своју прву кулу. Сада ваша кула може да се игра, али не би било лоше још једном прерадити вредности.