Fähigkeiten definieren
Eine Fähigkeit ist eine JavaScript-Funktion, die als einziges Argument eine Einheit übergeben bekommt, die diese Fähigkeit besitzt. Die Funktion gibt ein Objekt zurück:
function walk(unit) {
return {
// Ability definition.
};
}
Die Lauf-Fähigkeit ist eine Aktion, also lass und das angeben:
function walk(unit) {
return {
action: true,
};
}
Als nächstes müssen wir eine Beschreibung schreiben, damit der Spieler weiß, was die Fähigkeit macht:
function walk(unit) {
return {
action: true,
description: 'Move one space in the given direction (forward by default).',
};
}
Zu guter Letzt müssen wir in der perform
-Funktion die Logik der Fähigkeit implementieren. Here, we can use any of the methods in the Unit Maker API. Also los geht's:
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}`);
}
},
};
}
Fähigkeiten werden Einheiten mithilfe einer Eigenschaft des abilities
-Objektes hinzugefügt. Lass uns die Lauf-Fähigkeit unseres Kämpfers unter der Eigenschaft walk
hinzufügen (damit wir diese später mit warrior.walk()
aufrufen können):
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,
},
},
},
};
Für das zweite Level müssen wir zwei weitere Fähigkeiten hinzufügen: Angreifen und Spüren.
Zunächst definieren wir die Angriffs-Fähigkeit:
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`);
}
},
};
}
Danach definieren wir die Spür-Fähigkeit. Anders als die Angriff-Fähigkeit ist das Spüren eine Wahrnehmung und keine Aktion, sodass wir die action
-Eigenschaft weglassen können:
function feel(unit) {
return {
description:
'Return the adjacent space in the given direction (forward by default).',
perform(direction = 'forward') {
return unit.getSensedSpaceAt(direction);
},
};
}
WICHTIG: Wenn du einen oder mehrere wahrgenommene Bereiche zurückgibst, solltest du unbedingt
unit.getSensedSpaceAt()
und nichtunit.getSpaceAt()
verwenden. The former returns a space that exposes only the Space Player API, whereas the latter exposes the Space Maker API and is meant to be used internally, like in the attack ability before.
Schließlich können wir die neuen Fähigkeiten dem Kämpfer des zweiten Levels hinzufügen:
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,
},
},
},
};
Wir fügen die Lauf-Fähigkeit nicht nochmal hinzu, da der Kämpfer diese bereits im vorherigen Level gelernt hat.
So weit so gut, allerdings trägt unser Kämpfer sein valyrisches Stahlschwert nicht ohne Grund. Lass uns Gegner hinzufügen, die er bekämpfen kann!