Aller au contenu principal

Frameworks de code

Tables du livre de règles

Gardez des données de règles fixes dans une table, puis lisez-la depuis vos règles ou utilisez-la comme choix d'une entrée.

Ce qu'est une table

Une table du livre de règles est une donnée fixe que vos règles lisent, comme un bonus pour chaque Calling. Ce n'est pas un état de jeu, et les joueurs ne la changent jamais. Changer une ligne crée une nouvelle version de votre jeu, comme toute autre modification de la source.

Déclarer une table

Une table est un fichier JSON dans tables/. Listez-la dans le manifeste.

manifest/project.json
  "tables": ["tables/callings.json"]
  1. Ligne 10 Les chemins des fichiers de table.
tables/callings.json
{
  "id": "callings",
  "name": "Callings",
  "columns": [
    { "key": "calling", "label": "Calling", "type": "string" },
    { "key": "bonus", "label": "Watch bonus", "type": "number" }
  ],
  "rows": [
    { "calling": "Guard", "bonus": 30 },
    { "calling": "Scout", "bonus": 10 }
  ]
}
  1. Lignes 4-7 Les colonnes. Chacune a une clé, un libellé et un type : string, number ou boolean.
  2. Lignes 8-11 Les lignes. Chaque ligne donne une valeur pour chaque colonne, et rien d'autre.

Un Framework liste les ids des tables qu'il lit.

schemas/keeper.json
  "tables": ["callings"]
  1. Ligne 22 Le Framework peut lire la table callings.
LimiteValeur
Colonnes par table64
Lignes par table1000
Tables par Framework64
Tables par jeu128

Lire une table dans une règle

table.find prend l'id de la table, les colonnes à comparer avec les valeurs à chercher, et les colonnes à retourner avec une valeur par défaut pour chacune. Il retourne les colonnes que vous nommez, depuis la première ligne dont les colonnes de comparaison sont toutes égales à vos valeurs. Quand aucune ligne ne correspond, il retourne vos valeurs par défaut.

rules/keeper.ts
export function construct(
  name: string,
  max_hp: number,
  calling: string,
): { name: string; max_hp: number; hp: number; calling: string; watch: number } {
  const row = table.find("callings", { calling: calling }, { bonus: 0 });
  const bonus: number = row.bonus;
  return {
    name: name,
    max_hp: max_hp,
    hp: max_hp,
    calling: calling,
    watch: 20 + bonus,
  };
}
  1. Ligne 6 Cherchez le bonus du Calling. La valeur par défaut est 0.
  2. Ligne 7 Lisez une colonne du résultat. Son type vient de la table, donc il n'y a pas de conversion à écrire.
  3. Ligne 13 Utilisez le bonus dans une valeur de départ.

L'id de la table est un texte écrit dans le code, et le Framework doit lister la table. Chaque colonne que vous nommez doit exister, et seules les colonnes que vous nommez reviennent. Un constructeur lit une table de cette façon. Les valeurs à comparer doivent être une variable, un champ ou un littéral, pas une valeur calculée.

Ces erreurs sont détectées quand vous vérifiez le projet :

  const row = table.find("callings", { calling: calling }, { boost: 0 });
has no column 'boost'
which manifest.tables does not declare
  const row = table.find("callings", { calling: calling + "!" }, { bonus: 0 });
table.find match values must be a variable, a field or a literal

Utiliser une table pour des choix

Une entrée de texte peut prendre ses choix dans une colonne d'une table. Les choix sont les valeurs distinctes de la colonne, dans l'ordre des lignes.

schemas/keeper.json
    "calling": {
      "label": "Calling",
      "optionsFrom": { "table": "callings", "column": "calling" },
      "defaultValue": "Guard"
    }
  1. Ligne 11 L'assistant propose les valeurs de la colonne calling.
  2. Ligne 12 La valeur par défaut doit faire partie des choix.
is not one of this Framework's tables

Une entrée d'action de type texte peut faire pareil avec une entrée optionsFrom dans la déclaration de l'action. Une source doit proposer au moins 2 choix.

Suite