Einheiten definieren
Eine Einheit ist ein JavaScript-Objekt:
const WhiteWalker = {
// Unit definition.
};
Lass uns starten, indem wir der Einheit einen Namen geben:
const WhiteWalker = {
name: 'White Walker',
};
Wir haben dem Kämpfer kein Namen gegeben, da er diesen durch den Spieler zum Start des Spiels erhält.
Wie der Kämpfer brauchen auch andere Einheiten einen Buchstaben und einen maximalen Lebenspunktestand:
const WhiteWalker = {
name: 'White Walker',
character: 'w',
maxHealth: 12,
};
Lass uns eine neue Angriff-Fähigkeit definieren:
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`);
}
},
};
}
Und dem Weißen Wanderer hinzufügen. Lass uns außerdem die gleiche Spür-Fähigkeit hinzufügen, die wir vorher schon definiert hatten:
const WhiteWalker = {
name: 'White Walker',
character: 'w',
maxHealth: 12,
abilities: {
attack: iceCrystalSwordAttack,
feel: feel,
},
};
Zu guter Letzt müssen wir die KI unseres Weißen Wanderers definieren. Die KI wird sehr rudimentär: Der weiße Wanderer wird seinen Zug damit starten, alle angrenzenden Bereiche nach einem Gegner (den Kämpfer) abzusuchen. Wenn er einen findet, greift er in die betreffene Richtung an. Lass uns diese Logik innerhalb der playTurn
-Funktion implementieren:
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);
}
},
};
Die KI für den Kämpfer haben wir ebenfalls nicht geschrieben, da diese natürlich vom Spieler während des Spiels implementiert wird.
Nun müssen wir den Weißen Wanderer dem zweiten Level hinzufügen. Einheiten außer dem Kämpfer werden dem units
-Array des Levels angefügt:
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',
},
},
],
},
};
Hier haben wir Spread-Properties verwendet, um die Einheiten-Definition mit ihrer Position im Level zu kombinieren.
Glückwunsch! Du hast deinen ersten Turm erstellt. Ab jetzt ist dein Turm voll spielbar, allerdings könnte er etwas Refactoring vertragen.