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 | + | 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){ | + | |
− | + | 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 | + | |
+ | function calculus(valuesFromForm, coeffFromOutput, paramFromOutput) { | ||
− | var | + | var valuesToUse = filterCoeff(valuesFromForm, paramFromOutput); |
− | + | var n = valuesToUse.length; | |
− | + | var value = 0; | |
− | |||
− | |||
− | var | ||
− | var | ||
− | |||
− | + | 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"]); | ||
} | } | ||
− | function | + | context.addEventListener("submit", function(e) { |
− | + | e.preventDefault() | |
− | var | + | }) |
− | var | + | |
− | + | context.addEventListener("change", function(e) { | |
− | + | var targetValue = Number(e.target.value); | |
− | + | var targetName = e.target.name | |
− | if ( | + | 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(){ | + | |
+ | (function() { | ||
− | var | + | 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); | ||
}); | }); | ||
− | |||
})(); | })(); |
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);
});
})();