{"id":321,"date":"2023-04-27T19:20:00","date_gmt":"2023-04-27T17:20:00","guid":{"rendered":"https:\/\/tutos.jusdeliens.com\/?p=321"},"modified":"2023-04-27T19:20:00","modified_gmt":"2023-04-27T17:20:00","slug":"pytactx-creez-vos-propres-regles-du-jeu","status":"publish","type":"post","link":"https:\/\/tutos.jusdeliens.com\/index.php\/2023\/04\/27\/pytactx-creez-vos-propres-regles-du-jeu\/","title":{"rendered":"Cr\u00e9ez votre Ova Arena avec PytactX \ud83c\udfb2"},"content":{"rendered":"\n<p>Vous avez aim\u00e9 PytactX et vous aimeriez cr\u00e9er votre propre ar\u00e8ne avec vos propres r\u00e8gles du jeu en Python ? Ce tutoriel est fait pour vous !<\/p>\n\n\n\n<p>Vous y apprendrez comment devenir l&#8217;architecte de votre Ova Arena pour pouvoir tout personnaliser : les graphiques, les personnages, les armes, la carte de jeu &#8230;<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><img decoding=\"async\" src=\"https:\/\/tutos.jusdeliens.com\/wp-content\/uploads\/2024\/01\/GalactX.gif\" alt=\"\" class=\"wp-image-508\"\/><\/figure><\/div>\n\n\n\n<!--more-->\n\n\n\n<h3 class=\"wp-block-heading\"> \u2699\ufe0f Pr\u00e9requis<\/h3>\n\n\n\n<ul class=\"wp-block-list\"><li>Un ordinateur reli\u00e9 \u00e0 Internet avec un navigateur web Chrome ou Firefox install\u00e9<\/li><li>Un environnement de d\u00e9veloppement Python install\u00e9 sur votre machine (ex: <a href=\"https:\/\/code.visualstudio.com\/download\">VSCode<\/a>) ou bien un compte sur un IDE en ligne (<a href=\"https:\/\/replit.com\/signup\">Replit<\/a>)<\/li><li>L&#8217;API de pytactx v2, \ud83d\udc49<a href=\"https:\/\/replit.com\/@jusdeliens\/pytactxv2\">forkable sur replit<\/a>,  ou <a rel=\"noreferrer noopener\" href=\"https:\/\/github.com\/jusdeliens\/pytactx\" target=\"_blank\">clonable sur github<\/a><\/li><li>De bonnes notions de Python (<a href=\"https:\/\/openclassrooms.com\/fr\/courses\/7168871-apprenez-les-bases-du-langage-python#table-of-content\">partie 1 et 2 du super tuto OpenClassroom<\/a>) <\/li><li>Une <a href=\"https:\/\/jusdeliens.com\/ideal-tarifs\/\">ar\u00e8ne priv\u00e9e bas\u00e9e sur le moteur de jeu PytactX<\/a><\/li><li>De la patience et une volont\u00e9 de fer !<\/li><li>Avoir vu la trilogie Matrix ^^<\/li><\/ul>\n\n\n\n<p class=\"has-background\" style=\"background-color:#d4efff\">\ud83d\udd0d <strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-cyan-blue-color\">Information<\/mark><\/strong><br>Pour aller plus vite ou si vous \u00eates bloqu\u00e9, n\u2019h\u00e9sitez pas \u00e0 nous contacter <a href=\"https:\/\/jusdeliens.com\/contact\/\">ici<\/a> si vous souhaitez des cours particuliers en pr\u00e9sentiel ou distanciel \ud83d\ude09<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\ud83d\udc6e Tout est Agent<\/h3>\n\n\n\n<p>Avec l&#8217;API PyTactX, vous incarnez un agent (un robot virtuel) dans une ar\u00e8ne, qui ex\u00e9cute \u00e0 la lettre les requ\u00eates que vous lui avez dict\u00e9es dans votre script Python.<\/p>\n\n\n\n<p>Dans le <a href=\"https:\/\/tutos.jusdeliens.com\/index.php\/2020\/01\/14\/pytactx-prise-en-main\/\">premier tutoriel<\/a>, vous avez pris en main les variables et les fonctions de cet agent pour le faire \u00e9voluer dans une ar\u00e8ne. <\/p>\n\n\n\n<p>Gr\u00e2ce \u00e0 la fonction <strong>agent.update()<\/strong>, votre script envoyait les requ\u00eates pr\u00e9c\u00e9demment formul\u00e9es (par exemple <strong>agent.moveTowards(5,5)<\/strong> pour se d\u00e9placer vers le milieu de l&#8217;ar\u00e8ne) au serveur de jeu. Ce dernier v\u00e9rifiait la validit\u00e9 de la requ\u00eate (est-ce que vous \u00eates encore en vie, est-ce qu&#8217;il n&#8217;y a personne sur votre chemin) et si tout \u00e9tait valide, le serveur vous renvoyait ensuite le nouvel \u00e9tat de votre agent, que vous pouviez interroger apr\u00e8s l&#8217;appel de la fonction <strong>agent.update()<\/strong> gr\u00e2ce \u00e0 ses variables d&#8217;\u00e9tat (<strong>agent.life<\/strong>, <strong>agent.x<\/strong>, <strong>agent.y<\/strong> &#8230;).<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/tutos.jusdeliens.com\/wp-content\/uploads\/2024\/01\/image-1-1024x530.png\" alt=\"\" class=\"wp-image-506\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/tutos.jusdeliens.com\/wp-content\/uploads\/2024\/01\/image-1024x529.png\" alt=\"\" class=\"wp-image-505\"\/><\/figure>\n\n\n\n<p>Pour cr\u00e9er votre propre jeu, nous allons faire de m\u00eame en d\u00e9veloppant et en ex\u00e9cutant un script d&#8217;un agent un peu sp\u00e9cial, qu&#8217;on nommera <strong>arbiter<\/strong>, qui sera charg\u00e9 de surveiller l&#8217;\u00e9tat du jeu (gr\u00e2ce \u00e0 ses variables <strong>arbiter.game <\/strong>et <strong>arbiter.range<\/strong>) et de modifier l&#8217;\u00e9tat du jeu et de l&#8217;ar\u00e8ne gr\u00e2ce \u00e0 sa fonction <strong>arbiter.ruleArena<\/strong>.<\/p>\n\n\n\n<p>Pour donner \u00e0 votre agent arbitre les supers pouvoirs de N\u00e9o (comme le droit de modifier l&#8217;ar\u00e8ne, de se t\u00e9l\u00e9porter, d&#8217;\u00eatre invisible des autres agents et invincible), il faudra \u00e0 sa cr\u00e9ation lui donner un nom sp\u00e9cifique qui vous sera communiqu\u00e9 lors de la cr\u00e9ation de votre <a href=\"https:\/\/jusdeliens.com\/ideal-tarifs\/\">ar\u00e8ne priv\u00e9e<\/a>. <\/p>\n\n\n\n<p class=\"has-background\" style=\"background-color:#ead1d1\">\u26d4 <strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-red-color\">Important<\/mark><\/strong><br>Il ne peut y avoir <strong>qu&#8217;un seul agent avec le m\u00eame nom connect\u00e9 \u00e0 la fois<\/strong> dans une ar\u00e8ne. A votre charge donc de traiter votre arbitre comme <strong>celui-dont-on-ne-doit-pas-prononcer-le-nom<\/strong> ! <strong>Ne communiquez jamais son nom ni votre programme de mani\u00e8re publique<\/strong> ! Si vous \u00eates amen\u00e9 \u00e0 travail sur des repositories publiques (github, gitlab, replit&#8230;), asserez-vous de stocker le mot de passe dans un fichier .env \u00e0 rajouter dans un .ignore pour ne jamais le commit (sur github, gitlab par exemple), ou bien <strong>utilisez la fonction<\/strong> <strong>getpass()<\/strong> (du module du m\u00eame nom) en Python dans votre code pour rentrer son nom \u00e0 chaque ex\u00e9cution dans la console.<\/p>\n\n\n\n<p class=\"has-background\" style=\"background-color:#d4efff\">\ud83d\udd0d <strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-cyan-blue-color\">Information<\/mark><\/strong><br>M\u00eame sans super pouvoir, tout agent &#8220;normal&#8221; peut surveiller l&#8217;\u00e9tat du jeu et calculer des scores et impl\u00e9menter d&#8217;autres r\u00e8gles du jeu en surveillant ses variables <strong>agent.game <\/strong>et <strong>agent.range<\/strong>. Cependant, il ne pourra pas changer l&#8217;\u00e9tat du jeu, seul l&#8217;arbitre \u00e0 ce privil\u00e8ge.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"le-maitre-des-cles\">\ud83d\udd11 Le ma\u00eetre des cl\u00e9s<\/h3>\n\n\n\n<p>Comment impl\u00e9menter nos r\u00e8gles du jeu dans le script de cet Agent arbitre ?<\/p>\n\n\n\n<p>Et bien gr\u00e2ce \u00e0 ces 2 variables dictionnaires <strong><strong>arbiter<\/strong>.game <\/strong>et <strong><strong>arbiter<\/strong>.range <\/strong>contenant de nombreuses cl\u00e9s qui vous permettront de personnaliser le jeu \u00e0 l&#8217;infini !<\/p>\n\n\n\n<p>Dans la variable <strong>arbiter.game<\/strong>, sont inventori\u00e9s en temps r\u00e9el toutes les r\u00e8gles ainsi que l&#8217;\u00e9tat du jeu. En guise de documentation, voici le dictionnaire initial de toute ar\u00e8ne bas\u00e9e sur le moteur TactX. Dans ce dictionnaire, les cl\u00e9:valeur  <\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><strong>&#8220;ini&#8221;<\/strong> : valeur donn\u00e9e \u00e0 la r\u00e9initialisation de l&#8217;ar\u00e8ne. Ce sont uniquement les valeurs associ\u00e9es \u00e0 cette cl\u00e9 &#8220;ini&#8221; qui sont pr\u00e9sentes dans leur dico <strong>agent.game<\/strong> (si la cl\u00e9 <strong>publish<\/strong> est \u00e0 True).<\/li><li><strong>&#8220;?fr&#8221; <\/strong>explique le r\u00f4le de chaque r\u00e8gle cl\u00e9 de ce dictionnaire en guise de wiki<\/li><li><strong>&#8220;version&#8221;<\/strong> indique la version du moteur TactX \u00e0 partir de laquelle la cl\u00e9 et la fonctionnalit\u00e9 est impl\u00e9ment\u00e9e. <\/li><li><strong>&#8220;group&#8221;<\/strong> indique que si une modification de dimension sur une cl\u00e9 du groupe est faite (ex: ajout d&#8217;un profile d&#8217;un joueur), toutes les autres cl\u00e9s du m\u00eame groupe seront redimensionn\u00e9es \u00e9galement<\/li><li><strong>&#8220;reset&#8221;<\/strong> indique qu&#8217;une modification de la r\u00e8gle entra\u00eenera un reset de l&#8217;ar\u00e8ne<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code><mark data-darkreader-inline-bgcolor=\"\" style=\"background-color: rgba(0, 0, 0, 0); --darkreader-inline-bgcolor: rgba(0, 0, 0, 0);\" class=\"has-inline-color has-light-green-cyan-color\"># \ud83d\udeb7 R\u00e8gles pour g\u00e9rer les joueurs<\/mark>\n<strong>\"score\" <\/strong>: { \"?fr\":\"Classe pour le calcul du score et rank: ''=aucun calcul fait par l'arene, 'DM':compte ratio kill\/death+fire\/hits, 'Race':course de checkpoints avec START et FINISH, 'TSP':course du voyageur sur checkpoints\", \"publish\":True, \"ini\":\n\t\"DM\" },\n<strong>\"hitTeam\" <\/strong>: { \"?fr\":\"Si oui ou non tir et degat ami possible entre agents de m\u00eame team\", \"publish\":False, \"ini\":\n\tTrue },\n<strong>\"acls\" <\/strong>: { \"?fr\":\"Dico des joueurs consult\u00e9 \u00e0 chaque connexion. ClientId en cl\u00e9.\", \"publish\":False, \"ini\":\n\t{\n\t\t\"@arbiter\": {\n\t\t\t\"player\": \"Arbitre\",\n\t\t\t\"robot\": \"\",\n\t\t\t\"team\": 0,\n\t\t\t\"profile\": 3\n\t\t}\n\t} },\n\n<mark data-darkreader-inline-bgcolor=\"\" style=\"background-color: rgba(0, 0, 0, 0); --darkreader-inline-bgcolor: rgba(0, 0, 0, 0);\" class=\"has-inline-color has-light-green-cyan-color\"># \ud83d\uddbc\ufe0f R\u00e8gle pour customiser l'ar\u00e8ne : taille, images, couleurs ...<\/mark>\n<strong>\"gridColumns\" <\/strong>: { \"?fr\":\"Nombre de colonnes dans la grille\", \"min\":0, \"max\":50, \"publish\":True, \"reset\":True, \"ini\":\n\t29 },\n<strong>\"gridRows\"<\/strong> : { \"?fr\":\"Nombre de lignes dans la grille\", \"min\":0, \"max\":50, \"publish\":True, \"reset\":True, \"ini\":\n\t29 },\n<strong>\"bgImg\"<\/strong> : { \"?fr\":\"Url de l'image de fond\", \"publish\":True, \"ini\":\n\t\"bg.jpg\" },\n<strong>\"bgColor\" <\/strong>: { \"?fr\":\"Code rgba du fond de l'ar\u00e8ne par dessus bgImg\", \"publish\":True, \"ini\":\n\t&#91;255,255,255,0.4] },\n<strong>\"gridColor\"<\/strong> : { \"?fr\":\"Code rgba des lignes et colonnes de l'ar\u00e8ne\", \"publish\":True, \"ini\":\n\t&#91;255,255,255,0.4] },\n<strong>\"hitImg\" <\/strong>: { \"?fr\":\"Url de l'image de d\u00e9gat. Cercle rouge par d\u00e9faut\", \"publish\":True, \"ini\":\n\t\"\" },\n<strong>\"gravity\"<\/strong> : { \"?fr\":\"Appliquer une force de gravit\u00e9 avec le vecteur sp\u00e9cifi\u00e9 et faire tomber tous les agents avec une masse. (0,0) pour d\u00e9sactiver, (0,9.81) pour faire tomber en bas de la carte.\", \"publish\":True, \"ini\":\n\t(0,0) },\n<strong>\"spawnMode\"<\/strong> : {\"?fr\":\"Selection du mode de spawn des joueurs. 0=n'importe o\u00f9, 1=dans spawnAreas, 2=sur zone selon teamSpawn\", \"min\":0, \"max\":2, \"publish\":True, \"version\":203, \"ini\":\n\t1 },\n\n<mark data-darkreader-inline-bgcolor=\"\" style=\"background-color: rgba(0, 0, 0, 0); --darkreader-inline-bgcolor: rgba(0, 0, 0, 0);\" class=\"has-inline-color has-light-green-cyan-color\">#<\/mark> \ud83c\udfc1 <mark data-darkreader-inline-bgcolor=\"\" style=\"background-color: rgba(0, 0, 0, 0); --darkreader-inline-bgcolor: rgba(0, 0, 0, 0);\" class=\"has-inline-color has-light-green-cyan-color\">R\u00e8gles de la map et des cases <\/mark>\n<strong>\"borderHit\"<\/strong> : {\"?fr\":\"Enl\u00e8ve des points de vie si l'agent tente de sortir de la map\", \"min\":0, \"max\":10000, \"publish\":True, \"ini\":\n\t1 },\n<strong>\"brownianMap\"<\/strong> : {\"?fr\":\"True pour faire en sorte que les 2 bords oppos\u00e9s de la carte soient contigues, comme snake\", \"publish\":True, \"ini\":\n\tTrue },\n<strong>\"canLeaveMap\"<\/strong> : {\"?fr\":\"Si oui ou non possible de sortir de la map\", \"publish\":True, \"version\": 203, \"ini\":\n\tFalse },\n<strong>\"map\"<\/strong> : {\"?fr\":\"Liste 2D de profile d'obstacles sur la grille. Valeur int correspond au profile d'obstacle\", \"publish\":True, \"ini\":\n\t&#91;] },\n<strong>\"mapRand\"<\/strong> : {\"?fr\":\"Generation random d'obstacle sur la grille\", \"publish\":False, \"ini\":\n\tTrue },\n<strong>\"mapRandFreq\"<\/strong> : {\"?fr\":\"Frequence random d'obstacle sur la grille\", \"publish\":False, \"ini\":\n\t0.10 },\n<strong>\"mapImgs\"<\/strong> : { \"?fr\":\"Url des images de chaque profiles d'obstacle. Chaine vide => dessin cercle. Possible code rgba()\", \"publish\":True, \"group\":\"tiles\", \"ini\":\n\t&#91;\"\", \"\"] },\n<strong>\"mapFriction\"<\/strong> : { \"?fr\":\"Coef de friction de la case. 0: pas d'obstacle, 1: insurmontable\", \"publish\":True, \"group\":\"tiles\", \"ini\":\n\t&#91;0.0, 1.0] },\n<strong>\"mapHit\"<\/strong> : { \"?fr\":\"D\u00e9gats inflig\u00e9s en cas de collision avec la case\", \"publish\":True, \"group\":\"tiles\", \"ini\":\n\t&#91;0, 10] },\n<strong>\"mapBreakable\"<\/strong> : { \"?fr\":\"Si oui ou non la case peut \u00eatre cass\u00e9e par collision\", \"publish\":True, \"group\":\"tiles\", \"ini\":\n\t&#91;False, True] },\n\n<mark data-darkreader-inline-bgcolor=\"\" style=\"background-color: rgba(0, 0, 0, 0); --darkreader-inline-bgcolor: rgba(0, 0, 0, 0);\" class=\"has-inline-color has-light-green-cyan-color\">#<\/mark> \ud83d\udea9 <mark data-darkreader-inline-bgcolor=\"\" style=\"background-color: rgba(0, 0, 0, 0); --darkreader-inline-bgcolor: rgba(0, 0, 0, 0);\" class=\"has-inline-color has-light-green-cyan-color\">R\u00e8gles des checkpoints pour mode course<\/mark>\n<strong>\"checkpoints\"<\/strong> : {\"?fr\":\"Dict des checkpoints avec cl\u00e9s et valeurs telles que 'labelCp':{'x':intSurMap,'y':intSurMap,'i':idLabel, 'l':{labelLinkedNodeStr:intWeight}}\", \"publish\":True, \"version\": 203, \"ini\":\n\t{} },\n<strong>\"cpGraphml\"<\/strong> : {\"?fr\":\"Url vers fichier des checkpoints au reset g\u00e9n\u00e9r\u00e9 via export sur https:\/\/graphonline.ru\/fr\", \"publish\":True, \"version\": 203, \"ini\":\n\t\"graphml.txt\" },\n<strong>\"cpRandN\"<\/strong> : {\"?fr\":\"Nombre de noeuds g\u00e9n\u00e9r\u00e9s al\u00e9atoirement pour graphe au reset. 0 pour d\u00e9sactiver. Si > 0, ne tient pas compte de cpGraphml.\", \"publish\":True, \"version\": 244, \"ini\":\n\t0 },\n<strong>\"cpRandMode\"<\/strong> : {\"?fr\":\"Mode de course pour la g\u00e9n\u00e9ration du graphe al\u00e9atoire. 0=Voyageur du commerce avec que 1 noeud START (=FINISH), 1=Course START!=FINISH.\", \"publish\":True, \"version\": 244, \"ini\":\n\t0 },\n<strong>\"cpRandFreq\"<\/strong> : {\"?fr\":\"Probabilit\u00e9 de lien entre noeuds sur graphe g\u00e9n\u00e9r\u00e9 al\u00e9atoirement. 0=aucun lien, 1=tous les noeuds sont reli\u00e9s entre eux. 0 pour d\u00e9sactiver.\", \"publish\":True, \"version\": 244, \"ini\":\n\t1.0 },\n\n<mark data-darkreader-inline-bgcolor=\"\" style=\"background-color: rgba(0, 0, 0, 0); --darkreader-inline-bgcolor: rgba(0, 0, 0, 0);\" class=\"has-inline-color has-light-green-cyan-color\">#<\/mark> \ud83d\uddfa\ufe0f <mark data-darkreader-inline-bgcolor=\"\" style=\"background-color: rgba(0, 0, 0, 0); --darkreader-inline-bgcolor: rgba(0, 0, 0, 0);\" class=\"has-inline-color has-light-green-cyan-color\">R\u00e8gles par zone<\/mark>\n<strong>\"areas\"<\/strong> : { \"?fr\":\"Nom des zones\", \"publish\":True, \"version\":203, \"group\": \"areas\", \"ini\": \n\t&#91;\"SPAWN ZONE\", \"KILL REWARD ZONE\"] },\n<strong>\"aIcons\"<\/strong> : { \"?fr\":\"Nom des zones\", \"publish\":True, \"version\":206, \"group\": \"areas\", \"ini\":\n\t&#91;\"\u2764\ufe0f\u200d\ud83e\ude79\", \"\ud83d\udd2b\u2b50\"] },\n<strong>\"areasColor\"<\/strong> : { \"?fr\":\"Couleur de chaque equipe en code RGBA\", \"publish\":True, \"version\": \"203\", \"group\": \"areas\", \"ini\":\n\t&#91;&#91;0,0,0,0], &#91;0,0,0,0.2]] },\n<strong>\"areasX\"<\/strong> : { \"?fr\":\"Abscisse des zones\", \"publish\":True, \"version\":203, \"group\": \"areas\", \"ini\":\n\t&#91;0, 0] },\n<strong>\"areasY\"<\/strong> : { \"?fr\":\"Ordonn\u00e9e des zones\", \"publish\":True, \"version\":203, \"group\": \"areas\", \"ini\":\n\t&#91;0, 0] },\n<strong>\"areasW\"<\/strong> : { \"?fr\":\"Largeur des zones. 0=Toute la largeur possible\", \"publish\":True, \"version\":203, \"group\": \"areas\", \"ini\":\n\t&#91;1, 0] },\n<strong>\"areasH\"<\/strong> : { \"?fr\":\"Hauteur des zones 0=Toute la hauteur possible\", \"publish\":True, \"version\":203, \"group\": \"areas\", \"ini\":\n\t&#91;1, 0] },\n<strong>\"areasPUps\"<\/strong> : { \"?fr\":\"Power ups accord\u00e9es quand joueur sur zone actif pendant dureeMs, par zone un dico de {attributNom:&#91;valeur,dureeMs,opStr]} avec opStr operateur soit '=','+'ou'*, et attributNom soit attribut player soit nom cl\u00e9 profile player\", \"publish\":True, \"version\":206, \"group\": \"areas\", \"ini\":\n\t&#91;{\"life\":&#91;100,0,'=']}, {\"life\":&#91;20,10000,'+'],\"ammo\":&#91;10,10000,'+']}] },\n<strong>\"areasPUpsDt\"<\/strong> : { \"?fr\":\"Power ups accord\u00e9es quand joueur sur zone, toutes les dtMs sp\u00e9cifi\u00e9es\", \"publish\":True, \"version\":206, \"group\": \"areas\", \"ini\":\n\t&#91;10000, 1000] },\n<strong>\"areasPUpsEv\"<\/strong> : { \"?fr\":\"Power ups accord\u00e9es quand joueur sur zone, et que \u00e9v\u00e8nement survient sur attribut du joueur sp\u00e9cifi\u00e9. \ud83c\udd95Remplace cl\u00e9 KillReward depuis v206\ud83c\udd95\", \"publish\":True, \"version\":206, \"group\": \"areas\", \"ini\":\n\t&#91;&#91;], &#91;\"nKill\"]] },\n<strong>\"spawnAreas\"<\/strong> : { \"?fr\":\"Pr\u00e9cise les zones de naissance des agents si spawnMode=1\", \"publish\":True, \"version\":203, \"ini\":\n\t&#91;0] },\n\n<mark data-darkreader-inline-bgcolor=\"\" style=\"background-color: rgba(0, 0, 0, 0); --darkreader-inline-bgcolor: rgba(0, 0, 0, 0);\" class=\"has-inline-color has-light-green-cyan-color\"># <\/mark>\ud83d\udd2b<mark data-darkreader-inline-bgcolor=\"\" style=\"background-color: rgba(0, 0, 0, 0); --darkreader-inline-bgcolor: rgba(0, 0, 0, 0);\" class=\"has-inline-color has-light-green-cyan-color\"> R\u00e8gles par profile d'arme<\/mark>\n<strong>\"weapons\"<\/strong> : { \"?fr\":\"Liste des profiles d'armes avec stats diff\u00e9rentes. 'none' pour ne pas afficher de rendu dans le viewer\", \"publish\":True, \"group\": \"weapons\", \"ini\":\n\t&#91;\"none\", \"beam\", \"wave\", \"spray\", \"launcher\", \"force\"] },\n<strong>\"bullet\"<\/strong>:  { \"?fr\":\"Cr\u00e9er un agent projectile au tir avec le profile sp\u00e9cifi\u00e9. -1 pour aucune balle.\", \"publish\":True, \"group\": \"weapons\", \"ini\":\n\t&#91;-1,-1,-1,-1,4,-1] },\n<strong>\"wIcons\"<\/strong> : { \"?fr\":\"Liste des icones d'armes\", \"publish\":True, \"group\": \"weapons\", \"ini\":\n\t&#91;\"\", \"\ud83c\udf87\", \"\ud83d\udca3\", \"\ud83d\udd25\", \"\ud83d\ude80\", \"\ud83e\udd1c\"] },\n<strong>\"fireImgs\"<\/strong> : { \"?fr\":\"Url de l image de tir. Par defaut si vide : trait dans direction tir si spreadFire=0, sinon cercle\", \"publish\":True, \"group\": \"weapons\", \"ini\":\n\t&#91;\"\",\"\",\"\",\"\",\"\",\"\"] },\n<strong>\"dtFire\"<\/strong> : { \"?fr\":\"D\u00e9lai entre 2 tirs (en msecs)\", \"min\":0, \"max\":10000, \"publish\":True, \"group\": \"weapons\", \"ini\":\n\t&#91;300,300,300,300,1000,500] },\n<strong>\"hitFire\" <\/strong>: { \"?fr\":\"D\u00e9gats inflig\u00e9s par tir \u00e0 la victime\", \"min\":0, \"max\":100, \"publish\":True, \"group\": \"weapons\", \"ini\":\n\t&#91;0,10,10,10,0,0] },\n<strong>\"ownerFire\"<\/strong> : { \"?fr\":\"D\u00e9gats inflig\u00e9s \u00e9galement au tireur\", \"publish\":True, \"group\": \"weapons\", \"ini\":\n\t&#91;False,False,True,False,False,False] },\n<strong>\"rangeFire\"<\/strong> : { \"?fr\":\"Port\u00e9e de tir de l'arme. 0=infini\", \"min\":0, \"max\":100, \"publish\":True, \"group\": \"weapons\", \"ini\":\n\t&#91;0,5,10,10,1,2] },\n<strong>\"spreadFire\"<\/strong> : { \"?fr\":\"Angle d'ouverture en degr\u00e9s. 360=bombe, 0=laser.\", \"min\":0, \"max\":360, \"publish\":True, \"group\": \"weapons\", \"ini\":\n\t&#91;0,0,360,70,0,180] },\n<strong>\"accelerationFire\"<\/strong> : { \"?fr\":\"Amplitude d'acceleration inflig\u00e9e par tir \u00e0 la victime\", \"publish\":True, \"group\": \"weapons\", \"ini\":\n\t&#91;0,0,0,0,0,100] },\n<strong>\"ammoIni\"<\/strong> : { \"?fr\":\"Nombre de munitions par weapon. 0=infini \ud83c\udd95Liste par weapon et non plus par agent depuis v205\ud83c\udd95\", \"min\":0, \"max\":1000, \"publish\":True, \"group\": \"weapons\", \"ini\": \n\t&#91;100,100,1,100,2,1000] },\n\n#<mark data-darkreader-inline-bgcolor=\"\" style=\"background-color: rgba(0, 0, 0, 0); --darkreader-inline-bgcolor: rgba(0, 0, 0, 0);\" class=\"has-inline-color has-light-green-cyan-color\"> \ud83e\udd77 R\u00e8gles par profile de joueur<\/mark>\n<strong>\"profiles\"<\/strong> : { \"?fr\":\"Liste des profiles d'agents avec stats diff\u00e9rentes\", \"publish\":True, \"group\": \"profiles\", \"ini\": \n\t&#91;\"default\", \"arbitre\", \"bot1\", \"bot2\", \"rocket\"] },\n<strong>\"pIcons\"<\/strong> : { \"?fr\":\"Icone de chaque profiles de agents\", \"publish\":True, \"group\": \"profiles\", \"ini\": \n\t&#91;\"\", \"\ud83d\udc6e\u200d\", \"\ud83d\udc7e\",\"\ud83d\udc7e\", \"\"] },\n<strong>\"pImgs\"<\/strong> : { \"?fr\":\"Url des images de chaque profiles de agents. Chaine vide => dessin cercle\", \"publish\":True, \"group\": \"profiles\", \"ini\": \n\t&#91;\"spaceship1.png\", \"spaceship1.png\", \"spaceship1.png\", \"spaceship1.png\", \"rocket.svg\"] },\n<strong>\"pPnj\"<\/strong> : { \"?fr\":\"Classe d'ia pour request auto. IA possibles '':desactiver ia, 'Idle':inoffensive, 'StaticTurret:tourne sur soi-m\u00eame et tir, 'RandomMovingTurret':d\u00e9placement al\u00e9atoire et tir, 'SearchNDestroyBehaviour': agents dans metal gear solid 1\", \"publish\":True, \"group\": \"profiles\", \"ini\": \n\t&#91;\"\",\"\",\"Idle\",\"SearchNDestroy\", \"\"] },\n<strong>\"blind\"<\/strong> : { \"?fr\":\"Si True, d\u00e9sactive la MAJ de la distance frontale et du dico range par le serveur\", \"publish\":True, \"group\": \"profiles\", \"ini\": \n\t&#91;False,False,False,False,True] },\n<strong>\"range\"<\/strong> : { \"?fr\":\"Rayon de visibilite. En nb de cases. 0 pour tout voir.\", \"min\":0, \"max\":10, \"publish\":True, \"group\": \"profiles\", \"ini\": \n\t&#91;6,0,6,6,0] },\n<strong>\"spreadRange\"<\/strong> : { \"?fr\":\"Angle champs de vision en degr\u00e9s. Pris en compte pour range>0 uniquement. 360=lapin, 0=cheval avec oeill\u00e8re.\", \"min\":0, \"max\":360, \"publish\":True, \"group\": \"profiles\", \"ini\": \n\t&#91;50,360,50,50,360] },\n<strong>\"pWeapons\"<\/strong> : { \"?fr\":\"Liste de toutes les armes que peut prendre un joueur. Indice correspondant dans weapons.\", \"publish\":True, \"group\": \"profiles\", \"version\":205, \"ini\": \n\t&#91;&#91;1],&#91;1],&#91;1],&#91;1],&#91;2]] },\n<strong>\"dtWeapon\"<\/strong> : { \"?fr\":\"Temps en ms entre chaque changement possible d'arme du joueur\", \"min\":0, \"publish\":True, \"group\": \"profiles\", \"ini\": \n\t&#91;1,1,1,1,2] },\n<strong>\"weaponIni\"<\/strong> : { \"?fr\":\"Type d'arme du joueur d\u00e9but du jeu. Indice correspondant dans weapons. \ud83c\udd95Remplace 'weapon' depuis v205\ud83c\udd95\", \"min\":0, \"publish\":True, \"group\": \"profiles\", \"ini\": \n\t&#91;1,1,1,1,2] },\n<strong>\"fxFire\"<\/strong> : { \"?fr\":\"Si oui ou non fonction tir possible\", \"publish\":True, \"group\": \"profiles\", \"ini\": \n\t&#91;True,True,True,True,False] },\n<strong>\"hitCollision\"<\/strong> : { \"?fr\":\"D\u00e9gats inflig\u00e9s par collision\", \"min\":0, \"max\":100, \"publish\":True, \"group\": \"profiles\", \"ini\": \n\t&#91;10,0,10,10,0] },\n<strong>\"hitSelfCollision\"<\/strong> : { \"?fr\":\"D\u00e9gats inflig\u00e9s a soi-m\u00eame par collision\", \"min\":0, \"max\":100, \"publish\":True, \"group\": \"profiles\", \"ini\": \n\t&#91;0,0,0,0,10] },\n<strong>\"shieldFire\"<\/strong> : { \"?fr\":\"R\u00e9sitance aux d\u00e9gats inflig\u00e9s par tir en pourcentage. 0.0=prend 100\/100 de d\u00e9gat, 1.0=prend aucun d\u00e9gat\", \"min\":0.0, \"max\":1.0, \"publish\":True, \"group\": \"profiles\", \"ini\": \n\t&#91;0,1,0,0,0] },\n<strong>\"shieldCollision\"<\/strong> : { \"?fr\":\"R\u00e9sistance aux d\u00e9gats inflig\u00e9s par collision en pourcentage. 0.0=prend 100\/100 de d\u00e9gat, 1.0=prend aucun d\u00e9gat\", \"min\":0.0, \"max\":1.0, \"publish\":True, \"group\": \"profiles\", \"ini\": \n\t&#91;0,1,0,0,0] },\n<strong>\"dtDir\"<\/strong> : { \"?fr\":\"D\u00e9lai entre 2 changements d'orientation (en msecs)\", \"min\":0, \"max\":10000, \"publish\":True, \"group\": \"profiles\", \"ini\": \n\t&#91;10,10,10,10,10] },\n<strong>\"dDirMax\"<\/strong> : { \"?fr\":\"Delta angle max entre 2 changements d'orientation (en degrees)\", \"min\":0, \"max\":90, \"publish\":True, \"group\": \"profiles\", \"ini\": \n\t&#91;10,10,10,10,10] },\n<strong>\"dtMove\"<\/strong> : { \"?fr\":\"D\u00e9lai entre 2 d\u00e9placements (en msecs)\", \"min\":0, \"max\":10000, \"publish\":True, \"group\": \"profiles\", \"ini\": \n\t&#91;50,10,50,50,10] },\n<strong>\"moveToDir\"<\/strong> : { \"?fr\":\"Si True, d\u00e9placement possible uniquement dans la direction de l'agent, en avant ou en arriere.\", \"publish\":True, \"group\": \"profiles\", \"ini\": \n\t&#91;True,True,True,True,False] },\n<strong>\"mass\"<\/strong> : { \"?fr\":\"Poids de chaque profile agent\", \"min\":1, \"max\":10000, \"publish\":True, \"group\": \"profiles\", \"ini\": \n\t&#91;1000,10,1000,1000,1] },\n<strong>\"accelerationOnly\"<\/strong> : { \"?fr\":\"Si True, d\u00e9placement possible uniquement via acceleration sur player et non via req x,y.\", \"publish\":True, \"group\": \"profiles\", \"ini\": \n\t&#91;True,False,True,True,True] },\n<strong>\"accelerationMax\"<\/strong> : { \"?fr\":\"Acceleration maximale de l'agent\", \"min\":0, \"max\":10000, \"publish\":True, \"group\": \"profiles\", \"ini\": \n\t&#91;100,100,100,100,100] },\n<strong>\"forceField\"<\/strong> : { \"?fr\":\"Force appliqu\u00e9e autour de l'agent. &lt;0=attraction, >0=repulsion\", \"min\":-1000, \"max\":1000, \"publish\":True, \"group\": \"profiles\", \"version\":240, \"ini\": \n\t&#91;30,0,0,0,0] },\n<strong>\"forceFieldRange\"<\/strong> : { \"?fr\":\"Rayon autour de l'agent dans lequel forceField s'applique\", \"min\":0, \"max\":1000, \"publish\":True, \"group\": \"profiles\", \"version\":240, \"ini\": \n\t&#91;1,0,0,0,0] },\n<strong>\"dxMax\"<\/strong> : { \"?fr\":\"D\u00e9placement max autoris\u00e9 en x\", \"min\":0, \"max\":100, \"publish\":True, \"group\": \"profiles\", \"ini\": \n\t&#91;1,100,1,1,1] },\n<strong>\"dyMax\"<\/strong> : { \"?fr\":\"D\u00e9placement max autoris\u00e9 en y\", \"min\":0, \"max\":100, \"publish\":True, \"group\": \"profiles\", \"ini\": \n\t&#91;1,100,1,1,1] },\n<strong>\"energyIni\"<\/strong> : { \"?fr\":\"Energie initiale pour faire d\u00e9placer l'agent. 0=infini\", \"min\":0, \"publish\":True, \"group\": \"profiles\", \"version\":241, \"ini\": \n\t&#91;0,0,0,0,0] },\n<strong>\"speedIni\"<\/strong> : { \"?fr\":\"Vitesse initiale de l'agent\", \"min\":0, \"max\":100, \"publish\":True, \"group\": \"profiles\", \"ini\": \n\t&#91;&#91;0,0],&#91;0,0],&#91;0,0],&#91;0,0],&#91;100,100]] },\n<strong>\"speedMax\"<\/strong> : { \"?fr\":\"Vitesse maximale de l'agent\", \"min\":0, \"max\":10000, \"publish\":True, \"group\": \"profiles\", \"ini\": \n\t&#91;100,100,100,100,100] },\n<strong>\"lifeIni\"<\/strong> : { \"?fr\":\"Nombre vie par agent\", \"min\":0, \"max\":100, \"publish\":True, \"group\": \"profiles\", \"ini\": \n\t&#91;100,0,100,100,1] },\n<strong>\"lifeTime\"<\/strong> : { \"?fr\":\"Compte a rebour de vie de l'agent en ms. 0 pour pas de limite.\", \"min\":0, \"max\":100000, \"publish\":True, \"group\": \"profiles\", \"ini\": \n\t&#91;0,0,0,0,3000] },\n<strong>\"invisible\"<\/strong>: { \"?fr\":\"Si oui ou non invisible\", \"publish\":True, \"group\": \"profiles\", \"ini\": \n\t&#91;False,True,False,False,False] },\n<strong>\"invincible\"<\/strong>: { \"?fr\":\"Si oui ou non invincible\", \"publish\":True, \"group\": \"profiles\", \"ini\": \n\t&#91;False,True,False,False,False] },\n<strong>\"canDie\"<\/strong>: { \"?fr\":\"Si oui ou non le joueur peut se suicider\", \"publish\":True, \"group\": \"profiles\", \"version\":208, \"ini\": \n\t&#91;True,True,True,True,True] },\n<strong>\"infiniteAmmo\"<\/strong>: { \"?fr\":\"Si oui ou non munitions infinies\", \"publish\":True, \"group\": \"profiles\", \"ini\": \n\t&#91;False,True,False,False,False] },\n<strong>\"collision\"<\/strong> : { \"?fr\":\"Si oui ou non collision possible avec autres agents\", \"publish\":True, \"group\": \"profiles\", \"ini\": \n\t&#91;True,False,True,True,True] },\n<strong>\"collisionMap\"<\/strong> : { \"?fr\":\"Si oui ou non collision possible avec la map\", \"publish\":True, \"group\": \"profiles\", \"ini\": \n\t&#91;True,False,True,True,True] },\n<strong>\"canRulePlayer\"<\/strong>: { \"?fr\":\"Si oui ou non les agents peuvent modifier les autres joueurs de l'ar\u00e8ne\", \"publish\":True, \"group\": \"profiles\", \"ini\": \n\t&#91;False,True,False,False,False] },\n<strong>\"canRuleArena\"<\/strong>: { \"?fr\":\"Si oui ou non les agents peuvent modifier les r\u00e8gles de l'ar\u00e8ne\", \"publish\":True, \"group\": \"profiles\", \"ini\": \n\t&#91;False,True,False,False,False] },\n<strong>\"dtRespawn\"<\/strong> : { \"?fr\":\"D\u00e9lai de renaissance apres mort (en msecs)\", \"min\":1000, \"max\":60000, \"publish\":True, \"group\": \"profiles\", \"ini\": \n\t&#91;5000,5000,5000,5000,0] },\n<strong>\"nRespawn\"<\/strong> : { \"?fr\":\"Nb de spawns possibles. 0=infini.\", \"min\":0, \"max\":10000, \"publish\":True, \"group\": \"profiles\", \"ini\": \n\t&#91;0,0,0,0,1] },\n<strong>\"popOnDeath\"<\/strong> : { \"?fr\":\"Pop du serveur quand mort apr\u00e8s nRespawn expir\u00e9. Attention pop supprime toutes les stats.\", \"publish\":True, \"group\": \"profiles\", \"ini\": \n\t&#91;False,False,False,False,True] },\n<strong>\"linkPortNb\"<\/strong> : { \"?fr\":\"Nb de ports\/liens max. -1=pas de limite, 0=pas de connection possible, >0=nombre de ports possibles\", \"min\":-1, \"publish\":True, \"group\": \"profiles\", \"version\":241, \"ini\": \n\t&#91;0,0,0,0,0] },\n<strong>\"linkStiffness\"<\/strong> : { \"?fr\":\"Pr\u00e9cise si la rigidit\u00e9 des connections. >0=longueur du lien tend a revenir \u00e0 longueur initiale, 0=lien \u00e9tirable \u00e0 l'infini sans rappel\", \"min\":0, \"max\":1000, \"publish\":True, \"group\": \"profiles\", \"version\":241, \"ini\": \n\t&#91;0,0,0,0,0] },\n\n<mark data-darkreader-inline-bgcolor=\"\" style=\"background-color: rgba(0, 0, 0, 0); --darkreader-inline-bgcolor: rgba(0, 0, 0, 0);\" class=\"has-inline-color has-light-green-cyan-color\"># \ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc66 R\u00e8gles par \u00e9quipe<\/mark>\n<strong>\"teamName\"<\/strong> : { \"?fr\":\"Nom des equipes\", \"publish\":True, \"group\": \"team\", \"ini\":\n\t&#91;\"black\",\"blue\",\"pink\",\"red\",\"green\",\"gold\",\"copper\",\"silver\"] },\n<strong>\"teamColor\"<\/strong> : { \"?fr\":\"Couleur de chaque equipe en code RGB\", \"publish\":True, \"group\": \"team\", \"ini\":\n\t&#91;&#91;0,0,0],&#91;43,250,250],&#91;255,192,203],&#91;255,0,64],&#91;0,255,128],&#91;255,215,0],&#91;184,115,51],&#91;190,194,203]] },\n<strong>\"teamAreas\"<\/strong> : { \"?fr\":\"Zones de naissance des agents par \u00e9quipe. \ud83c\udd95Remplace SpawnArea depuis v203\ud83c\udd95\", \"publish\":True, \"group\": \"team\", \"version\": 203, \"ini\":\n\t&#91;&#91;1],&#91;2],&#91;3],&#91;4],&#91;5],&#91;6],&#91;7],&#91;8]] },\n\n<mark data-darkreader-inline-bgcolor=\"\" style=\"background-color: rgba(0, 0, 0, 0); --darkreader-inline-bgcolor: rgba(0, 0, 0, 0);\" class=\"has-inline-color has-light-green-cyan-color\"># \u23ef\ufe0f R\u00e8gles pour connaitre et changer l'\u00e9tat du jeu <\/mark>\n<strong>\"info\"<\/strong> : { \"?fr\":\"Message public affich\u00e9 dans l'arene\", \"publish\":True, \"ini\":\n\t\"\" },\n<strong>\"infoLog\" <\/strong>: { \"?fr\":\"True: Active les logs info du jeu dans le header\", \"publish\":True, \"ini\":\n\tFalse },\n<strong>\"pause\"<\/strong> : { \"?fr\":\"Mettre le jeu en pause. Attention seul admin peut passer de true \u00e0 false\", \"publish\":True, \"ini\":\n\tFalse },\n<strong>\"reset\"<\/strong> : { \"?fr\":\"Supprime tous les agents et leurs stats et redemarre le jeu\", \"reset\":True, \"ini\":\n\tTrue}\n<strong>\"open\"<\/strong> : { \"?fr\":\"Ouvrir ou fermer les portes de l'ar\u00e8ne. Une fois ferm\u00e9e, aucun nouveau joueur ne pourra rentrer.\", \"publish\":False, \"ini\":\n\tTrue },\n<strong>\"version\"<\/strong> : { \"?fr\":\"Numero de la version du moteur de jeu TactX utilis\u00e9 par l'ar\u00e8ne\", \"publish\":True, \"ini\":\n\t206 },\n\n<mark data-darkreader-inline-bgcolor=\"\" style=\"background-color: rgba(0, 0, 0, 0); --darkreader-inline-bgcolor: rgba(0, 0, 0, 0);\" class=\"has-inline-color has-light-green-cyan-color\"># <\/mark>\u23f1\ufe0f<mark data-darkreader-inline-bgcolor=\"\" style=\"background-color: rgba(0, 0, 0, 0); --darkreader-inline-bgcolor: rgba(0, 0, 0, 0);\" class=\"has-inline-color has-light-green-cyan-color\"> R\u00e8gles temps r\u00e9el <\/mark>\n<strong>\"countdown\" <\/strong>: { \"?fr\":\"Compte a rebours en msecs avant la fin du jeu. 0=pas de compte \u00e0 rebours \", \"min\":0, \"publish\":True, \"ini\":\n\t0 },\n<strong>\"dtRestart\"<\/strong> : { \"?fr\":\"Delai en secs apr\u00e8s fin du jeu \u00e0 attendre avant red\u00e9marrage auto. -1=pas de red\u00e9marrage auto, 0=red\u00e9marrage auto juste apr\u00e8s fin.\", \"min\":-1, \"version\": 244, \"publish\":True, \"ini\":\n\t0 },\n\n\n<\/code><\/pre>\n\n\n\n<p>Dans la variable <strong>arbiter.range<\/strong>, sont r\u00e9pertori\u00e9s en temps r\u00e9el tous les \u00e9tats de tous les agents du jeu voisins de notre agent (i.e. dans son champs de vision). Parmi ces informations structur\u00e9es dans un dictionnaire de paires de <em><strong>cl\u00e9:valeur<\/strong><\/em>, nous avons la vie <strong>&#8220;life&#8221;<\/strong>, la position <strong>&#8220;x&#8221; &#8220;y&#8221;<\/strong>, la direction <strong>&#8220;dir&#8221;<\/strong>, l&#8217;\u00e9quipe <strong>&#8220;team&#8221;<\/strong> &#8230; C&#8217;est cl\u00e9s s&#8217;affichent telles que d\u00e9crites dans par les valeurs associ\u00e9es aux cl\u00e9s <strong>publish <\/strong>dans le dictionnaire ci-dessous qui d\u00e9crit toutes les variables d&#8217;\u00e9tat des agents .<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><mark data-darkreader-inline-bgcolor=\"\" style=\"background-color: rgba(0, 0, 0, 0); --darkreader-inline-bgcolor: rgba(0, 0, 0, 0);\" class=\"has-inline-color has-light-green-cyan-color\"># <\/mark>\ud83e\udded <mark data-darkreader-inline-bgcolor=\"\" style=\"background-color: rgba(0, 0, 0, 0); --darkreader-inline-bgcolor: rgba(0, 0, 0, 0);\" class=\"has-inline-color has-light-green-cyan-color\">Etats de positionnement du joueur sur la carte<\/mark>\n<strong>\"x\"<\/strong>: { \"?fr\":\"Abscisse sur la grille\", \"min\":0, \"publish\":\"x\", \"ini\":0 },\n<strong>\"y\"<\/strong>: { \"?fr\":\"Ordonnee sur la grille\", \"min\":0, \"publish\":\"y\", \"ini\":0 },\n<strong>\"px\"<\/strong>: { \"?fr\":\"Abscisse sur la grille flottante\", \"min\":0, \"publish\":\"px\", \"ini\":0.0 },\n<strong>\"py\"<\/strong>: { \"?fr\":\"Ordonnee sur la grille flottante\", \"min\":0, \"publish\":\"py\", \"ini\":0.0 },\n<strong>\"vx\"<\/strong>: { \"?fr\":\"Vitesse abscisse sur la grille\", \"publish\":\"vx\", \"ini\":0.0 },\n<strong>\"vy\"<\/strong>: { \"?fr\":\"Vitesse ordonnee sur la grille\", \"publish\":\"vy\", \"ini\":0.0 },\n<strong>\"dir\"<\/strong>: { \"?fr\":\"Orientation enti\u00e8re sur la grille\", \"min\":0, \"max\":3, \"publish\":\"dir\", \"ini\":0 },\n<strong>\"pdir\"<\/strong>: { \"?fr\":\"Orientation r\u00e9elle sur la grille\", \"min\":0, \"max\":3.99, \"publish\":\"pdir\", \"ini\":0.0 },\n\n<mark data-darkreader-inline-bgcolor=\"\" style=\"background-color: rgba(0, 0, 0, 0); --darkreader-inline-bgcolor: rgba(0, 0, 0, 0);\" class=\"has-inline-color has-light-green-cyan-color\"># <\/mark>\ud83c\udfb2 <mark data-darkreader-inline-bgcolor=\"\" style=\"background-color: rgba(0, 0, 0, 0); --darkreader-inline-bgcolor: rgba(0, 0, 0, 0);\" class=\"has-inline-color has-light-green-cyan-color\">Etats divers du joueur dans le jeu<\/mark>\n<strong>\"profile\"<\/strong>: { \"?fr\":\"Id du profile de l'agent\", \"min\":0, \"publish\":\"profile\", \"ini\":0 },\n<strong>\"color\"<\/strong>: { \"?fr\":\"Couleur RGB de l'agent\", \"publish\":\"led\", \"ini\":&#91;0,255,0] },\n<strong>\"team\"<\/strong>: { \"?fr\":\"Id de l'equipe de l'agent\", \"min\":0, \"publish\":\"team\", \"ini\":0 },\n<strong>\"weapon\"<\/strong>: { \"?fr\":\"Profile de l'arme utilis\u00e9e de l'agent\", \"min\":0, \"publish\":\"weapon\", \"ini\":0 },\n<strong>\"distance\"<\/strong>: { \"?fr\":\"Capteur de distance frontale\", \"min\":0, \"publish\":\"d\", \"readonly\":True, \"ini\":0 },\n<strong>\"fire\"<\/strong>: { \"?fr\":\"Si l'agent est en train de tirer\", \"publish\":\"fire\", \"readonly\":True, \"ini\":False },\n<strong>\"life\"<\/strong>: { \"?fr\":\"Vie de l'agent\", \"min\":0, \"max\":10000, \"publish\":\"life\", \"ini\":100 },\n<strong>\"energy\"<\/strong>: { \"?fr\":\"Energie pour faire accelerer l'agent\", \"min\":0, \"publish\":\"energy\", \"version\":241, \"ini\":100 },\n<strong>\"ammo\"<\/strong>: { \"?fr\":\"Nom de munitions de l'agent\", \"min\":0, \"max\":10000, \"publish\":\"ammo\", \"ini\":10 },\n<strong>\"range\"<\/strong>: { \"?fr\":\"Dico des agents dans le voisinage\", \"publish\":\"range\", \"readonly\":True, \"ini\":{} },\n<strong>\"powerUps\"<\/strong>: { \"?fr\":\"Dico de powers up. nomRegleProfile:&#91;valeur,dur\u00e9eEnMs,tDebug]\", \"publish\":\"powerUps\", \"ini\":{} },\n<strong>\"info\"<\/strong>: { \"?fr\":\"Message d'information sur l'agent\", \"lenmax\":32, \"publish\":\"info\", \"ini\":\"\" },\n<strong>\"lastChecked\"<\/strong>: { \"?fr\":\"Dernier checkpoint valid\u00e9\", \"publish\":\"lastChecked\", \"version\": 208, \"ini\":\"\" },\n<strong>\"checked\"<\/strong>: { \"?fr\":\"Checkpoints valid\u00e9s\", \"publish\":\"checked\", \"version\": 203, \"ini\":&#91;] },\n<strong>\"checkedAt\"<\/strong>: { \"?fr\":\"Timestamps des checkpoints valid\u00e9s\", \"publish\":\"checkedAt\", \"version\": 203, \"ini\":&#91;] },\n<strong>\"links\"<\/strong>: { \"?fr\":\"Connections sur les ports de l'agent. Indice=id port, Valeur=playerId li\u00e9\", \"publish\":\"links\", \"version\": 241, \"ini\":&#91;] },\n\n\n<mark data-darkreader-inline-bgcolor=\"\" style=\"background-color: rgba(0, 0, 0, 0); --darkreader-inline-bgcolor: rgba(0, 0, 0, 0);\" class=\"has-inline-color has-light-green-cyan-color\"># <\/mark>\ud83d\udef0\ufe0f <mark data-darkreader-inline-bgcolor=\"\" style=\"background-color: rgba(0, 0, 0, 0); --darkreader-inline-bgcolor: rgba(0, 0, 0, 0);\" class=\"has-inline-color has-light-green-cyan-color\">Requ\u00eates demand\u00e9es par le joueur avant traitement par le serveur<\/mark>\n<strong>\"reqX\"<\/strong>: { \"?fr\":\"Abscisse cible sur la grille\", \"min\":0, \"publish\":\"reqX\", \"ini\":0 },\n<strong>\"reqY\"<\/strong>: { \"?fr\":\"Ordonnee cible sur la grille\", \"min\":0, \"publish\":\"reqY\", \"ini\":0 },\n<strong>\"reqDir\"<\/strong>: { \"?fr\":\"Direction cible de 0 (droite) \u00e0 3 (bas)\", \"min\":0, \"max\":4, \"publish\":\"reqDir\", \"ini\":0 },\n<strong>\"reqFire\"<\/strong>: { \"?fr\":\"Ordre de tir\", \"publish\":\"reqFire\", \"ini\":False },\n\n<mark data-darkreader-inline-bgcolor=\"\" style=\"background-color: rgba(0, 0, 0, 0); --darkreader-inline-bgcolor: rgba(0, 0, 0, 0);\" class=\"has-inline-color has-light-green-cyan-color\"># <\/mark>\ud83c\udfc6 <mark data-darkreader-inline-bgcolor=\"\" style=\"background-color: rgba(0, 0, 0, 0); --darkreader-inline-bgcolor: rgba(0, 0, 0, 0);\" class=\"has-inline-color has-light-green-cyan-color\">Statistiques du joueur dans l'ar\u00e8ne<\/mark>\n<strong>\"score\"<\/strong>: { \"?fr\":\"Score du joueur mis automatiquement par l'ar\u00e8ne (cl\u00e9 'score'). Mettre la cl\u00e9 score de l'ar\u00e8ne vide pour surcharger le score de chaque joueur\", \"min\":0, \"publish\":\"score\", \"ini\":0 },\n<strong>\"rank\"<\/strong>: { \"?fr\":\"Position du joueur\", \"min\":0, \"publish\":\"rank\", \"ini\":0 },\n<strong>\"dtCreated\"<\/strong>: { \"?fr\":\"Temps ecoul\u00e9 en ms depuis cr\u00e9ation du player\", \"min\":0, \"publish\":\"dtCreated\", \"ini\":0 },\n<strong>\"nFire\"<\/strong>: { \"?fr\":\"Stats du nombre de tirs effectues\", \"min\":0, \"publish\":\"nFire\", \"ini\":0 },\n<strong>\"nHit\"<\/strong>: { \"?fr\":\"Stats du nombre de dommages recu par tir sur notre agent\", \"min\":0, \"publish\":\"nHit\", \"ini\":0 },\n<strong>\"nCollision\"<\/strong>: { \"?fr\":\"Stats du nombre de dommages par collision avec d'autres agents\", \"min\":0, \"publish\":\"nCollision\", \"ini\":0 },\n<strong>\"nMove\"<\/strong>: { \"?fr\":\"Stats du nombre de deplacements effectues\", \"min\":0, \"publish\":\"nMove\", \"ini\":0 },\n<strong>\"nDeath\"<\/strong>: { \"?fr\":\"Stats du nombre de fois o\u00f9 l'agent a \u00e9t\u00e9 tu\u00e9\", \"min\":0, \"publish\":\"nDeath\", \"ini\":0 },\n<strong>\"nKill\"<\/strong>: { \"?fr\":\"Stats du nombre de meurtre que l'agent a commis\", \"min\":0, \"publish\":\"nKill\", \"ini\":0 },<\/code><\/pre>\n\n\n\n<p class=\"has-background\" style=\"background-color:#d4efff\">\ud83d\udd0d <strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-cyan-blue-color\">Information<\/mark><\/strong><br>Dans certaines ar\u00e8nes, tous les agents y compris les &#8220;non arbitre&#8221; peuvent avoir un champs de vision infini. Ils voient tout sur l&#8217;ar\u00e8ne. En d&#8217;autre termes, il n&#8217;y a pas de brouillard de guerre. Mais ces r\u00e8gles peuvent \u00eatre chang\u00e9es par profile d&#8217;agent via l&#8217;arbitre (expliqu\u00e9 ci-apr\u00e8s dans ce tuto) ou via <a href=\"https:\/\/jusdeliens.com\/ideal-tarifs\/\">l&#8217;interface administrateur d&#8217;Ova Arena<\/a><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\ud83e\uddb8 Les supers pouvoirs d&#8217;arbitre<\/h3>\n\n\n\n<p>Gr\u00e2ce \u00e0 la fonction <strong>arbiter.<strong>ruleArena(<em>key : str<\/em>, <em>value : Any<\/em>)<\/strong><\/strong>, votre arbitre pourra modifier en temps r\u00e9el les r\u00e8gles de l&#8217;ar\u00e8ne ci-dessus. Par exemple, si vous souhaitez donner une cap d&#8217;invisibilit\u00e9 aux agents de profile attaquant (2e dans la liste valeur de la cl\u00e9 <strong>profile<\/strong>, donc 2e egalement pour la liste valeur de la cl\u00e9 <strong>invisible<\/strong>), vous pouvez ex\u00e9cuter le code suivant :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>arbiter.ruleArena(\"invisible\", &#91;False,<mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-red-color\">True<\/mark>,False,True,False])<\/code><\/pre>\n\n\n\n<p class=\"has-background\" style=\"background-color:#d4efff\">\ud83d\udd0d <strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-cyan-blue-color\">Information<\/mark><\/strong><br>A leurs modifications, certaines r\u00e8gles du jeu entrainent la r\u00e9initialisation de l&#8217;ar\u00e8ne. Il s&#8217;agit des r\u00e8gles qui ont pour valeur <strong>True <\/strong>pour la cl\u00e9 <strong>&#8220;reset&#8221;<\/strong>. Dans ce cas, veuillez \u00e0 bien faire les changements de ces r\u00e8gles \u00e0 l&#8217;initialisation de votre arbitre, avant le d\u00e9but du jeu.<\/p>\n\n\n\n<p>La modification de certaines r\u00e8gles auront un impact visible imm\u00e9diatement dans l&#8217;ar\u00e8ne comme <strong>gridColumns <\/strong>ou <strong>gridRows <\/strong>ou <strong>fireTeam<\/strong>, tandis que pour d&#8217;autres, l&#8217;impact sera visible en diff\u00e9r\u00e9, comme les r\u00e8gles d\u00e9finissant les profiles des joueurs. C&#8217;est derni\u00e8res peuvent prendre effet au prochain spawn de l&#8217;agent concern\u00e9, comme <strong>lifeIni <\/strong>ou <strong>ammoIni<\/strong>.<\/p>\n\n\n\n<p>Si vous souhaitez modifier les \u00e9tats des joueurs en temps r\u00e9el, utilisez la m\u00e9thode <strong>arbiter.rulePlayer<strong>(<em>agentId : str<\/em>, <em>attributeName : str<\/em>, <em>attributeValue : Any<\/em>)<\/strong><\/strong> de l&#8217;arbitre. Les <strong><strong><em>attributeName <\/em><\/strong><\/strong>possibles sont les cl\u00e9s list\u00e9es dans le dictionnaire d\u00e9crivant les \u00e9tats de tous les agents (voir ci-dessus). <\/p>\n\n\n\n<p>Gr\u00e2ce \u00e0 cette fonction, vous pourrez par exemple accorder \u00e0 un agent sp\u00e9cifique des r\u00e9compenses comme des munitions :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>arbiter.rulePlayer(\"toto\", \"ammo\", 300)<\/code><\/pre>\n\n\n\n<p>Au prochain actualiser, le joueur nomm\u00e9 &#8220;toto&#8221; aura 300 munitions sur le serveur du jeu.<\/p>\n\n\n\n<p>Vous pourrez \u00e9galement cr\u00e9er un joueur si le agentId sp\u00e9cifi\u00e9 n&#8217;existe pas encore dans l&#8217;ar\u00e8ne. Attention tout de m\u00eame \u00e0 v\u00e9rifier que la capacit\u00e9 de l&#8217;ar\u00e8ne en nombre d&#8217;agent n&#8217;est pas atteinte !<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\ud83d\udccc Un exemple sioupla\u00eet ?<\/h3>\n\n\n\n<p>Dans l&#8217;exemple ci-dessous, nous cr\u00e9ons un arbitre nomm\u00e9 &#8220;Architecte&#8221;, qui sera charg\u00e9 de cr\u00e9er 2 agents ennemis, &#8220;N\u00e9o&#8221; et &#8220;Smith&#8221;, de comptabiliser leurs scores et de les afficher dans l&#8217;ar\u00e8ne.<\/p>\n\n\n\n<p class=\"has-background\" style=\"background-color:#d4efff\">\ud83d\udd0d <strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-cyan-blue-color\">Information<\/mark><\/strong><br>Pour ceux qui n&#8217;ont pas encore vu la trilogie Matrix, l&#8217;architecte (pr\u00e9sent dans le 2e et 3e volet) est le protagoniste qui construit et administre la Matrice ainsi que tous ses programmes agents, notamment celui de N\u00e9o (l&#8217;\u00e9lu subversif capable de renverser la Matrice) et celui de l&#8217;agent Smith (un agent surpuissant initialement cens\u00e9 surveiller le comportement des autres programmes).<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># Cr\u00e9ation de l'arbitre\narbiter = pytactx.Agent(\"Architecte\",\"TheMatrX\")\narbiter.ruleArena(\"info\", \"\u231b Initialisation de l'arbitre...\")\nwhile ( len(arbiter.game) == 0 ):\n    arbiter.lookAt((arbiter.dir+1)%4)\n    arbiter.update()\n    sleep(0.5)\n\n# Cr\u00e9ation d'agents actualis\u00e9s par l'ar\u00e8ne elle-m\u00eame\nagentsScores = {\n    \"Neo\" : 0,\n    \"Smith\": 0 \n}\narbiter.ruleArena(\"info\", \"\u231b Cr\u00e9ation des agents...\")\narbiter.update()\nfor agentId in agentsScores.keys() :\n    arbiter.rulePlayer(agentId, \"life\", 100)\n\n# Boucle principale pour actualiser l'arbitre \narbiter.ruleArena(\"info\", \"\ud83d\udfe2 C'est parti !\")\nwhile True:\n    # Changement d'orientation de l'arbitre pour montrer qu'il est actif dans l'ar\u00e8ne\n    arbiter.lookAt((arbiter.dir+1)%4)\n    arbiter.update()\n\n    # Actualisation des scores des agents\n    infoScores = \"\"\n    for agentId in agentsScores.keys():\n        if ( agentId in arbiter.range):\n            score = arbiter.range&#91;agentId]&#91;\"nKill\"]\n            # Ajout de vie et de munitions \u00e0 chaque kill\n            if ( score &gt; agentsScores&#91;agentId] ):\n                arbiter.rulePlayer(agentId , \"life\", arbiter.range&#91;agentId]&#91;\"life\"]+50)\n                arbiter.rulePlayer(agentId , \"ammo\", arbiter.range&#91;agentId]&#91;\"ammo\"]+10)\n            agents&#91;agentId] = score\n        infoScores += \" - \ud83c\udfc6\"+agentId +\" \"+ str(agentsScores&#91;agentId])\n\n    # Affichage du score des 2 bots en temps r\u00e9el\n    arbiter.ruleArena(\"info\", infoScores)\n<\/code><\/pre>\n\n\n\n<p>Pour que N\u00e9o et Smith soient cr\u00e9\u00e9s dans l&#8217;ar\u00e8ne, on utilise la m\u00e9thode rulePlayer pour mettre leur vie \u00e0 100. <\/p>\n\n\n\n<p>Notre arbitre d\u00e9marre ensuite sa boucle principale, dans laquelle il change son orientation et effectue une mise \u00e0 jour de son dictionnaire de score par agent qu&#8217;il affiche ensuite dans le panneau &#8220;info&#8221; de l&#8217;ar\u00e8ne.<\/p>\n\n\n\n<p>Le score ici correspond au nombre de kills effectu\u00e9s par chaque agent. A chaque kill, l&#8217;arbitre attribue une r\u00e9compense de 50 de vie et 10 de munitions \u00e0 l&#8217;agent concern\u00e9. <\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\ud83e\uddec Des r\u00e8gles comme des g\u00e8nes pour modifier l&#8217;ADN de votre ar\u00e8ne <\/h3>\n\n\n\n<p>Personnaliser certaines r\u00e8gles de l&#8217;ar\u00e8ne peut s&#8217;av\u00e9rer assez ardu, car comme les g\u00e8nes, certaines sont li\u00e9es entre elles. Pour un comportement voulu (=le ph\u00e9notype), il faut s&#8217;assurer de bien changer un ensemble de r\u00e8gles de mani\u00e8re appropri\u00e9e.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">\ud83c\udfc6 Le score et le rank<\/h4>\n\n\n\n<p>Vous souhaitez que votre arbitre modifie le score et le rank de chaque joueur visibles dans la vue &#8220;\ud83c\udfc6 Rank&#8221; du viewer ? Pour cela, il faut <\/p>\n\n\n\n<ol class=\"wp-block-list\"><li>A l&#8217;initialisation de votre arbitre, modifier la cl\u00e9 &#8220;score&#8221; de l&#8217;ar\u00e8ne et remplacer sa valeur par un texte vide &#8220;&#8221;<\/li><li>Dans la boucle principale de votre arbitre, modifier les attributs &#8220;score&#8221; et &#8220;rank&#8221; de chaque joueur <\/li><\/ol>\n\n\n\n<h4 class=\"wp-block-heading\">\ud83d\uddfa\ufe0f La carte et ses cases<\/h4>\n\n\n\n<p>Vous souhaitez rajouter des cases avec des images et\/ou couleurs et\/ou comportements diff\u00e9rents ? <\/p>\n\n\n\n<p>Par exemple, sur une map de 3 de largeur et 4 de hauteur, on veut rajouter des murs de briques cassables au mileu align\u00e9s verticalement, sur lesquels les joueurs ne peuvent pas se d\u00e9placer, des sables mouvants (de friction 0.85) au milieu sur lesquels les joueurs sont ralentis &#8230; <\/p>\n\n\n\n<p>Pour cela, initialiser les <strong>toutes cl\u00e9s &#8220;map&#8230;&#8221;<\/strong> de l&#8217;ar\u00e8ne de la fa\u00e7on suivantes. <br>\u26a0\ufe0f <strong>Attention \u00e0 n&#8217;en n&#8217;oublier aucune sous peine de faire planter le jeu !!<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Modifier la cl\u00e9 map en mettant aux indices [y][x] le profile de la case souhait\u00e9e comme nombre entiers cons\u00e9cutifs. Attention l&#8217;indice 0 (=pas d&#8217;obstacle) et 1 (obstacle par d\u00e9faut) sont reserv\u00e9s. Choisissez par exemple 2 pour les murs de briques et 3 pour les sables mouvants<ul><li>avant modification <ul><li>&#8216;map&#8217; : [ <br>[0,0,0], <br>[0,0,0], <br>[0,0,0], <br>[0,0,0] ]<\/li><\/ul><\/li><\/ul><ul><li>apr\u00e8s modification via arbiter.ruleArena(&#8220;map&#8221;, nouvelleValeur)<ul><li>&#8216;map&#8217; : [<br>[0,2,0], <br>[3,2,3], <br>[3,2,3], <br>[0,2,0] ]<\/li><\/ul><\/li><\/ul><\/li><li>Pour chaque profile, il faut s&#8217;assurer que les cl\u00e9s mapFriction, mapHit, mapBreakable, mapImgs &#8230; ont les m\u00eames dimensions, correspondant au profile le plus \u00e9lev\u00e9 + 1. Rajoutez donc pour chacune de ces cl\u00e9s la valeur correspondante pour le profile de la case associ\u00e9.<ul><li>avant modification <ul><li>&#8216;mapImgs&#8217; : [ &#8216; &#8216;, &#8216; &#8216; ]<\/li><li>&#8216;mapFriction&#8217; : [ 0.0, 1.0 ]<\/li><li>&#8216;mapHit&#8217; : [ 0, 0 ]<\/li><li>&#8216;mapBreakable&#8217; : [ False, False ]<\/li><\/ul><\/li><li>apr\u00e8s modification via arbiter.ruleArena pour chaque cl\u00e9\/valeur suivante<ul><li>&#8216;mapImgs&#8217; : [ &#8216; &#8216;, &#8216; &#8216;, &#8216;https:\/\/urlVersImgMur.jpg&#8217;, &#8216;https:\/\/urlVersImgSable.jpg&#8217; ]<\/li><li>&#8216;mapFriction&#8221; : [ 0.0, 1.0, 1.0, 0.85 ]<\/li><li>&#8216;mapHit&#8217; : [ 0, 0, 0, 0 ]<\/li><li>&#8216;mapBreakable&#8217; : [ False, False, True, False ]<\/li><\/ul><\/li><\/ul><\/li><\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">\ud83c\udfad Les profiles de joueurs<\/h4>\n\n\n\n<p>Vous souhaitez cr\u00e9er diff\u00e9rentes classes de personnages avec des attributs diff\u00e9rents ?<\/p>\n\n\n\n<p>Par exemple <\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>des attaquants qui seraient plus rapides avec moins de boucliers, et dot\u00e9s d&#8217;une arme mitraillette laser<\/li><li>des d\u00e9fenseurs qui seraient \u00e0 l&#8217;inverse plus r\u00e9sistants aux attaques mais plus lents, et sans arme, uniquement le corps \u00e0 corps<\/li><\/ul>\n\n\n\n<p>Pour cela il faut modifier, ou bien cr\u00e9er de nouveaux profiles, en affectant les modifications \u00e0 <strong>toutes les cl\u00e9s profile de joueur<\/strong>. <\/p>\n\n\n\n<p>Le profile 0 est celui utilis\u00e9 par d\u00e9faut lors de la cr\u00e9ation d&#8217;un agent quelquonque (= id non inscrit dans la liste de contr\u00f4le d&#8217;acc\u00e8s de l&#8217;ar\u00e8ne) \u00e0 sa connexion dans l&#8217;ar\u00e8ne. Par d\u00e9faut, selon l&#8217;ar\u00e8ne, il peut \u00e9galement y avoir certains profiles associ\u00e9s \u00e0 des PNJ (Personnages non joueur = IA g\u00e9r\u00e9es par l&#8217;ar\u00e8ne) et d&#8217;autres associ\u00e9s et g\u00e9n\u00e9r\u00e9s par des armes (comme le lance-roquette qui cr\u00e9er un agent de profile roquette \u00e0 chaque tir).<\/p>\n\n\n\n<p>Dans la plupart des cas, il est donc pr\u00e9f\u00e9rable de cr\u00e9er de nouveaux profiles. Pour cela, il faut ajouter une valeur d&#8217;initialisation dans les listes de valeurs associ\u00e9es aux cl\u00e9s de profile de joueur pour un nouveau profile. L&#8217;identifiant du profile ajout\u00e9 sera l&#8217;indice des valeurs associ\u00e9es dans ces listes, i.e. la taille de ces listes -1. <\/p>\n\n\n\n<p>En cas de changement de dimension d&#8217;une de ces listes, toutes listes de profile de joueur sont par d\u00e9faut compl\u00e9t\u00e9es avec la valeur du profile par d\u00e9faut. Pr\u00e9f\u00e9rez donc initialiser toutes les r\u00e8gles du profile ajout\u00e9 pour \u00e9viter des comportements impr\u00e9visibles.<\/p>\n\n\n\n<p>Pour notre exemple d&#8217;Attaquants et de D\u00e9fenseurs :<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>avant modification :<ul><li>&#8216;profiles&#8217; : [ &#8216;default&#8217;, &#8216;arbitre&#8217;, &#8216;bot1&#8217;, &#8216;bot2&#8217;, &#8216;rocket&#8217;]<\/li><li>&#8216;dtMove&#8217; : [50,10,50,50,10]<\/li><li>&#8216;lifeIni&#8217; [100,0,100,100,1]<\/li><li>&#8216;weapon&#8217; : [1,1,1,1,2]<\/li><\/ul><\/li><li>apr\u00e8s modification via arbiter.ruleArena pour chaque cl\u00e9\/valeur suivante pour cr\u00e9er le profile attaquant \u00e0 l&#8217;indice 5 et d\u00e9fenseur \u00e0 l&#8217;indice 6 :<ul><li>&#8216;profiles&#8217; : [ &#8216;default&#8217;, &#8216;arbitre&#8217;, &#8216;bot1&#8217;, &#8216;bot2&#8217;, &#8216;rocket&#8217;, &#8216;attaquant&#8217;, &#8216;defenseur&#8217; ]<\/li><li>&#8216;dtMove&#8217; : [50,10,50,50,10, 50,100]<\/li><li>&#8216;lifeIni&#8217; [100,0,100,100,1, 100,500]<\/li><li>&#8216;weapon&#8217; : [1,1,1,1,2, 1,0]<\/li><\/ul><\/li><\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">\u2b50 Les power ups<\/h4>\n\n\n\n<p>Vous aimeriez accorder des bonus de vies, de munitions ou autres \u00e0 des joueurs pendant un temps donn\u00e9 ?<\/p>\n\n\n\n<p>Depuis la version 206, cela est possible en cr\u00e9ant des zones sur lesquelles les joueurs pourront r\u00e9cup\u00e9rer des power ups.  Pour ajouter une nouvelle zone, il faut ajouter<\/p>\n\n\n\n<ol class=\"wp-block-list\"><li>une valeur par liste de cl\u00e9 de groupe &#8220;areas&#8221;, de sorte \u00e0 d\u00e9finir le nom de la zone (cl\u00e9 &#8220;areas&#8221;), l&#8217;ic\u00f4ne \u00e0 afficher au milieu de la zone (cl\u00e9 &#8220;aIcons&#8221;), sa couleur (cl\u00e9 &#8220;areasColor&#8221;), sa position (cl\u00e9s &#8220;areasX&#8221; et &#8220;areasY&#8221;) et ses dimensions (cl\u00e9s &#8220;areasW&#8221; et &#8220;areasH&#8221;). Pour la dimension, il est possible de mettre 0 &#8220;areasW&#8221; (et &#8220;areasH&#8221;) de sorte \u00e0 prendre toute la largeur de &#8220;areasX&#8221; \u00e0 droite (et respectivement de &#8220;areasY&#8221; \u00e0 en bas)<\/li><li>une valeur enti\u00e8re pour la cl\u00e9 &#8220;areasPUpsDt&#8221;, indiquant le d\u00e9lai minimal en millisecondes \u00e0 attendre entre chaque octroi de power up pour les joueurs dans la zone <\/li><li>une liste de texte pour la cl\u00e9 &#8220;areasPUpsEv&#8221;, indiquant les \u00e9tats (attributs) des joueurs dans la zone, pour lesquels au moins 1 valeur doit changer pour d\u00e9clencher l&#8217;octroi du powerup. Si la liste ajout\u00e9e est vide, alors seule condition de temps indiqu\u00e9e par &#8220;areasPUpsDt&#8221; doit \u00eatre v\u00e9rifi\u00e9e pour attribuer le power up. <\/li><li>un dictionnaire pour la cl\u00e9 &#8220;areasPUps&#8221;, avec <ul><li>Comme cl\u00e9 le nom de l&#8217;\u00e9tat (attribut) du joueur qui sera modifi\u00e9 par le power up<\/li><li>Une valeur contenant une liste de 3 valeurs<ol><li>la valeur du power up \u00e0 attribuer. Attention le type doit \u00eatre le m\u00eame que celui de l&#8217;\u00e9tat \u00e0 modifier et peut \u00eatre positif ou n\u00e9gatif<\/li><li>pendant combien de temps en milliseconds le powerup sera actif, 0 signifiant permanent.<\/li><li>un caract\u00e8re indiquant l&#8217;op\u00e9rateur pour l&#8217;affectation de la valeur \u00e0 attribuer. <ul><li>&#8216;+&#8217; incr\u00e9mentera ou d\u00e9cr\u00e9mentera la valeur de l&#8217;\u00e9tat du joueur selon la valeur indiqu\u00e9e en 1. Le type de l&#8217;\u00e9tat doit n\u00e9cessairement \u00eatre un nombre.<\/li><li>&#8216;*&#8217; multipliera ou divisera la valeur de l&#8217;\u00e9tat du joueur selon la valeur indiqu\u00e9e en 1. Le type de l&#8217;\u00e9tat doit n\u00e9cessairement \u00eatre un nombre.<\/li><li>&#8216;=&#8217; remplacera la valeur de l&#8217;\u00e9tat par celle indiqu\u00e9e en 1. . Le type peut \u00eatre un texte, un bool\u00e9en, ou un nombre<\/li><\/ul><\/li><\/ol><\/li><\/ul><\/li><\/ol>\n\n\n\n<p>Par exemple, si nous souhaitons que sur la carte toute enti\u00e8re, \u00e0 chaque kill d&#8217;un joueur, la vie du tueur soit mise \u00e0 100 de mani\u00e8re temporaire pendant 10 secondes, et 10 de munitions de mani\u00e8re permanente, voici les modifications \u00e0 apporter :<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>avant modification :<ul><li>&#8216;areas&#8217; : [ ]<\/li><li>&#8216;aIcons&#8217; : [ ]<\/li><li>&#8216;areasColor&#8217; : [ ]<\/li><li>&#8216;areasX&#8217; : [ ]<\/li><li>&#8216;areasY&#8217; : [ ]<\/li><li>&#8216;areasW&#8217; : [ ]<\/li><li>&#8216;areasH&#8217; : [ ]<\/li><li>&#8216;areasPUps&#8217; : [ ]<\/li><li>&#8216;areasPUpsDt&#8217; : [ ]<\/li><li>&#8216;areasPUpsEv&#8217; : [ ]<\/li><\/ul><\/li><li>apr\u00e8s modification via arbiter.ruleArena pour chaque cl\u00e9\/valeur suivante :<ul><li>&#8216;areas&#8217; : [ &#8216;KILL REWARD ZONE&#8217; ]<\/li><\/ul><ul><li>&#8216;aIcons&#8217; : [ &#8216;\ud83d\udd2b\u2b50&#8217; ]<\/li><li>&#8216;areasColor&#8217; : [ &#8216;[0,0,0,0.2]&#8217; ]<\/li><li>&#8216;areasX&#8217; : [ 0 ]<\/li><li>&#8216;areasY&#8217; : [ 0 ]<\/li><li>&#8216;areasW&#8217; : [ 0 ]<\/li><li>&#8216;areasH&#8217; : [ 0 ]<\/li><li>&#8216;areasPUps&#8217; : [ {&#8216;life&#8217;:[100,10000,&#8217;=&#8217;], &#8216;ammo&#8217;:[10,0,&#8217;+&#8217;]} ]<\/li><li>&#8216;areasPUpsDt&#8217; : [ 500 ]<\/li><li>&#8216;areasPUpsEv&#8217; : [ [&#8216;nKill&#8217;] ]<\/li><\/ul><\/li><\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">\ud83c\udfae A vous de jouer !<\/h3>\n\n\n\n<p>Avec toutes ces informations, il ne vous restent plus qu&#8217;\u00e0 bien d\u00e9finir vos r\u00e8gles du jeu, puis de vous lancer dans l&#8217;impl\u00e9mentation de votre script arbitre.<\/p>\n\n\n\n<p>Pour plus d&#8217;aide, vous pouvez vous inspirer des travaux des pr\u00e9c\u00e9dents apprentis jus de liens.<\/p>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<h4 class=\"has-text-align-center wp-block-heading\">Code of the Hill \u26f0\ufe0f<\/h4>\n\n\n\n<p class=\"has-text-align-center\">Combat d&#8217;IA en \u00e9quipe programm\u00e9e en Python, dans lequel des robots s&#8217;affrontent pour prendre possession d&#8217;une colline. Invent\u00e9 par Augustin, Matthias et Yann.<\/p>\n\n\n\n<p class=\"has-text-align-center\">\ud83d\udc49 <a href=\"https:\/\/replit.com\/@jusdeliens\/arbiter\">Voir les sources du projet<\/a><\/p>\n\n\n\n<figure class=\"wp-block-embed is-type-wp-embed is-provider-jusdeliens-cultivateur-de-creativite-numerique wp-block-embed-jusdeliens-cultivateur-de-creativite-numerique\"><div class=\"wp-block-embed__wrapper\">\n<blockquote class=\"wp-embedded-content\" data-secret=\"9gJ4vx1YMh\"><a href=\"https:\/\/jusdeliens.com\/2022\/05\/25\/code-of-the-hill-le-reglement\/\">Code Of The Hill &#8211; Le r\u00e8glement \u26f0\ufe0f<\/a><\/blockquote><iframe loading=\"lazy\" class=\"wp-embedded-content\" sandbox=\"allow-scripts\" security=\"restricted\" style=\"position: absolute; visibility: hidden;\" title=\"\u00ab\u00a0Code Of The Hill &#8211; Le r\u00e8glement \u26f0\ufe0f\u00a0\u00bb &#8212; Jusdeliens - Cultivateur de cr\u00e9ativit\u00e9 num\u00e9rique\" src=\"https:\/\/jusdeliens.com\/2022\/05\/25\/code-of-the-hill-le-reglement\/embed\/#?secret=tK2AMdIhvM#?secret=9gJ4vx1YMh\" data-secret=\"9gJ4vx1YMh\" width=\"500\" height=\"282\" frameborder=\"0\" marginwidth=\"0\" marginheight=\"0\" scrolling=\"no\"><\/iframe>\n<\/div><\/figure>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<h4 class=\"has-text-align-center wp-block-heading\">Capture the Snake \ud83d\udc0d<\/h4>\n\n\n\n<p class=\"has-text-align-center\">Combat d&#8217;IA en \u00e9quipe programm\u00e9e en Python, dans lequel des robots s&#8217;affrontent pour capturer le drapeau de leur ennemi. Cr\u00e9\u00e9 par Michel, Alban, Alexandre et Lo\u00efs.<\/p>\n\n\n\n<p class=\"has-text-align-center\">\ud83d\udc49 <a href=\"https:\/\/www.youtube.com\/watch?v=XX2C55FFw_E\">Voir les r\u00e8gles du jeu<\/a><\/p>\n\n\n\n<figure class=\"wp-block-embed is-type-wp-embed is-provider-jusdeliens-cultivateur-de-creativite-numerique wp-block-embed-jusdeliens-cultivateur-de-creativite-numerique\"><div class=\"wp-block-embed__wrapper\">\n<blockquote class=\"wp-embedded-content\" data-secret=\"Sat6HApft7\"><a href=\"https:\/\/jusdeliens.com\/2022\/05\/29\/capture-the-snake-le-reglement\/\">Capture The Snake &#8211; Le r\u00e8glement \ud83d\udc0d<\/a><\/blockquote><iframe loading=\"lazy\" class=\"wp-embedded-content\" sandbox=\"allow-scripts\" security=\"restricted\" style=\"position: absolute; visibility: hidden;\" title=\"\u00ab\u00a0Capture The Snake &#8211; Le r\u00e8glement \ud83d\udc0d\u00a0\u00bb &#8212; Jusdeliens - Cultivateur de cr\u00e9ativit\u00e9 num\u00e9rique\" src=\"https:\/\/jusdeliens.com\/2022\/05\/29\/capture-the-snake-le-reglement\/embed\/#?secret=5MwQaUy1ik#?secret=Sat6HApft7\" data-secret=\"Sat6HApft7\" width=\"500\" height=\"282\" frameborder=\"0\" marginwidth=\"0\" marginheight=\"0\" scrolling=\"no\"><\/iframe>\n<\/div><\/figure>\n<\/div>\n<\/div>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udee3\ufe0f Et apr\u00e8s ?<\/h2>\n\n\n\n<p>Vous avez aim\u00e9 ce tutoriel et vous en voulez d&#8217;autres ? <\/p>\n\n\n\n<p>Faites le nous savoir en <strong>\ud83d\udc49<\/strong> <a href=\"https:\/\/g.page\/r\/CQoJnRiyLqsqEB0\/review\">donnant vos avis et vos envies<\/a> et nous nous empresserons de vous en r\u00e9digez d&#8217;autres \ud83d\ude09<\/p>\n\n\n\n<p>C\u2019est fini pour ce tutoriel ! A vous de <a href=\"https:\/\/play.jusdeliens.com\" target=\"_blank\" rel=\"noreferrer noopener\">jouer<\/a> maintenant \ud83d\ude09<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"http:\/\/jusdeliens.com\/wp-content\/uploads\/2019\/01\/R2D2.gif\" alt=\"\" class=\"wp-image-355\"\/><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>Vous avez aim\u00e9 PytactX et vous aimeriez cr\u00e9er votre propre ar\u00e8ne avec vos propres r\u00e8gles du jeu en Python ? Ce tutoriel est fait pour vous ! Vous y apprendrez comment devenir l&#8217;architecte de votre Ova Arena pour pouvoir tout personnaliser : les graphiques, les personnages, les armes, la carte de jeu &#8230;<\/p>\n","protected":false},"author":1,"featured_media":513,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5,7],"tags":[],"class_list":["post-321","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-python","category-tactx"],"_links":{"self":[{"href":"https:\/\/tutos.jusdeliens.com\/index.php\/wp-json\/wp\/v2\/posts\/321","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/tutos.jusdeliens.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/tutos.jusdeliens.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/tutos.jusdeliens.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/tutos.jusdeliens.com\/index.php\/wp-json\/wp\/v2\/comments?post=321"}],"version-history":[{"count":0,"href":"https:\/\/tutos.jusdeliens.com\/index.php\/wp-json\/wp\/v2\/posts\/321\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/tutos.jusdeliens.com\/index.php\/wp-json\/"}],"wp:attachment":[{"href":"https:\/\/tutos.jusdeliens.com\/index.php\/wp-json\/wp\/v2\/media?parent=321"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/tutos.jusdeliens.com\/index.php\/wp-json\/wp\/v2\/categories?post=321"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/tutos.jusdeliens.com\/index.php\/wp-json\/wp\/v2\/tags?post=321"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}