MediaWiki:Script/Skills.js

Révision datée du 6 août 2022 à 07:47 par Dexter (discussion | contributions)
(diff) ← Version précédente | Voir la version actuelle (diff) | Version suivante → (diff)

Note : après avoir enregistré vos modifications, il se peut que vous deviez forcer le rechargement complet du cache de votre navigateur pour voir les changements.

  • Firefox / Safari : maintenez la touche Maj (Shift) en cliquant sur le bouton Actualiser ou pressez Ctrl-F5 ou Ctrl-R (⌘-R sur un Mac)
  • Google Chrome : appuyez sur Ctrl-Maj-R (⌘-Shift-R sur un Mac)
  • Internet Explorer : maintenez la touche Ctrl en cliquant sur le bouton Actualiser ou pressez Ctrl-F5
  • Opera : allez dans Menu → Settings (Opera → Préférences sur un Mac) et ensuite à Confidentialité & sécurité → Effacer les données d’exploration → Images et fichiers en cache.
/* Ce script sera chargé uniquement sur les pages en ayant besoin (les pages de compétences) */

function convertSkillLevel(level) {
  conversionDic = {
      "1": [0.05,1],    "2": [0.06,2],    "3": [0.08,3],    "4": [0.10,4],
      "5": [0.12,5],    "6": [0.14,6],    "7": [0.16,7],    "8": [0.18,8],
      "9": [0.20,9],    "10": [0.22,10],  "11": [0.24,11],  "12": [0.26,12],
      "13": [0.28,13],  "14": [0.30,14],  "15": [0.32,15],  "16": [0.34,16],
      "17": [0.36,17],  "18": [0.38,18],  "19": [0.40,19],  "M1": [0.50,20],
      "M2": [0.52,21],  "M3": [0.54,22],  "M4": [0.56,23],  "M5": [0.58,24],
      "M6": [0.60,25],  "M7": [0.63,26],  "M8": [0.66,27],  "M9": [0.69,28],
      "M10": [0.72,29], "G1": [0.82,30],  "G2": [0.85,31],  "G3": [0.88,32],
      "G4": [0.91,33],  "G5": [0.94,34],  "G6": [0.98,35],  "G7": [1.02,36],
      "G8": [1.06,37],  "G9": [1.10,38],  "G10": [1.15,39], "P": [1.25,40]};
  return conversionDic[level]
}


function createInputs() {
  
  var nameOrder = 0;
  var defaultDic = Object();
  var allElementToCreate = this.querySelectorAll("[data-create]");
  
  allElementToCreate.forEach(function(element) {
    var dataset = element.dataset
    switch (dataset.create) {
      case "form":
        var form = document.createElement("form");
        var parent = element.parentElement
        form.appendChild(element);
        parent.appendChild(form);
        break;
      case "select":
        var select = document.createElement("select");
        select.name = nameOrder;
        defaultDic[select.name] = convertSkillLevel(dataset.value)[0];
        defaultDic[Number(select.name+1)] = convertSkillLevel(dataset.value)[1];
        for (var i = 40; i >= 1; i--) {
          var option = document.createElement("option");
          if (i==40) {
            option.textContent="P";
          } else if (i >= 30) {
            option.textContent="G"+(i-29).toString();
          } else if (i >= 20) {
            option.textContent="M"+(i-19).toString();
          } else {
            option.textContent=i;
          }
          select.appendChild(option);
        }
        element.appendChild(select);
        nameOrder = nameOrder+2;
        break;
      case "input":
        defaultDic[nameOrder] = Number(dataset.value);
        delete dataset.create
        var input = document.createElement("input");
        for (var key in dataset) {
          input[key]= dataset[key];
        }
        input.name = nameOrder;
        input.setAttribute("required", "");
        element.appendChild(input);
        nameOrder = nameOrder+1;
        break;
      case "submit":
        var inputSubmit = document.createElement("input");
        inputSubmit.type = "submit";
        element.appendChild(inputSubmit);
        break;
    }
  });
  return defaultDic
}


function createOutputData() {
    var output = this.querySelectorAll("[data-formule]");
    var outputData = new Array(0);
    output.forEach(function(el) {
      var ouputObject = {
        "object": el,
        "coeff": el.dataset.formule.split(",").map(Number),
        "param": el.dataset.param.split(",").map(Number),
        "floor": Number(el.dataset.floor)
      }
      if (ouputObject["coeff"].length === 1) {
        ouputObject["coeff"] = el.dataset.formule;
      }
      outputData.push(ouputObject);
    });
  return outputData
}


function filterCoeff(values, param) {
  var filterValues = [1];
  for (var i = 0; i <= param.length-1; i++) {
    if (param[i+1] === 1) {
      filterValues.push(values[i]);
    }
  }
  return filterValues;
}

function calculusWithCoeff(coeffFromOutput, valuesToUse, n) {
  var value = 0;
  var c = 0;
  for (var i=0; i < n; i++) {
    for (var j=0; j < n-i; j++) {
      value += Number(coeffFromOutput[c])*valuesToUse[i]*valuesToUse[i+j];
      c += 1;
    }
  }
  return value
}

