objectif

Créer un programme de calcul automatique du nombre de donjons requis pour maximiser le bonus du familier.

  • Choix du familier via un formulaire
  • traitement des données en Ajax
  • choix du nombre de points de bonus à entrer
  • Statistiques : nombre de monstres à tuer
  • Choix du donjon
  • Choix du nombre de joueurs

Version 3





Explications

Le fichier .JSON :


{
  "familier" : [
    {
      "id" : "glub",
      "nom" : "Glub",
      "donjon" : "Bateau du Chouque",
      "commentaire" : "",
      "salles" : [
        [
            {"x4" : [2,1,1,0,0,0] },
            {"x5" : [2,1,1,1,0,0] },
            {"x6" : [2,2,1,1,0,0] },
            {"x7" : [2,3,1,1,0,0] },
            {"x8" : [2,3,1,1,1,0] }
        ],
        [
            {"x4" : [1,1,0,0,2,0] },
            {"x5" : [1,1,0,0,3,0] },
            {"x6" : [1,1,1,0,3,0] },
            {"x7" : [1,1,1,0,4,0] },
            {"x8" : [1,1,1,1,4,0] }
        ],
        [
            {"x4" : [0,1,0,2,1,0] },
            {"x5" : [0,1,0,3,1,0] },
            {"x6" : [0,1,0,3,2,0] },
            {"x7" : [1,1,0,3,2,0] },
            {"x8" : [1,1,1,3,2,0] }
        ],
        [
            {"x4" : [0,2,1,1,0,0] },
            {"x5" : [0,3,1,1,0,0] },
            {"x6" : [0,3,1,2,0,0] },
            {"x7" : [1,3,1,2,0,0] },
            {"x8" : [1,3,1,2,1,0] }
        ],
        [
            {"x4" : [0,0,1,1,1,1] },
            {"x5" : [0,1,1,1,1,1] },
            {"x6" : [0,2,1,1,1,1] },
            {"x7" : [0,2,2,1,1,1] },
            {"x8" : [1,2,2,1,1,1] }
        ]
      ],
      "monstres" : [
        {
          "nom" :"Boomba",
          "palier" : 100
        },
        {
          "nom" :"Canondorf",
          "palier" : 100
        },
        {
          "nom" :"Ivremor",
          "palier" : 100
        },
        {
          "nom" :"Ricanif",
          "palier" : 100
        },
        {
          "nom" :"Nakunbra",
          "palier" : 100
        },
        {
          "nom" :"Le Chouque",
          "palier" : 2
        }
      ]
    }
}

 

Et le script jQuery :


jQuery(document).ready(function($) {

    var formulaire = $("#dofus-form");

    // on ajoute un évènement au formulaire
    formulaire.submit(function(e) {

        // On empêche l'envoides données au serveur
        e.preventDefault();

        var contentUrl = directory_uri.content_url;
        // On stocke les valeurs des entrées du formulaire dans des variables
        var familierChoisi = $("#familier").val();
        var nombreChoisi = parseInt($("#number").val());
        var equipeChoisie = parseInt($("#equipe").val());

        // Les captures du boss ne sont pas prises en compte pour le moment
        var captureBoss = "off";

        // La fonction ajaxGet() renvoit le contenu d'un fichier externe
        ajaxGet(contentUrl + "/user_files/js/lbh_calcul_familier/tableau_familiers.json", function(reponse){
            var obj = JSON.parse(reponse);

            // Boucle : On fait corréler le choix du familier choisi
            // avec les données issues du fichier externe
            for(var i = 0 ; i< (obj.familier).length; i++) {
                if(familierChoisi == obj.familier[i].id) {
                    var familier = obj.familier[i];
                    // On lance la fonction de calcul
                    calculPoints(familier, nombreChoisi, equipeChoisie, captureBoss);
                }
            }
        })
    });

    // Cette fonction sert à renvoyer le tableau de monstres selon le nombre de joueurs
    // entré dans le formulaire
    function verifEquipe(familier, equipeChoisie, cle) {
        var monstresParSalle;
        switch(equipeChoisie) {
            case 4 :
                monstresParSalle = familier.salles[cle][0].x4;
                break;
            case 5 :
                monstresParSalle = familier.salles[cle][1].x5;
                break;
            case 6 :
                monstresParSalle = familier.salles[cle][2].x6;
                break;
            case 7 :
                monstresParSalle = familier.salles[cle][3].x7;
                break;
            case 8 :
                monstresParSalle = familier.salles[cle][4].x8;
                break;
            default :
                monstresParSalle = familier.salles[cle][0].x4;
        }
        return monstresParSalle;
    }

    // La fonction principale
    function calculPoints(familier, totalPoints, equipeChoisie, captureBoss) {

        // Déclaration des variables
        var pointFamilier = 0;
        var nomDonjon = familier.donjon;
        var sallesDonjon = familier.salles;
        var commentaire = familier.commentaire;
        var tableauTotalMonstres = [];
        var tableauPalierMonstres = [];
        var statistiques =[0,0];
        var reponse = "";

        // On initialise le tableau des monstres
        for(var m = 0; m < (sallesDonjon[0][0].x4).length ; m++) {
            tableauPalierMonstres[m] = 0;
            tableauTotalMonstres[m] = 0;
        }

        // Boucle : tant que les points du familier sont inférieurs
        // au nombre total entré dans le formulaire :
        while(pointFamilier < totalPoints) {

            // Boucle : Pour chaque salle du donjon :
            for(var i = 0; i < sallesDonjon.length; i++) {
                var monstresParSalle = verifEquipe(familier, equipeChoisie, i);

                // Boucle : Pour chaque monstre, par salle
                for(var j = 0; j < monstresParSalle.length ; j++) {

                    // On incrémente le tableau du total des monstres du donjon
                    tableauTotalMonstres[j] += monstresParSalle[j];
                    //palier
                    tableauPalierMonstres[j] += monstresParSalle[j];

                    // Si le nombre de monstres dépasse leur paliers respectifs :
                    // Quantité monstre - leur palier
                    // On ajoute 1 point au familier
                    if(tableauPalierMonstres[j] >= familier.monstres[j].palier) {
                        tableauPalierMonstres[j] -= familier.monstres[j].palier;
                        pointFamilier+= 1;
                    }
                }

                // Si l'option capture du boss est active
                if(captureBoss == "on") {

                    // On compte à nouveau les monstres dans la salle du boss
                    if(i == (sallesDonjon.length)-1) {

                        // On ajoute 1 capture
                        statistiques[1] += 1;

                        // Pour chaque monstre par salle
                        for(var l = 0; l < monstresParSalle.length ; l++) {
                            nomMonstre = familier.monstres[l].nom;
                            tableauTotalMonstres[l] += monstresParSalle[l];
                            tableauPalierMonstres[l] += monstresParSalle[l];

                            if(tableauPalierMonstres[l] >= familier.monstres[l].palier) {

                                tableauPalierMonstres[l] -= familier.monstres[l].palier;

                                pointFamilier+= 1;
                            }
                        }
                    }
                }
            }

            // On ajoute 1 donjon
            statistiques[0] += 1;
        }

        // Boucle : On affiche les infos pour chaque entrée du tableau
        for(var k = 0; k < tableauTotalMonstres.length; k++) {

            // On récupère le nom de chaque monstre
            var nomMonstre = familier.monstres[k].nom;

            // On affiche le nom du monstre et son nombre total dans un élément de liste
            reponse += "<li><span class='txt-visible'>" + tableauTotalMonstres[k] + "</span> " + nomMonstre + nombrePoints(k) + "</li>";
        }

        // Nombre de points qu'aura donné chaque paquet de monstres
        function nombrePoints(k) {

            // On divise le nombre de monstres par leur palier
            // ex : 300 nakunbra / 100 = 3 points
            var palier = familier.monstres[k].palier;
            var points = Math.floor(tableauTotalMonstres[k]/palier);
            if(points !== 0) {
                return "<small class='small_info'>+" + points + "</small>";
            }
            else {
                return "";
            }
        }

        // Cette fonction affichera le message
        affichageMessage(captureBoss, reponse, statistiques, totalPoints, nomDonjon, equipeChoisie, commentaire);

        // On appelle une seconde fois calculPoints, mais cette fois elle affichera les donjons + les captures
        if(captureBoss == "off") {
            captureBoss = "on";
            calculPoints(familier, totalPoints, equipeChoisie, captureBoss);
        }
    }

    function affichageMessage(captureBoss, reponse, statistiques, totalPoints, nomDonjon, equipeChoisie, commentaire) {

        var messageCapture = "";
        var message;
        var affichageCommentaire = "";
        var resultat = document.getElementById("resultat");

        if(captureBoss == "on") {
            message = "<hr>" +
                "<p>Mais si tu captures le boss, tu feras <span class='txt-visible'>" + statistiques[0] + "</span> donjon(s), et <span class='txt-visible'>" + statistiques[1] + "</span> capture(s) en arène.</p>";
            resultat.innerHTML += message + "<ul>" + reponse + "</ul>";

        } else {

            if(commentaire.length > 0) {
                affichageCommentaire = "<div class='callout alert'>" + commentaire +"</div>"
            }

            // Message placé au début du résultat
            message = "<p>Lieu : <span class='txt-visible'>" + nomDonjon + "</span></p>" +
                "<p>Equipe : <span class='txt-visible'>" + equipeChoisie + "</span> joueur(s)</p>" +
                affichageCommentaire +
                "<p>Pour donner <span class='txt-visible'>" + totalPoints + "</span> point(s) au familier, tu devras faire <span class='txt-visible'>" + statistiques[0] + "</span> donjon(s)" + messageCapture + "." +
                "<br>Lors de ce périple, tu massacreras :</p>";
            resultat.innerHTML = message + "<ul>" + reponse + "</ul>";
        }
    }
});

Annexes

Source de l’image de l’article : Iop’s wrath par Lily-Fu

  1. splashhh

    bonsoir monsieur . tout d’abord bravo pour le programme … je souhaiterais connaitre le nombre de donjon qu’il me faudrait faire pour une bouloute ! en attente d’une reponse de votre part merci d’avance .

Comments are closed.