MediaWiki:Script/Skills.js
Révision datée du 11 juin 2022 à 10:54 par Dexter (discussion | contributions)
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) {
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);
});
})();