您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Faire des jets avec prise en compte des stats via des compétences
当前为
- // ==UserScript==
- // @name Roll
- // @namespace InGame
- // @author Odul, MockingJay
- // @match https://www.dreadcast.net/Main
- // @version 1.2
- // @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],
- }
- // CORE FNS //
- 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) {
- 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);
- }
- // GUI //
- $("body").append(`<style>
- #rollPanel {
- position: absolute;
- right: -220px;
- bottom: 20px;
- z-index: 999999;
- display: flex;
- }
- #rollPanel button, #rollPanel input, #rollPanel select {
- background-color: #8ab6e4;
- }
- #rollToggle {
- background-color: #6ea0d3;
- height: fit-content;
- }
- #rollToggle button {
- height: 50px;
- width: 50px;
- }
- #rollOptions {
- background-color: #6ea0d3;
- padding: 10px;
- width: 200px;
- }
- #rollOptions label, #rollHasThreshold {
- vertical-align: middle;
- }
- #rollType, #rollThreshold, .rollPresetDiff {
- height: 30px;
- }
- .rollPresetDiff {
- flex: 1;
- }
- #rollType {
- max-width: 160px;
- }
- #rollThreshold {
- -moz-appearance: textfield;
- text-align: center;
- }
- #rollThreshold::-webkit-outer-spin-button,
- #rollThreshold::-webkit-inner-spin-button {
- -webkit-appearance: none;
- margin: 0;
- }
- #rollPresetDiffs {
- display: flex;
- }
- #rollSubmit {
- width: 100%;
- height: 40px;
- font-size: 18px;
- }
- </style>`);
- $("body").append(`
- <div id="rollPanel">
- <div id="rollToggle">
- <button>< Roll</button>
- </div>
- <div id="rollOptions">
- <label for="rollType">Test:</label>
- <select name="rollType" id="rollType">
- <option value="">Standard (1d100)</option>
- </select>
- <br><br>
- <input type="checkbox" name="rollHasThreshold" id="rollHasThreshold">
- <label for="rollHasThreshold">Seuil de réussite</label>
- <input type="number" name="rollThreshold" id="rollThreshold" min="0" max="100" value="0" disabled>
- <br><br>
- <div id="rollPresetDiffs">
- <button id="rollSetEasy" class="rollPresetDiff" value="25" disabled>Facile</button>
- <button id="rollSetMedium" class="rollPresetDiff" value="50" disabled>Moyen</button>
- <button id="rollSetHard" class="rollPresetDiff" value="75" disabled>Difficile</button>
- </div>
- <br>
- <button id="rollSubmit">Lancer</button>
- </div>
- </div>
- `);
- for (let formula in formulas) {
- $("#rollType").append(`<option value="${formula}">${formula}</option>`);
- }
- let showGUI = false;
- $("#rollToggle button").click(function() {
- if (showGUI) {
- $("#rollPanel").css("right", "-220px");
- $("#rollToggle button").text("< Roll");
- showGUI = false;
- }
- else {
- $("#rollPanel").css("right", "0px");
- $("#rollToggle button").text("> Roll");
- showGUI = true;
- }
- });
- $("#rollHasThreshold").change(function() {
- if ($("#rollHasThreshold").attr("checked")) {
- $(".rollPresetDiff, #rollThreshold").prop("disabled", false);
- $("#rollThreshold").select();
- }
- else {
- $(".rollPresetDiff, #rollThreshold").prop("disabled", true);
- }
- });
- $(".rollPresetDiff").click(function() {
- $("#rollThreshold").val($(this).attr("value")).select();
- });
- $("#rollSubmit").click(function() {
- const rollType = $("#rollType").val();
- let roll = "/roll ";
- if (!rollType) {
- roll += "1d100";
- } else {
- roll += rollType;
- if ($("#rollHasThreshold").attr("checked")) {
- roll += " ";
- const threshold = parseInt($("#rollThreshold").val());
- switch (threshold) {
- case 25:
- roll += "f";
- break;
- case 50:
- roll += "m";
- break;
- case 75:
- roll += "d";
- break;
- default:
- roll += threshold;
- }
- }
- }
- $("#chatForm .text_chat").val(roll);
- $("#chatForm .text_valider").click();
- $("#rollPanel").css("right", "-220px");
- $("#rollToggle button").text("< Roll");
- showGUI = false;
- });
- // MAIN //
- document.addEventListener('keypress', (e) => {
- if (e.keyCode == 13) {
- jetDes(e);
- }
- }, false);
- $("#chatForm .text_valider").click(jetDes);
- console.log("Script Roll - Actif.");