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

Ligne 144 : Ligne 144 :
 
function getFormValuesAndUpdateValues(context, array, data, dataSkill) {
 
function getFormValuesAndUpdateValues(context, array, data, dataSkill) {
 
    
 
    
   if (dataSkill[0]) {
+
   if (dataSkill[0] && dataSkill[3] !== null) {
 
     updateSkillWindow(dataSkill, array["1"]);
 
     updateSkillWindow(dataSkill, array["1"]);
 
   }
 
   }
Ligne 165 : Ligne 165 :
 
       array[Number(targetName+1)] = selectValue[1];
 
       array[Number(targetName+1)] = selectValue[1];
 
       changeTextContent(array, data, targetName, false);
 
       changeTextContent(array, data, targetName, false);
       if (dataSkill[0]) {
+
       if (dataSkill[0] && dataSkill[3] !== null) {
 
         updateSkillWindow(dataSkill, selectValue[1]);
 
         updateSkillWindow(dataSkill, selectValue[1]);
 
       }
 
       }
Ligne 190 : Ligne 190 :
 
     dataSkill[1].parentElement.classList.add("tabber-noactive");
 
     dataSkill[1].parentElement.classList.add("tabber-noactive");
 
     dataSkill[2].textContent = dataSkill[2].dataset.nameP
 
     dataSkill[2].textContent = dataSkill[2].dataset.nameP
     dataSkill[3].textContent = "Maître parfait"
+
     dataSkill[3].textContent = "Maître parfait";
 
   } else if (selectValue >= 30 && selectValue <= 39) {
 
   } else if (selectValue >= 30 && selectValue <= 39) {
 
     dataSkill[1].textContent = selectValue-29;
 
     dataSkill[1].textContent = selectValue-29;
 
     dataSkill[2].textContent = dataSkill[2].dataset.nameG
 
     dataSkill[2].textContent = dataSkill[2].dataset.nameG
     dataSkill[3].textContent = "Grand Maître"
+
     dataSkill[3].textContent = "Grand Maître";
 
   } else if (selectValue >= 20 && selectValue <= 29) {
 
   } else if (selectValue >= 20 && selectValue <= 29) {
 
     dataSkill[1].textContent = selectValue-19;
 
     dataSkill[1].textContent = selectValue-19;
 
     dataSkill[2].textContent = dataSkill[2].dataset.nameM
 
     dataSkill[2].textContent = dataSkill[2].dataset.nameM
     dataSkill[3].textContent = "Maître"
+
     dataSkill[3].textContent = "Maître";
 
   } else {
 
   } else {
 
     dataSkill[1].textContent = selectValue;
 
     dataSkill[1].textContent = selectValue;
Ligne 205 : Ligne 205 :
 
   }
 
   }
 
   if (selectValue === 39 || selectValue === 29) {
 
   if (selectValue === 39 || selectValue === 29) {
     dataSkill[1].textContent += " (Master)"
+
     dataSkill[1].textContent += " (Master)";
 
   }
 
   }
 
}
 
}

Version du 18 juillet 2022 à 10:05

/* 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] && 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);
  });
})();