{"id":2705,"date":"2017-10-18T10:04:18","date_gmt":"2017-10-18T09:04:18","guid":{"rendered":"https:\/\/danslateteduntype.wordpress.com\/?p=2705"},"modified":"2017-10-18T10:04:18","modified_gmt":"2017-10-18T09:04:18","slug":"fichier-json","status":"publish","type":"post","link":"https:\/\/danslateteduntype.com\/?p=2705","title":{"rendered":"Fichier json"},"content":{"rendered":"<p>L&rsquo;application utilise des fichiers jsons pour charger les donn\u00e9es des arm\u00e9es.<\/p>\n<p>Le format actuel contient :<\/p>\n<ul>\n<li>Description de l&rsquo;organisation de l&rsquo;arm\u00e9e :<\/li>\n<\/ul>\n<pre>{\n  \"organisation\": [\n    {\n      \"id\": \"1\",\n      \"name\": \"Characters\",\n      \"percent\": 40,\n      \"type\": \"max\"\n    },\n    {\n      \"id\": \"2\",\n      \"name\": \"Core\",\n      \"percent\": 25,\n      \"type\": \"min\"\n    },\n    {\n      \"id\": \"3\",\n      \"name\": \"Special\",\n      \"percent\": 100,\n      \"type\": \"max\"\n    },\n    {\n      \"id\": \"4\",\n      \"name\": \"Imperial Auxiliaries\",\n      \"percent\": 35,\n      \"type\": \"max\"\n    },\n    {\n      \"id\": \"5\",\n      \"name\": \"Imperial Armoury\",\n      \"percent\": 20,\n      \"type\": \"max\"\n    },\n    {\n      \"id\": \"6\",\n      \"name\": \"Sunna's Fury\",\n      \"percent\": 30,\n      \"type\": \"max\"\n    }\n  ],<\/pre>\n<ul>\n<li>Description des montures :<\/li>\n<\/ul>\n<p>les infos type et base sont d\u00e9finies dans un autre json, elles font r\u00e9f\u00e9rences aux tailles de socles et types de troupes.<br \/>\nUne monture a des infos g\u00e9n\u00e9riques et des \u00ab\u00a0rules\u00a0\u00bb, une rule pour chaque ligne de son profil. Une rule contient la liste des \u00e9quipements et des r\u00e8gles sp\u00e9ciales de cette partie de la figurine. Voici en exemple une figurine simple (un cheval) et une monture compos\u00e9e (un autel). Attention, il faut que les entr\u00e9es \u00ab\u00a0specialrules\u00a0\u00bb et \u00ab\u00a0equipments\u00a0\u00bb soient renseign\u00e9es, m\u00eame si la liste est vide.<br \/>\nLa category sert \u00e0 d\u00e9finir si la monture va compter dans une autre organisation que la figurine qui l&rsquo;ach\u00e8te, il faut renseigner l&rsquo;id de l&rsquo;organisation correspondante.<\/p>\n<pre>  \"mounts\": [\n    {\n      \"id\": \"1\",\n      \"name\": \"horse\",\n      \"type\": \"2\",\n      \"base\": \"2\",\n      \"rules\": [\n        {\n          \"name\": \"horse\",\n          \"M\": \"8\",\n          \"WS\": \"3\",\n          \"BS\": \"-\",\n          \"S\": \"3\",\n          \"T\": \"3\",\n          \"W\": \"1\",\n          \"I\": \"3\",\n          \"A\": \"1\",\n          \"Ld\": \"3\",\n          \"specialrules\": [\n            {}\n          ],\n          \"equipments\": [\n            {\n              \"equipment\": \"Mount's Potection (6+)\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"id\": \"7\",\n      \"type\": \"6\",\n      \"base\": \"4\",\n      \"name\": \"Arcane Engine\",\n      \"category\": \"6\",\n      \"rules\": [\n        {\n          \"name\": \"Arcane Engine\",\n          \"M\": \"-\",\n          \"WS\": \"-\",\n          \"BS\": \"-\",\n          \"S\": \"5\",\n          \"T\": \"5\",\n          \"W\": \"5\",\n          \"I\": \"-\",\n          \"A\": \"-\",\n          \"Ld\": \"-\",\n          \"specialrules\": [\n            {\n              \"specialrule\": \"Towering Presence\"\n            },\n            {\n              \"specialrule\": \"Channel\"\n            }\n          ],\n          \"equipments\": [\n            {\n              \"equipment\": \"Heavy Armour\"\n            }\n          ]\n        },\n        {\n          \"name\": \"Horse (2)\",\n          \"M\": \"8\",\n          \"WS\": \"3\",\n          \"BS\": \"-\",\n          \"S\": \"3\",\n          \"T\": \"-\",\n          \"W\": \"-\",\n          \"I\": \"3\",\n          \"A\": \"1\",\n          \"Ld\": \"3\",\n          \"specialrules\": [\n            {}\n          ],\n          \"equipments\": [\n            {}\n          ]\n        },\n        {\n          \"name\": \"Crew (2)\",\n          \"M\": \"4\",\n          \"WS\": \"3\",\n          \"BS\": \"3\",\n          \"S\": \"3\",\n          \"T\": \"-\",\n          \"W\": \"-\",\n          \"I\": \"3\",\n          \"A\": \"1\",\n          \"Ld\": \"7\",\n          \"specialrules\": [\n            {}\n          ],\n          \"equipments\": [\n            {}\n          ]\n        }\n      ]\n    }\n  ],<\/pre>\n<ul>\n<li>Description des unit\u00e9s :<\/li>\n<\/ul>\n<p>une unit\u00e9 est repr\u00e9sent\u00e9e de la m\u00eame fa\u00e7on qu&rsquo;une monture, avec en plus des options. Les options sont soit en \u00ab\u00a0onechoice\u00a0\u00bb pour savoir si c&rsquo;est un seul choix dans l&rsquo;option, soit \u00ab\u00a0mandatory\u00a0\u00bb pour savoir si elles sont obligatoires, soit avec un \u00ab\u00a0type\u00a0\u00bb en \u00ab\u00a0permodel\u00a0\u00bb pour savoir si le prix des options sera par figurine de l&rsquo;unit\u00e9 ou non. Une option comprend une liste de choix. Un choix a un co\u00fbt, un type potentiel (magicitems par exemple), une limitation potentielle pour d\u00e9terminer combien de fois on peut ajouter l&rsquo;objet, un globalid potentiel si le choix est li\u00e9 \u00e0 un autre choix et une liste de conditions. Les conditions sont l\u00e0 pour activer ou non le choix selon les autres \u00e9l\u00e9ments s\u00e9lectionn\u00e9s. Une condition est soit globale (la v\u00e9rification se fera sur l&rsquo;ensemble de la liste pour savoir si la condition est remplie) soit locale (la v\u00e9rification se fait uniquement sur l&rsquo;unit\u00e9 en cours). On v\u00e9rifie si l&rsquo;\u00e9l\u00e9ment existe ou non selon la valeur de \u00ab\u00a0exist\u00a0\u00bb, et si la condition est remplie l&rsquo;utilisateur a le droit de s\u00e9lectionner ce choix. Par exemple pour le g\u00e9n\u00e9ral on met une \u00ab\u00a0globalid\u00a0\u00bb \u00e0 102 sur toutes les entr\u00e9es qui permettent de choisir le g\u00e9n\u00e9ral, et on teste dans la condition s&rsquo;il n&rsquo;y a pas d\u00e9j\u00e0 une \u00ab\u00a0globalid\u00a0\u00bb \u00e0 102 qui existe (du coup d\u00e8s que vous ajoutez une unit\u00e9 en ayant s\u00e9lectionn\u00e9 g\u00e9n\u00e9ral vous ne pourrez plus s\u00e9lectionner cette option sur les autres unit\u00e9s).<br \/>\nEnfin un choix peut \u00eatre une monture, auquel cas on rempli l&rsquo;attribut \u00ab\u00a0mount\u00a0\u00bb avec l&rsquo;id de la monture correspondante.<\/p>\n<p>Pour les unit\u00e9s, il faut rajouter les informations \u00ab\u00a0modelcost\u00a0\u00bb, \u00ab\u00a0maxmodels\u00a0\u00bb et \u00ab\u00a0limitation\u00a0\u00bb qui d\u00e9terminent respectivement le co\u00fbt par figurine, le nombre max de figurines qu&rsquo;on peut rajouter \u00e0 l&rsquo;unit\u00e9 et le nombre max d&rsquo;unit\u00e9s qu&rsquo;on peut prendre.<\/p>\n<p>Au niveau des globalid utilis\u00e9es, il faut soit qu&rsquo;elles soient uniques dans le fichier soit qu&rsquo;elles soient \u00e0 :<\/p>\n<ul>\n<li>102 pour le g\u00e9n\u00e9ral<\/li>\n<li>101 pour la GB<\/li>\n<li>100 pour le porte \u00e9tendard v\u00e9t\u00e9ran<\/li>\n<\/ul>\n<p>Ces valeurs n&rsquo;ont pas d&rsquo;impact sur le fonctionnement local, mais avoir des valeurs fixes pour des conditions communes \u00e0 tous les fichiers me permet de retrouver rapidement un g\u00e9n\u00e9ral, une GB ou un v\u00e9t\u00e9ran dans les fichiers.<\/p>\n<p>Dans le cas d&rsquo;un perso \u00e0 profil multiple comme \u00e7a se fait chez les BH par exemple (le perso a 2 profils, \u00e0 x points et y points qui lui donnent des options, des r\u00e8gles et des co\u00fbts diff\u00e9rents) il faut faire 2 entr\u00e9es diff\u00e9rentes et les traiter comme 2 personnages diff\u00e9rents.<\/p>\n<pre>  \"army\": [\n    {\n      \"organisation\": \"1\",\n      \"units\": [\n        {\n          \"name\": \"Marshal\",\n          \"cost\": 160,\n          \"type\": \"1\",\n          \"base\": \"1\",\n          \"rules\": [\n            {\n              \"name\": \"Marshal\",\n              \"M\": \"4\",\n              \"WS\": \"5\",\n              \"BS\": \"5\",\n              \"S\": \"4\",\n              \"T\": \"4\",\n              \"W\": \"3\",\n              \"I\": \"5\",\n              \"A\": \"3\",\n              \"Ld\": \"9\",\n              \"specialrules\": [\n                {\n                  \"specialrule\": \"Orders\"\n                }\n              ],\n              \"equipments\": [\n                {\n                  \"equipment\": \"Plate Armour\"\n                }\n              ]\n            }\n          ],\n          \"options\": [\n            {\n              \"name\": \"Options\",\n              \"onechoice\": false,\n              \"choices\": [\n                {\n                  \"globalid\": \"101\",\n                  \"name\": \"BSB\",\n                  \"cost\": 0,\n                  \"condition\": [\n                    {\n                      \"option\": \"102\",\n                      \"global\": false,\n                      \"exist\": false\n                    },\n                    {\n                      \"option\": \"101\",\n                      \"global\": true,\n                      \"exist\": false\n                    }\n                  ]\n                },\n                {\n                  \"globalid\": \"102\",\n                  \"name\": \"general\",\n                  \"cost\": 0,\n                  \"condition\": [\n                    {\n                      \"option\": \"101\",\n                      \"global\": false,\n                      \"exist\": false\n                    },\n                    {\n                      \"option\": \"102\",\n                      \"global\": true,\n                      \"exist\": false\n                    }\n                  ]\n                },\n                {\n                  \"name\": \"shield\",\n                  \"cost\": 6\n                },\n                {\n                  \"name\": \"barding\",\n                  \"cost\": 30,\n                  \"condition\": [\n                    {\n                      \"option\": \"4\",\n                      \"global\": false,\n                      \"exist\": true\n                    }\n                  ]\n                },\n                {\n                  \"name\": \"pistol\",\n                  \"cost\": 12\n                },\n                {\n                  \"type\": \"magicitems\",\n                  \"name\": \"magic items\",\n                  \"cost\": 100,\n                  \"condition\": [\n                    {\n                      \"option\": \"101\",\n                      \"global\": false,\n                      \"exist\": true\n                    }\n                  ]\n                },\n                {\n                  \"type\": \"magicitems\",\n                  \"name\": \"magic items\",\n                  \"cost\": 200,\n                  \"condition\": [\n                    {\n                      \"option\": \"2\",\n                      \"global\": false,\n                      \"exist\": false\n                    },\n                    {\n                      \"option\": \"101\",\n                      \"global\": false,\n                      \"exist\": false\n                    }\n                  ]\n                },\n                {\n                  \"type\": \"magicitems\",\n                  \"name\": \"magic items\",\n                  \"cost\": 50,\n                  \"condition\": [\n                    {\n                      \"option\": \"2\",\n                      \"global\": false,\n                      \"exist\": true\n                    }\n                  ]\n                }\n              ]\n            },\n            {\n              \"name\": \"Weapons\",\n              \"onechoice\": true,\n              \"choices\": [\n                {\n                  \"name\": \"paired weapons\",\n                  \"cost\": 6\n                },\n                {\n                  \"name\": \"great weapon\",\n                  \"cost\": 8\n                },\n                {\n                  \"name\": \"hallberd\",\n                  \"cost\": 8\n                },\n                {\n                  \"name\": \"lance\",\n                  \"cost\": 12\n                }\n              ]\n            },\n            {\n              \"name\": \"Upgrades\",\n              \"onechoice\": true,\n              \"choices\": [\n                {\n                  \"name\": \"great tactician\",\n                  \"cost\": 60,\n                  \"limitation\": 1\n                },\n                {\n                  \"globalid\": \"2\",\n                  \"name\": \"imperial prince\",\n                  \"cost\": 180,\n                  \"limitation\": 1,\n                  \"condition\": [\n                    {\n                      \"option\": \"102\",\n                      \"global\": false,\n                      \"exist\": true\n                    }\n                  ]\n                }\n              ]\n            },\n            {\n              \"name\": \"Mounts\",\n              \"onechoice\": true,\n              \"choices\": [\n                {\n                  \"globalid\": \"4\",\n                  \"mount\": \"1\",\n                  \"cost\": 40\n                },\n                {\n                  \"mount\": \"2\",\n                  \"cost\": 140\n                },\n                {\n                  \"mount\": \"3\",\n                  \"cost\": 220,\n                  \"condition\": [\n                    {\n                      \"option\": \"101\",\n                      \"global\": false,\n                      \"exist\": false\n                    }\n                  ]\n                },\n                {\n                  \"mount\": \"4\",\n                  \"cost\": 520,\n                  \"condition\": [\n                    {\n                      \"option\": \"2\",\n                      \"global\": false,\n                      \"exist\": true\n                    },\n                    {\n                      \"option\": \"101\",\n                      \"global\": false,\n                      \"exist\": false\n                    }\n                  ]\n                }\n              ]\n            }\n          ]\n        },{\n          \"name\": \"Flagellants\",\n          \"cost\": 160,\n          \"size\": 10,\n          \"modelcost\": 20,\n          \"maxmodels\": 15,\n          \"limitation\": 3,\n          \"type\": \"1\",\n          \"base\": \"1\",\n          \"rules\": [\n            {\n              \"name\": \"Flagellants\",\n              \"M\": \"4\",\n              \"WS\": \"3\",\n              \"BS\": \"3\",\n              \"S\": \"3\",\n              \"T\": \"4\",\n              \"W\": \"1\",\n              \"I\": \"3\",\n              \"A\": \"1\",\n              \"Ld\": \"6\",\n              \"specialrules\": [\n                {\n                  \"specialrule\": \"Zealots\"\n                },\n                {\n                  \"specialrule\": \"Fanatical\"\n                },\n                {\n                  \"specialrule\": \"Unbreakable\"\n                }\n              ],\n              \"equipments\": [\n                {\n                  \"equipment\": \"Bow\"\n                }\n              ]\n            }\n          ],\n          \"options\": [\n            {\n              \"name\": \"Options\",\n              \"onechoice\": false,\n              \"choices\": [\n                {\n                  \"name\": \"Champion\",\n                  \"cost\": 20\n                }\n              ]\n            }\n          ]\n        }<\/pre>\n<p>Voici les valeurs actuellement disponibles pour les types et les bases, il en manque surement donc il faudra les rajouter au fur \u00e0 mesure :<\/p>\n<pre>\n{\n    \"types\": [\n      {\n        \"id\": \"1\",\n        \"name\": \"Infantry\"\n      },\n      {\n        \"id\": \"2\",\n        \"name\": \"War Beast\"\n      },\n      {\n        \"id\": \"3\",\n        \"name\": \"Monstruous Beast\"\n      },\n      {\n        \"id\": \"4\",\n        \"name\": \"Monster\"\n      },\n      {\n        \"id\": \"5\",\n        \"name\": \"Cavalry\"\n      },\n      {\n        \"id\": \"6\",\n        \"name\": \"Chariot\"\n      }\n    ],\n    \"bases\": [\n      {\n        \"id\": \"1\",\n        \"name\": \"20x20\"\n      },\n      {\n        \"id\": \"2\",\n        \"name\": \"25x50\"\n      },\n      {\n        \"id\": \"3\",\n        \"name\": \"40x40\"\n      },\n      {\n        \"id\": \"4\",\n        \"name\": \"50x100\"\n      },\n      {\n        \"id\": \"5\",\n        \"name\": \"50x75\"\n      }\n    ]\n  }\n<\/pre>\n<p>Pour cr\u00e9er le fichier json le mieux est probablement d&rsquo;utiliser un \u00e9diteur type <a href=\"http:\/\/jsoneditoronline.org\/\">http:\/\/jsoneditoronline.org\/<\/a> et de partir d&rsquo;un fichier de donn\u00e9es existants. J&rsquo;ai mis un fichier complet \u00e0 disposition <a href=\"https:\/\/docs.google.com\/document\/d\/1gmpZxVOYbTvkfGVi5UFC-DlJ6reViMDHiLiOG31K6rk\/edit?usp=sharing\">ici<\/a>\u00a0. Il faut copier le contenu du fichier et le coller dans la zone gauche de l\u2019\u00e9diteur, puis cliquer sur la fl\u00e8che au centre vers la droite pour obtenir la structure du json.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>L&rsquo;application utilise des fichiers jsons pour charger les donn\u00e9es des arm\u00e9es. Le format actuel contient : Description de l&rsquo;organisation de l&rsquo;arm\u00e9e : { \u00ab\u00a0organisation\u00a0\u00bb: [ { \u00ab\u00a0id\u00a0\u00bb: \u00ab\u00a01\u00a0\u00bb, \u00ab\u00a0name\u00a0\u00bb: \u00ab\u00a0Characters\u00a0\u00bb, \u00ab\u00a0percent\u00a0\u00bb: 40, \u00ab\u00a0type\u00a0\u00bb: \u00ab\u00a0max\u00a0\u00bb }, { \u00ab\u00a0id\u00a0\u00bb: \u00ab\u00a02\u00a0\u00bb, \u00ab\u00a0name\u00a0\u00bb: \u00ab\u00a0Core\u00a0\u00bb, \u00ab\u00a0percent\u00a0\u00bb: 25, \u00ab\u00a0type\u00a0\u00bb: \u00ab\u00a0min\u00a0\u00bb }, { \u00ab\u00a0id\u00a0\u00bb: \u00ab\u00a03\u00a0\u00bb, \u00ab\u00a0name\u00a0\u00bb: \u00ab\u00a0Special\u00a0\u00bb, \u00ab\u00a0percent\u00a0\u00bb: 100, \u00ab\u00a0type\u00a0\u00bb: \u00ab\u00a0max\u00a0\u00bb }, [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":2624,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[11],"class_list":["post-2705","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-non-classe","tag-application-t9a"],"_links":{"self":[{"href":"https:\/\/danslateteduntype.com\/index.php?rest_route=\/wp\/v2\/posts\/2705","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/danslateteduntype.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/danslateteduntype.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/danslateteduntype.com\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/danslateteduntype.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2705"}],"version-history":[{"count":0,"href":"https:\/\/danslateteduntype.com\/index.php?rest_route=\/wp\/v2\/posts\/2705\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/danslateteduntype.com\/index.php?rest_route=\/wp\/v2\/media\/2624"}],"wp:attachment":[{"href":"https:\/\/danslateteduntype.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2705"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/danslateteduntype.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2705"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/danslateteduntype.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2705"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}