Definiowanie Umiejętności
Umiejętność jest funkcją JavaScript, która odbiera jednostkę, która posiądzie umiejętność jako jedyny parametr i zwróci obiekt JavaScript:
function walk(unit) {
return {
// Ability definition.
};
}
Umiejętność chodzenia jest akcją, więc najpierw ją wskażmy:
function walk(unit) {
return {
action: true,
};
}
Potem musimy napisać opis dla umiejętności, aby gracz wiedział co ona robi:
function walk(unit) {
return {
action: true,
description: 'Move one space in the given direction (forward by default).',
};
}
I ostatnia sprawa, ale nie mniej ważna, musimy napisać funkcje umiejętności w funkcji perform
. Tutaj możemy użyć którejś z metod Markera . Zróbmy to:
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}`);
}
},
};
}
Umiejętności są dodawne do jednostek pod kluczem w obiekcie Umiejętności
. Dodajmy umiejętność chodzenia Wojownikowi pod kluczem chodzenia
(Ponieważ chcemy, aby gracz używał tej umiejętności poprzez wywołanie warrior.walk()
):
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,
},
},
},
};
Na drugim poziomie musimy dodać dwie nowe umiejętności: atak i odczuwanie.
Najpierw zdefiniujemy umiejętność ataku:
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`);
}
},
};
}
Następnie określimy umiejętność odczuwania. Odwrotnie do ataku, odczuwanie jest zmysłem, więc możemy pominąć klucz akcji
:
function feel(unit) {
return {
description:
'Return the adjacent space in the given direction (forward by default).',
perform(direction = 'forward') {
return unit.getSensedSpaceAt(direction);
},
};
}
WAŻNE: Podczas zwracania jednego lub wielu pól za pomocą zmysłów, użyj
unit.getSensedSpaceAt()
zamiastunit.getSpaceAt()
. 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.
Wkońcu, dodajmy je do wojownika drugiego poziomu:
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,
},
},
},
};
Nie dodajemy umiejętności poruszania się w drugim poziomie, ponieważ Wojownik nauczył się tego już w poziomie pierwszym.
Świetnie, lecz wojownik nie bez powodu dzierży ten miecz z valyriańskiej stali. Dodajmy przeciwnika, z którym mógłby walczyć!