Fichier json

L’application utilise des fichiers jsons pour charger les données des armées.

Le format actuel contient :

  • Description de l’organisation de l’armée :
{
  "organisation": [
    {
      "id": "1",
      "name": "Characters",
      "percent": 40,
      "type": "max"
    },
    {
      "id": "2",
      "name": "Core",
      "percent": 25,
      "type": "min"
    },
    {
      "id": "3",
      "name": "Special",
      "percent": 100,
      "type": "max"
    },
    {
      "id": "4",
      "name": "Imperial Auxiliaries",
      "percent": 35,
      "type": "max"
    },
    {
      "id": "5",
      "name": "Imperial Armoury",
      "percent": 20,
      "type": "max"
    },
    {
      "id": "6",
      "name": "Sunna's Fury",
      "percent": 30,
      "type": "max"
    }
  ],
  • Description des montures :

les infos type et base sont définies dans un autre json, elles font références aux tailles de socles et types de troupes.
Une monture a des infos génériques et des “rules”, une rule pour chaque ligne de son profil. Une rule contient la liste des équipements et des règles spéciales de cette partie de la figurine. Voici en exemple une figurine simple (un cheval) et une monture composée (un autel). Attention, il faut que les entrées “specialrules” et “equipments” soient renseignées, même si la liste est vide.
La category sert à définir si la monture va compter dans une autre organisation que la figurine qui l’achète, il faut renseigner l’id de l’organisation correspondante.

  "mounts": [
    {
      "id": "1",
      "name": "horse",
      "type": "2",
      "base": "2",
      "rules": [
        {
          "name": "horse",
          "M": "8",
          "WS": "3",
          "BS": "-",
          "S": "3",
          "T": "3",
          "W": "1",
          "I": "3",
          "A": "1",
          "Ld": "3",
          "specialrules": [
            {}
          ],
          "equipments": [
            {
              "equipment": "Mount's Potection (6+)"
            }
          ]
        }
      ]
    },
    {
      "id": "7",
      "type": "6",
      "base": "4",
      "name": "Arcane Engine",
      "category": "6",
      "rules": [
        {
          "name": "Arcane Engine",
          "M": "-",
          "WS": "-",
          "BS": "-",
          "S": "5",
          "T": "5",
          "W": "5",
          "I": "-",
          "A": "-",
          "Ld": "-",
          "specialrules": [
            {
              "specialrule": "Towering Presence"
            },
            {
              "specialrule": "Channel"
            }
          ],
          "equipments": [
            {
              "equipment": "Heavy Armour"
            }
          ]
        },
        {
          "name": "Horse (2)",
          "M": "8",
          "WS": "3",
          "BS": "-",
          "S": "3",
          "T": "-",
          "W": "-",
          "I": "3",
          "A": "1",
          "Ld": "3",
          "specialrules": [
            {}
          ],
          "equipments": [
            {}
          ]
        },
        {
          "name": "Crew (2)",
          "M": "4",
          "WS": "3",
          "BS": "3",
          "S": "3",
          "T": "-",
          "W": "-",
          "I": "3",
          "A": "1",
          "Ld": "7",
          "specialrules": [
            {}
          ],
          "equipments": [
            {}
          ]
        }
      ]
    }
  ],
  • Description des unités :

une unité est représentée de la même façon qu’une monture, avec en plus des options. Les options sont soit en “onechoice” pour savoir si c’est un seul choix dans l’option, soit “mandatory” pour savoir si elles sont obligatoires, soit avec un “type” en “permodel” pour savoir si le prix des options sera par figurine de l’unité ou non. Une option comprend une liste de choix. Un choix a un coût, un type potentiel (magicitems par exemple), une limitation potentielle pour déterminer combien de fois on peut ajouter l’objet, un globalid potentiel si le choix est lié à un autre choix et une liste de conditions. Les conditions sont là pour activer ou non le choix selon les autres éléments sélectionnés. Une condition est soit globale (la vérification se fera sur l’ensemble de la liste pour savoir si la condition est remplie) soit locale (la vérification se fait uniquement sur l’unité en cours). On vérifie si l’élément existe ou non selon la valeur de “exist”, et si la condition est remplie l’utilisateur a le droit de sélectionner ce choix. Par exemple pour le général on met une “globalid” à 102 sur toutes les entrées qui permettent de choisir le général, et on teste dans la condition s’il n’y a pas déjà une “globalid” à 102 qui existe (du coup dès que vous ajoutez une unité en ayant sélectionné général vous ne pourrez plus sélectionner cette option sur les autres unités).
Enfin un choix peut être une monture, auquel cas on rempli l’attribut “mount” avec l’id de la monture correspondante.

Pour les unités, il faut rajouter les informations “modelcost”, “maxmodels” et “limitation” qui déterminent respectivement le coût par figurine, le nombre max de figurines qu’on peut rajouter à l’unité et le nombre max d’unités qu’on peut prendre.

Au niveau des globalid utilisées, il faut soit qu’elles soient uniques dans le fichier soit qu’elles soient à :

  • 102 pour le général
  • 101 pour la GB
  • 100 pour le porte étendard vétéran

Ces valeurs n’ont pas d’impact sur le fonctionnement local, mais avoir des valeurs fixes pour des conditions communes à tous les fichiers me permet de retrouver rapidement un général, une GB ou un vétéran dans les fichiers.

Dans le cas d’un perso à profil multiple comme ça se fait chez les BH par exemple (le perso a 2 profils, à x points et y points qui lui donnent des options, des règles et des coûts différents) il faut faire 2 entrées différentes et les traiter comme 2 personnages différents.

  "army": [
    {
      "organisation": "1",
      "units": [
        {
          "name": "Marshal",
          "cost": 160,
          "type": "1",
          "base": "1",
          "rules": [
            {
              "name": "Marshal",
              "M": "4",
              "WS": "5",
              "BS": "5",
              "S": "4",
              "T": "4",
              "W": "3",
              "I": "5",
              "A": "3",
              "Ld": "9",
              "specialrules": [
                {
                  "specialrule": "Orders"
                }
              ],
              "equipments": [
                {
                  "equipment": "Plate Armour"
                }
              ]
            }
          ],
          "options": [
            {
              "name": "Options",
              "onechoice": false,
              "choices": [
                {
                  "globalid": "101",
                  "name": "BSB",
                  "cost": 0,
                  "condition": [
                    {
                      "option": "102",
                      "global": false,
                      "exist": false
                    },
                    {
                      "option": "101",
                      "global": true,
                      "exist": false
                    }
                  ]
                },
                {
                  "globalid": "102",
                  "name": "general",
                  "cost": 0,
                  "condition": [
                    {
                      "option": "101",
                      "global": false,
                      "exist": false
                    },
                    {
                      "option": "102",
                      "global": true,
                      "exist": false
                    }
                  ]
                },
                {
                  "name": "shield",
                  "cost": 6
                },
                {
                  "name": "barding",
                  "cost": 30,
                  "condition": [
                    {
                      "option": "4",
                      "global": false,
                      "exist": true
                    }
                  ]
                },
                {
                  "name": "pistol",
                  "cost": 12
                },
                {
                  "type": "magicitems",
                  "name": "magic items",
                  "cost": 100,
                  "condition": [
                    {
                      "option": "101",
                      "global": false,
                      "exist": true
                    }
                  ]
                },
                {
                  "type": "magicitems",
                  "name": "magic items",
                  "cost": 200,
                  "condition": [
                    {
                      "option": "2",
                      "global": false,
                      "exist": false
                    },
                    {
                      "option": "101",
                      "global": false,
                      "exist": false
                    }
                  ]
                },
                {
                  "type": "magicitems",
                  "name": "magic items",
                  "cost": 50,
                  "condition": [
                    {
                      "option": "2",
                      "global": false,
                      "exist": true
                    }
                  ]
                }
              ]
            },
            {
              "name": "Weapons",
              "onechoice": true,
              "choices": [
                {
                  "name": "paired weapons",
                  "cost": 6
                },
                {
                  "name": "great weapon",
                  "cost": 8
                },
                {
                  "name": "hallberd",
                  "cost": 8
                },
                {
                  "name": "lance",
                  "cost": 12
                }
              ]
            },
            {
              "name": "Upgrades",
              "onechoice": true,
              "choices": [
                {
                  "name": "great tactician",
                  "cost": 60,
                  "limitation": 1
                },
                {
                  "globalid": "2",
                  "name": "imperial prince",
                  "cost": 180,
                  "limitation": 1,
                  "condition": [
                    {
                      "option": "102",
                      "global": false,
                      "exist": true
                    }
                  ]
                }
              ]
            },
            {
              "name": "Mounts",
              "onechoice": true,
              "choices": [
                {
                  "globalid": "4",
                  "mount": "1",
                  "cost": 40
                },
                {
                  "mount": "2",
                  "cost": 140
                },
                {
                  "mount": "3",
                  "cost": 220,
                  "condition": [
                    {
                      "option": "101",
                      "global": false,
                      "exist": false
                    }
                  ]
                },
                {
                  "mount": "4",
                  "cost": 520,
                  "condition": [
                    {
                      "option": "2",
                      "global": false,
                      "exist": true
                    },
                    {
                      "option": "101",
                      "global": false,
                      "exist": false
                    }
                  ]
                }
              ]
            }
          ]
        },{
          "name": "Flagellants",
          "cost": 160,
          "size": 10,
          "modelcost": 20,
          "maxmodels": 15,
          "limitation": 3,
          "type": "1",
          "base": "1",
          "rules": [
            {
              "name": "Flagellants",
              "M": "4",
              "WS": "3",
              "BS": "3",
              "S": "3",
              "T": "4",
              "W": "1",
              "I": "3",
              "A": "1",
              "Ld": "6",
              "specialrules": [
                {
                  "specialrule": "Zealots"
                },
                {
                  "specialrule": "Fanatical"
                },
                {
                  "specialrule": "Unbreakable"
                }
              ],
              "equipments": [
                {
                  "equipment": "Bow"
                }
              ]
            }
          ],
          "options": [
            {
              "name": "Options",
              "onechoice": false,
              "choices": [
                {
                  "name": "Champion",
                  "cost": 20
                }
              ]
            }
          ]
        }

Voici les valeurs actuellement disponibles pour les types et les bases, il en manque surement donc il faudra les rajouter au fur à mesure :

{
    "types": [
      {
        "id": "1",
        "name": "Infantry"
      },
      {
        "id": "2",
        "name": "War Beast"
      },
      {
        "id": "3",
        "name": "Monstruous Beast"
      },
      {
        "id": "4",
        "name": "Monster"
      },
      {
        "id": "5",
        "name": "Cavalry"
      },
      {
        "id": "6",
        "name": "Chariot"
      }
    ],
    "bases": [
      {
        "id": "1",
        "name": "20x20"
      },
      {
        "id": "2",
        "name": "25x50"
      },
      {
        "id": "3",
        "name": "40x40"
      },
      {
        "id": "4",
        "name": "50x100"
      },
      {
        "id": "5",
        "name": "50x75"
      }
    ]
  }

Pour créer le fichier json le mieux est probablement d’utiliser un éditeur type http://jsoneditoronline.org/ et de partir d’un fichier de données existants. J’ai mis un fichier complet à disposition ici . Il faut copier le contenu du fichier et le coller dans la zone gauche de l’éditeur, puis cliquer sur la flèche au centre vers la droite pour obtenir la structure du json.