Określanie jednostek
Jednostka jest obiektem JavaScript:
const WhiteWalker = {
// Unit definition.
};
Zacznijmy od dodawania imion jednostkom:
const WhiteWalker = {
name: 'White Walker',
};
Nie nazwaliśmy tego Wojownika, ponieważ imię jest ustalane przez gracza podczas gry.
Tak jak Wojownik, inne jednostki także potrzebują charakteru i wartości maksymalnego zdrowia:
const WhiteWalker = {
name: 'White Walker',
character: 'w',
maxHealth: 12,
};
Określmy nową umiejętność ataku:
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`);
}
},
};
}
I dodajmy ją do White Walker'a. Dodajmy także tę samą umiejętność odczuwania którą już zdefiniowaliśmy:
const WhiteWalker = {
name: 'White Walker',
character: 'w',
maxHealth: 12,
abilities: {
attack: iceCrystalSwordAttack,
feel: feel,
},
};
W końcu, musimy określić AI naszego White Walker'a. To będzie bardzo prymitywny AI: White Walker rozpocznie swoją kolej poprzez wyczuwanie każdej drogi by znaleźć wroga (Wojownika). Jeżeli znajdzie go w jakimkolwiek kierunku, zaatakuje go w tym kierunku. Zapiszmy tę zasadę w funkcji 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);
}
},
};
Nie napisaliśmy AI dla Wojownika, ponieważ to również jest ustalanie przez gracza podczas gry.
Teraz potrzebujemy dodać White Walker'a do drugiego poziom. Jednostki inne niż Wojownik są dodawane do szeregu jednostek
na piętrze:
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',
},
},
],
},
};
Tutaj użyliśmy syntaksu spread, aby połączyć definicję jednostki z jej pozycją na piętrze.
Gratulacje! Utworzyłeś swoją pierwszą wieżę. W tym momencie twoja wieża jest w pełni grywalna, jednak dobrze byłoby poddać ją refaktoryzacji.