function calculus(valuesFromForm, coeffFromOutput, paramFromOutput, floor) {
  
  var valuesToUse = filterCoeff(valuesFromForm, paramFromOutput);
  var n = valuesToUse.length;
  
  if (typeof(coeffFromOutput) === "string") {
    var value = 0;
    var r = /var\d+/g;
    coeffFromOutput.match(r).forEach(function(rr){
      coeffFromOutput = coeffFromOutput.replace(rr, valuesToUse[Number(rr.slice(3))+1])
    })
    coeffFromOutput.split("+").forEach(function(p){
      var sp = 1;
      p.split("x").forEach(function(pp){
        sp *= pp
      });
      value += sp
    });
    
  } else {
        
    if (n*(n+1)/2 === coeffFromOutput.length) {
      value = calculusWithCoeff(coeffFromOutput, valuesToUse, n)
    } else if (n*(n+1) === coeffFromOutput.length) {
      value = calculusWithCoeff(coeffFromOutput, valuesToUse, n)/calculusWithCoeff(coeffFromOutput.slice(n*(n+1)/2), valuesToUse, n);
    } else {
      return "error"
    }
  }
  return Math.floor(value*10**floor)/10**floor
}


function changeTextContent(valuesFromForm, objectWithFormula, number, bol=true) {
  objectWithFormula.forEach(function(el) {
    if ( (bol && (number === -1 || el.param[Number(number) + 1] === 1)) || ( !bol && (el.param[Number(number) + 1] === 1 || el.param[Number(number) + 2] === 1)) ) {
      el.object.textContent = calculus(valuesFromForm, el.coeff, el.param, el.floor);
    }
  });
}


function updateFormula(tab, coeffs, name) {
  coeffs.forEach( function(coeff) {
    if (coeff["param"][name] === 1) {
      changeContent(tab, coeff, name);
    }
  })
}


function getFormValuesAndUpdateValues(context, array, data, dataSkill) {
  
  if (dataSkill[0] && dataSkill[3] !== null) {
    updateSkillWindow(dataSkill, array["1"]);
  }
  
  context.addEventListener("submit", function(e) {
    e.preventDefault()
  })
  
  context.addEventListener("change", function(e) {
    var targetValue = Number(e.target.value);
    var targetName = e.target.name
    if (e.target.tagName === "INPUT") {
      if (targetValue >= Number(e.target.min) && targetValue <= Number(e.target.max)) {
        array[targetName] = targetValue;
      }
      changeTextContent(array, data, targetName);
    } else if (e.target.tagName === "SELECT") {
      var selectValue = convertSkillLevel(e.target.value);
      array[targetName] = selectValue[0];
      array[Number(targetName+1)] = selectValue[1];
      changeTextContent(array, data, targetName, false);
      if (dataSkill[0] && dataSkill[3] !== null) {
        updateSkillWindow(dataSkill, selectValue[1]);
      }
    }
  });
}


function createDataSkill() {
  var skillLevel = this.querySelector("#skill-level");
  var skillName = this.querySelector("#skill-name");
  var skillUp = this.querySelector("#skill-up");
  if (skillLevel === null) {
    return [false]
  }
  return [true, skillLevel, skillName, skillUp]
}


function updateSkillWindow(dataSkill, selectValue) {
  dataSkill[1].parentElement.classList.remove("tabber-noactive");
  dataSkill[3].parentElement.classList.remove("tabber-noactive");
  if (selectValue === 40) {
    dataSkill[1].parentElement.classList.add("tabber-noactive");
    dataSkill[2].textContent = dataSkill[2].dataset.nameP
    dataSkill[3].textContent = "Maître parfait";
  } else if (selectValue >= 30 && selectValue <= 39) {
    dataSkill[1].textContent = selectValue-29;
    dataSkill[2].textContent = dataSkill[2].dataset.nameG
    dataSkill[3].textContent = "Grand Maître";
  } else if (selectValue >= 20 && selectValue <= 29) {
    dataSkill[1].textContent = selectValue-19;
    dataSkill[2].textContent = dataSkill[2].dataset.nameM
    dataSkill[3].textContent = "Maître";
  } else {
    dataSkill[1].textContent = selectValue;
    dataSkill[2].textContent = dataSkill[2].dataset.nameP
    dataSkill[3].parentElement.classList.add("tabber-noactive");
  }
  if (selectValue === 39 || selectValue === 29) {
    dataSkill[1].textContent += " (Master)";
  }
}


(function() {
  
  var skillContainers = document.querySelectorAll("div#mw-content-text div.skill-container");
 
  skillContainers.forEach( function(skillContainer) {
    
    var initialValuesArray = createInputs.call(skillContainer);
    var outputData = createOutputData.call(skillContainer);
    var dataSkill = createDataSkill.call(skillContainer);
    var form = skillContainer.querySelector("form");
    
    changeTextContent(initialValuesArray, outputData, -1);
    getFormValuesAndUpdateValues(form, initialValuesArray, outputData, dataSkill);
  });
})();