Definování schopností
Ability je JavaScript function, která dostává jednotku s abilitou jako jediný argument a vrací JavaScript object:
function walk(unit) {
return {
// Ability definition.
};
}
Walk ability je action, začněme tedy tímto:
function walk(unit) {
return {
action: true,
};
}
Následně musíme sepsat popis této ability, aby hráč věděl, co dělá:
function walk(unit) {
return {
action: true,
description: 'Move one space in the given direction (forward by default).',
};
}
A nakonec musíme sepsat logiku této ability ve funkci perform
. Here, we can use any of the methods in the Unit Maker API. Pojďme na 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}`);
}
},
};
}
Abilities jsou přidány k jednotkám jako key v objectu abilities
. Pojďme přidat válečníkovi walk ability jako key walk
(protože chceme, aby ji hráč používal voláním 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,
},
},
},
};
Pro druhou úroveň musíme přidat další dvě abilities: attack a feel.
Nejdříve pojďme definovat attach ability:
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`);
}
},
};
}
Následně pojďme definovat feel ability. Na rozdíl od attack, feel je smysl, a proto můžeme vynechat key action
:
function feel(unit) {
return {
description:
'Return the adjacent space in the given direction (forward by default).',
perform(direction = 'forward') {
return unit.getSensedSpaceAt(direction);
},
};
}
DŮLEŽITÉ: Při vracení jednoho nebo více polí ze smyslů použij
unit.getSensedSpaceAt()
místounit.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.
Nakonec je přidejme válečníkovi v druhém patře:
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,
},
},
},
};
Nepřidáváme walk ability znovu v druhém patře, protože ji válečník již zná z prvního patra.
Zatím super, ale válečník nevládne mečem z Valyrianské oceli nadarmo. Pojďme přidat nepřítele!