MediaWiki:Script/Skills.js : Différence entre versions

Ligne 1 : Ligne 1 :
 
/* Ce script sera chargé uniquement sur les pages en ayant besoin (les pages de compétences) */
 
/* Ce script sera chargé uniquement sur les pages en ayant besoin (les pages de compétences) */
  
function createInput() {
+
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]");
 
   var allElementToCreate = this.querySelectorAll("[data-create]");
   allElementToCreate.forEach(function(element){
+
 
     if (element.dataset.create==="select"){
+
   allElementToCreate.forEach(function(element) {
      var select = document.createElement("select");
+
     var dataset = element.dataset
      select.id="skill-select";
+
    switch (dataset.create) {
      for(var i = 40; i >= 1; i--) {
+
      case "form":
        var option = document.createElement("option");
+
        var form = document.createElement("form");
        if (i==40) {
+
        var parent = element.parentElement
          option.textContent="P";
+
        form.appendChild(element);
        } else if (i >= 30) {
+
        parent.appendChild(form);
          option.textContent="G"+(i-29).toString();
+
        break;
        } else if (i >= 20) {
+
      case "select":
          option.textContent="M"+(i-19).toString();
+
        var select = document.createElement("select");
        } else {
+
        select.name = nameOrder;
          option.textContent=i;
+
        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];
 
         }
 
         }
         select.appendChild(option);
+
         input.name = nameOrder;
      }
+
        input.setAttribute("required", "");
      element.appendChild(select);
+
        element.appendChild(input);
    } else if (element.dataset.create==="input") {
+
        nameOrder = nameOrder+1;
      var input = document.createElement("input");
+
        break;
      input.type = "number";
+
      case "submit":
      input.min = "1";
+
        var inputSubmit = document.createElement("input");
      input.max = element.dataset.max;
+
        inputSubmit.type = "submit";
      input.value = "90";
+
        element.appendChild(inputSubmit);
      element.appendChild(input);
+
        break;
 
     }
 
     }
 
   });
 
   });
 +
  return defaultDic
 +
}
 +
 +
 +
function createOutputData() {
 +
    var output = this.querySelectorAll("[data-formule]");
 +
    var outputData = new Array(0);
 +
    output.forEach(function(el) {
 +
      outputData.push(
 +
        {
 +
          "object": el,
 +
          "coeff": el.dataset.formule.split(",").map(Number),
 +
          "param": el.dataset.param.split(",").map(Number)
 +
        }
 +
      );
 +
    });
 +
  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 updateSkill() {
+
 
 +
function calculus(valuesFromForm, coeffFromOutput, paramFromOutput) {
 
    
 
    
   var selectLevel = this.querySelector("#skill-select");
+
   var valuesToUse = filterCoeff(valuesFromForm, paramFromOutput);
  var names = this.querySelector("div#skill-name").dataset
+
   var n = valuesToUse.length;
  var skillName = this.querySelector("#skill-name");
+
   var value = 0;
  var skillLevel = this.querySelector("#skill-level");
 
  var skillUp = this.querySelector("#skill-up");
 
   var formules = this.querySelectorAll("[data-formule]");
 
   var inputs = this.querySelectorAll("input");
 
  var coeffSkill = [0.05,0.06,0.08,0.10,0.12,0.14,0.16,0.18,0.20,0.22,0.24,0.26,0.28,0.30,0.32,0.34,0.36,0.38,0.40,0.50,0.52,0.54,0.56,0.58,0.60,0.63,0.66,0.69,0.72,0.82,0.85,0.88,0.91,0.94,0.98,1.02,1.06,1.10,1.15,1.25];
 
 
    
 
    
   updateSkillWindow.call(selectLevel)
+
   if (n*(n+1)/2 != coeffFromOutput.length) {
   selectLevel.addEventListener("change", updateSkillWindow);
+
    return "error"
   inputs.forEach(function(input){
+
  } else {
     input.addEventListener("change", updateSkillWindow);
+
    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 Math.floor(value)
 +
   }
 +
}
 +
 
 +
 
 +
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);
 +
    }
 
   });
 
   });
 +
}
 +
  
  function convertSkillLevel(level) {
+
function updateFormula(tab, coeffs, name) {
    if (level == "P") {
+
  coeffs.forEach( function(coeff) {
      return [40, names["nameP"], "Maître parfait", ""]
+
     if (coeff["param"][name] === 1) {
     } else if (level[0] == "G") {
+
       changeContent(tab, coeff, name);
      return [29+parseInt(level.slice(1)), names["nameG"], "Grand Maître", parseInt(level.slice(1))]
 
    } else if (level[0] == "M") {
 
       return [19+parseInt(level.slice(1)), names["nameM"], "Maître", parseInt(level.slice(1))]
 
 
     }
 
     }
     return [parseInt(level), names["nameP"], "", parseInt(level)]
+
  })
 +
}
 +
 
 +
 
 +
function getFormValuesAndUpdateValues(context, array, data, dataSkill) {
 +
 
 +
  if (dataSkill[0]) {
 +
     updateSkillWindow(dataSkill, array["1"]);
 
   }
 
   }
 
    
 
    
   function calculator(formule, tabValue, param) {
+
   context.addEventListener("submit", function(e) {
      
+
     e.preventDefault()
     var tabCoeff = formule.dataset.formule.split(",");
+
  })
     var value = 0;
+
 
     var tabValueToUse = [];
+
  context.addEventListener("change", function(e) {
   
+
     var targetValue = Number(e.target.value);
     for (var i = 0; i <= param.length; i++) {
+
     var targetName = e.target.name
       if (param[i]==="1"){
+
     if (e.target.tagName === "INPUT") {
         tabValueToUse.push(tabValue[i]);
+
      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]) {
 +
         updateSkillWindow(dataSkill, selectValue[1]);
 
       }
 
       }
 
     }
 
     }
   
+
  });
    var n = tabValueToUse.length;
