MediaWiki:Script/Skills.js : Différence entre versions
(2 révisions intermédiaires par le même utilisateur non affichées) | |||
Ligne 80 : | Ligne 80 : | ||
var outputData = new Array(0); | var outputData = new Array(0); | ||
output.forEach(function(el) { | 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 | return outputData | ||
Ligne 102 : | Ligne 105 : | ||
} | } | ||
+ | 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) { | + | function calculus(valuesFromForm, coeffFromOutput, paramFromOutput, floor) { |
var valuesToUse = filterCoeff(valuesFromForm, paramFromOutput); | var valuesToUse = filterCoeff(valuesFromForm, paramFromOutput); | ||
var n = valuesToUse.length; | var n = valuesToUse.length; | ||
− | |||
− | if ( | + | 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 { | } 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 | ||
} | } | ||
Ligne 127 : | Ligne 153 : | ||
objectWithFormula.forEach(function(el) { | 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)) ) { | 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.object.textContent = calculus(valuesFromForm, el.coeff, el.param, el.floor); |
} | } | ||
}); | }); | ||
Ligne 144 : | Ligne 170 : | ||
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 191 : | ||
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 216 : | ||
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 231 : | ||
} | } | ||
if (selectValue === 39 || selectValue === 29) { | if (selectValue === 39 || selectValue === 29) { | ||
− | dataSkill[1].textContent += " (Master)" | + | dataSkill[1].textContent += " (Master)"; |
} | } | ||
} | } |
Version actuelle datée du 6 août 2022 à 07:47
/* 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);
});
})();