// ==UserScript==
// @name Roll
// @namespace InGame
// @author Odul, MockingJay
// @match https://www.dreadcast.net/Main
// @version 1.1
// @grant none
// @description Faire des jets avec prise en compte des stats via des compétences
// ==/UserScript==
// Alias de commandes, utiliser le format suivant:
// alias: "commande",
const aliases = {
for: "force",
agi: "agilite",
res: "resistance",
per: "perception",
fur: "furtivite",
fufu: "furtivite",
info: "informatique",
inf: "informatique",
med: "medecine",
inge: "ingenierie",
ing: "ingenierie",
}
// Pour ajouter des formules personnalisées:
// - Le nom doit être en minuscules, sans accents si espaces, underscores autorisés
// - Les coefficients sont dans l'ordre: force, agilité, résistance, perception, furtivité, informatique, médecine, ingénierie
const formulas = {
force: [1, 0, 0, 0, 0, 0, 0, 0],
agilite: [0, 1, 0, 0, 0, 0, 0, 0],
resistance: [0, 0, 1, 0, 0, 0, 0, 0],
perception: [0, 0, 0, 1, 0, 0, 0, 0],
furtivite: [0, 0, 0, 0, 1, 0, 0, 0],
informatique: [0, 0, 0, 0, 0, 1, 0, 0],
medecine: [0, 0, 0, 0, 0, 0, 1, 0],
ingenierie: [0, 0, 0, 0, 0, 0, 0, 1],
dpasse: [1, 2, 0, 1, 0, 0, 0, 0],
drecep: [1, 1, 0, 2, 0, 0, 0, 0],
dplaque: [3, 1, 0, 0, 0, 0, 0, 0],
dfeinte: [1, 1, 0, 1, 0, 0, 0, 0],
dinter: [0, 1, 0, 1, 0, 0, 0, 0],
dtir: [1, 1, 0, 0, 0, 0, 0, 0],
darret: [1, 0, 0, 3, 0, 0, 0, 0],
hack: [0, 1, 0, 0, 0, 16, 0, 3],
programmation: [0, 0, 0, 0, 0, 9, 0, 1],
diag_meca: [0, 0, 0, 2, 0, 1, 0, 2],
cablage: [0, 0, 0, 0, 0, 3, 0, 7],
assemblage: [0, 0, 0, 1, 0, 0, 0, 4],
desassemblage: [1, 0, 0, 0, 0, 0, 0, 4],
reparation: [1, 0, 0, 0, 0, 0, 0, 4],
soudure: [1, 0, 0, 3, 0, 0, 0, 6],
crochetage: [0, 1, 0, 0, 0, 0, 0, 3],
desamorcer: [0, 1, 0, 3, 0, 0, 0, 16],
diag_medical: [0, 0, 0, 1, 0, 0, 4, 0],
chirurgie: [0, 1, 0, 1, 0, 0, 3, 0],
massage_cardiaque: [3, 0, 0, 0, 0, 0, 7, 0],
perfusion: [0, 1, 0, 2, 0, 0, 2, 0],
desinfecter: [0, 3, 0, 0, 0, 0, 2, 0],
garot: [1, 0, 0, 0, 0, 0, 1, 0],
tir: [0, 1, 0, 4, 0, 0, 0, 0],
parade: [0, 4, 0, 1, 0, 0, 0, 0],
esquive: [1, 9, 0, 0, 0, 0, 0, 0],
liberation: [4, 5, 0, 0, 0, 0, 0, 1],
immobilisation: [1, 0, 1, 0, 0, 0, 0, 0],
equilibre: [0, 4, 1, 0, 0, 0, 0, 0],
volonte: [4, 2, 9, 1, 1, 1, 1, 1],
blessure: [0, 1, 9, 0, 0, 0, 0, 0],
enfoncer: [7, 0, 3, 0, 0, 0, 0, 0],
mensonge: [0, 3, 0, 0, 5, 0, 2, 0],
dmensonge: [0, 3, 0, 5, 0, 0, 2, 0],
maquillage: [0, 8, 0, 2, 0, 0, 0, 0],
musique: [0, 3, 0, 2, 0, 0, 0, 0],
accorder: [0, 0, 0, 2, 0, 0, 0, 3],
fee_lation: [0, 6, 0, 1, 0, 0, 4, 0],
orgasme: [0, 1, 1, 0, 0, 0, 0, 0],
skype: [0, 0, 0, 0, 0, 0, 2, 0],
fee_niasse: [0, 1, 1, 0, 0, 0, 0, 0],
overflow: [1, 1, 1, 1, 1, 1, 1, 1],
}
const getStats = function() {
let stats = [];
for (let i = 1; i <= 8; i++) {
stats.push(parseInt($('#statistiques .infos .stat_' + i + '_entier').text()));
}
return stats;
}
const computeValue = function(skillName){
if (!formulas[skillName]) {
return null;
}
const stats = getStats();
const totalWeight = formulas[skillName].reduce(((total, weight) => total + weight), 0);
const skillPoints = stats.reduce(((total, stat, i) => total + stat * formulas[skillName][i]), 0);
return 100 - Math.floor((skillPoints / totalWeight) / 6);
}
const retrieveValue = function(facesde, comp, diff)
{
const ligne = $("#chatContent > .msg.hrp > em").last().text();
if (!ligne) {
return;
}
if (ligne.includes($("txt_pseudo").text() + " lance 1 dé de " + facesde + " et fait")) {
let result = parseInt(ligne.substring(ligne.indexOf("et fait") + 7).trim()) + (100 - facesde);
let threshold = 0;
switch(diff) {
case "f":
case "facile":
threshold = 25;
diff = "facile";
break;
case "m":
case "moyen":
threshold = 50;
diff = "moyen";
break;
case "d":
case "difficile":
threshold = 75;
diff = "difficile";
break;
default:
threshold = parseInt(diff) || 0;
}
let textResult = "";
if (!threshold) {
textResult += "/me [couleur=jaune]fait "+ result +" à son jet de " + comp + "[/couleur]";
}
else if (["facile", "moyen", "difficile"].includes(diff)) {
textResult += result >= threshold ?
"/me [couleur=vert]réussit[/couleur] " :
"/me [couleur=rouge]rate[/couleur] ";
textResult += "[couleur=jaune]un jet " + diff + " de " + comp + " et fait " + result + "[/couleur]";
}
else {
textResult += result >= threshold ?
"/me [couleur=vert]réussit[/couleur] " :
"/me [couleur=rouge]rate[/couleur] ";
textResult += "[couleur=jaune]un jet de " + comp + " en faisant " + result + " contre un seuil de " + threshold + "[/couleur]";
}
$("#chatForm .text_chat").val(textResult);
nav.getChat().send();
}
}
const jetDes = function(e) {
if (e.keyCode==13) {
let value = $("#chatForm .text_chat").val();
if (!value.match(/^\/roll [a-zA-Z]+/)) {
return; // Ne traiter que l'envoi de /roll avec commande (ignore également les XdY)
}
value = value.replace(/[àâ]/g, "a").replace(/[éèê]/g, "e").replace(/[î]/g, "i").replace(/[ô]/g, "o").replace(/[ûù]/g, "u");
// Essayer d'ignorer les accents
let comp = value.trim().split(" ")[1].toLowerCase();
const diff = value.trim().split(" ")[2];
comp = aliases[comp] || comp;
const facesde = computeValue(comp);
if (facesde) {
value = '/roll 1d' + facesde;
setTimeout(function() {
retrieveValue(facesde, comp, diff)
}, 500);
}
else {
e.preventDefault(); // Empêche l'envoi d'un roll mal écrit
}
$("#chatForm .text_chat").val(value);
}
}
document.addEventListener('keypress', jetDes, false);
console.log("Script Roll - Actif.");