Frameworks de code
Recette : dépenser une ressource
Écrivez une action qui ne fait rien quand une ressource est épuisée, et testez les deux cas.
Objectif
Laissez un Keeper faire jaillir trois étincelles. Une quatrième ne fait rien.
Le changement
rules/spark.ts
export function spark(self: ElementRef): void {
const charges: number = element.var(self, "charges") as number;
if (charges > 0) {
ledger.add(self, "charges", -1);
}
}- Ligne 2 Lit la ressource.
- Lignes 3-5 N'en dépense une que s'il en reste. Sinon, l'action n'écrit rien.
Déclarez l'action dans le schéma.
schemas/keeper.json
"actions": [
{ "id": "hurt", "name": "Take damage", "source": "rules/hurt.ts" },
{ "id": "heal", "name": "Heal", "source": "rules/heal.ts" },
{ "id": "spark", "name": "Strike a spark", "source": "rules/spark.ts" }
],- Ligne 13 La nouvelle action.
Le constructeur renvoie charges avec une valeur de départ de 3.
rules/keeper.ts
export function construct(
name: string,
max_hp: number,
): { name: string; max_hp: number; hp: number; charges: number } {
return { name: name, max_hp: max_hp, hp: max_hp, charges: 3 };
}- Lignes 5-6 charges est un champ stocké avec une valeur de départ de 3.
Ajoutez un alias pour l'action au dataContract du Cadre et un bouton qui l'utilise, sinon les joueurs ne peuvent pas s'en servir depuis la fiche.
layouts/keeper.json
{ "name": "spark", "functionRef": "spark" }- Ligne 20 L'alias de l'action.
layouts/keeper.json
{ "kind": "button", "label": "Strike a spark", "actionRef": "spark" }- Ligne 34 Le bouton qui l'appelle.
Testez-le
scenarios/spark.json
{
"id": "spend-all-charges",
"framework": "keeper",
"parameters": { "name": "Mira", "max_hp": 10 },
"expectedValues": { "name": "Mira", "max_hp": 10, "hp": 10, "charges": 3 },
"actions": [
{
"action": "spark",
"parameters": {},
"expectedWrites": [
{ "op": "ledger.add", "key": "charges", "value": -1 }
]
},
{
"action": "spark",
"parameters": {},
"expectedWrites": [
{ "op": "ledger.add", "key": "charges", "value": -1 }
]
},
{
"action": "spark",
"parameters": {},
"expectedWrites": [
{ "op": "ledger.add", "key": "charges", "value": -1 }
]
},
{ "action": "spark", "parameters": {}, "expectedWrites": [] }
]
}- Lignes 7-27 Trois étincelles dépensent chacune une charge.
- Ligne 28 La quatrième ne trouve aucune charge, donc elle n'attend aucune écriture.
manifest/project.json
{
"formatVersion": "fabled.game-project/v1",
"projectId": "game-your-game-id",
"projectKind": "GAME",
"compilerProfile": "native-game-v1",
"name": "Lantern Keepers",
"entryFramework": "keeper",
"frameworks": ["schemas/keeper.json"],
"scenarios": [
"scenarios/new-keeper.json",
"scenarios/heal.json",
"scenarios/spark.json"
]
}- Ligne 12 Le nouveau fichier de scénario.
Listez le nouveau fichier de scénario dans le manifeste. Ajoutez charges aux valeurs attendues des deux autres scénarios.