+
}
 +
 
  
    if (n*(n+1)/2 != tabCoeff.length){
+
function createDataSkill() {
      return "error";
+
  var skillLevel = this.querySelector("#skill-level");
    } else {
+
  var skillName = this.querySelector("#skill-name");
      var c = 0;
+
  var skillUp = this.querySelector("#skill-up");
      for(var i=0; i < n; i++){
+
  if (skillLevel === null) {
        for(var j=0; j < n-i; j++){
+
    return [false]
          value += parseFloat(tabCoeff[c])*tabValueToUse[i]*tabValueToUse[i+j];
 
          c += 1;
 
        }
 
      }
 
      return Math.floor(value);
 
    }
 
 
   }
 
   }
 +
  return [true, skillLevel, skillName, skillUp]
 +
}
  
  function updateSkillWindow() {
 
   
 
    var [skillValue, name, level, skillValue2] = convertSkillLevel(selectLevel.value);
 
    var tabValue = [1,coeffSkill[skillValue-1]];
 
    inputs.forEach(function(input){
 
      if (input.value < parseFloat(input.min)){
 
        input.value = input.min
 
      } else if (input.value > parseFloat(input.max)) {
 
        console.log("oui")
 
        input.value = input.max
 
      }
 
      tabValue.push(input.value);
 
    });
 
  
    skillName.textContent = name;
+
function updateSkillWindow(dataSkill, selectValue) {
   
+
  dataSkill[1].parentElement.classList.remove("tabber-noactive");
    if (level === "") {
+
  dataSkill[3].parentElement.classList.remove("tabber-noactive");
      skillLevel.parentElement.classList.add("tabber-noactive");
+
  if (selectValue === 40) {
    } else {
+
    dataSkill[1].parentElement.classList.add("tabber-noactive");
      skillLevel.parentElement.classList.remove("tabber-noactive");
+
     dataSkill[2].textContent = dataSkill[2].dataset.nameP
      skillLevel.textContent = level;
+
    dataSkill[3].textContent = "Maître parfait"
    }
+
  } else if (selectValue >= 30 && selectValue <= 39) {
   
+
    dataSkill[1].textContent = selectValue-29;
    if (skillValue2 === "") {
+
    dataSkill[2].textContent = dataSkill[2].dataset.nameG
      skillUp.parentElement.classList.add("tabber-noactive");
+
    dataSkill[3].textContent = "Grand Maître"
     } else {
+
  } else if (selectValue >= 20 && selectValue <= 29) {
      skillUp.parentElement.classList.remove("tabber-noactive");
+
    dataSkill[1].textContent = selectValue-19;
      if (skillValue !== 10 && skillValue2 == 10) {
+
    dataSkill[2].textContent = dataSkill[2].dataset.nameM
        skillUp.textContent = skillValue2+" (Master)";
+
     dataSkill[3].textContent = "Maître"
      } else {
+
  } else {
        skillUp.textContent = skillValue2;
+
     dataSkill[1].textContent = selectValue;
      }
+
     dataSkill[2].textContent = dataSkill[2].dataset.nameP
     }
+
    dataSkill[3].parentElement.classList.add("tabber-noactive");
      
+
  }
     formules.forEach(function(formule){
+
  if (selectValue === 39 || selectValue === 29) {
      var param = formule.dataset.param.split(",");
+
    dataSkill[1].textContent += " (Master)"
      var res = calculator(formule, tabValue, param);
 
      formule.textContent = res;
 
    });
 
 
   }
 
   }
 
}
 
}
  
(function(){
+
 
 +
(function() {
 
    
 
    
   var skillContainer = document.querySelectorAll("div#mw-content-text div.skill-container");
+
   var skillContainers = document.querySelectorAll("div#mw-content-text div.skill-container");
 
+
   skillContainer.forEach(function(e){
+
   skillContainers.forEach( function(skillContainer) {
     createInput.call(e);
+
      
     updateSkill.call(e);
+
    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);
 
   });
 
   });
 
 
})();
 
})();

Version du 11 juin 2022 à 10:54

/* 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) {
      outputData.push(
        {
          "object": el,
          "coeff": el.dataset.formule.split(",").map(Number),
          "param": el.dataset.param.split(",").map(Number)
        }
      );
    });
  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 calculus(valuesFromForm, coeffFromOutput, paramFromOutput) {
  
  var valuesToUse = filterCoeff(valuesFromForm, paramFromOutput);
  var n = valuesToUse.length;
  var value = 0;
  
  if (n*(n+1)/2 != coeffFromOutput.length) {
    return "error"
  } else {
    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 Math.floor(value)
  }
}


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);
    }
  });
}


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]) {
    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]) {
        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);
  });
})();