Roll

Faire des jets avec prise en compte des stats via des compétences

当前为 2022-07-09 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name Roll
  3. // @namespace InGame
  4. // @author Odul, MockingJay
  5. // @match https://www.dreadcast.net/Main
  6. // @version 1.0
  7. // @grant none
  8. // @description Faire des jets avec prise en compte des stats via des compétences
  9. // @license MIT
  10. // ==/UserScript==
  11.  
  12. // Alias de commandes, utiliser le format suivant:
  13. // alias: "commande",
  14. const aliases = {
  15. for: "force",
  16. agi: "agilite",
  17. res: "resistance",
  18. per: "perception",
  19. fur: "furtivite",
  20. fufu: "furtivite",
  21. info: "informatique",
  22. inf: "informatique",
  23. med: "medecine",
  24. inge: "ingenierie",
  25. ing: "ingenierie",
  26. }
  27.  
  28. // Pour ajouter des formules personnalisées:
  29. // - Le nom doit être en minuscules, sans accents si espaces, underscores autorisés
  30. // - Les coefficients sont dans l'ordre: force, agilité, résistance, perception, furtivité, informatique, médecine, ingénierie
  31. const formulas = {
  32. force: [1, 0, 0, 0, 0, 0, 0, 0],
  33. agilite: [0, 1, 0, 0, 0, 0, 0, 0],
  34. resistance: [0, 0, 1, 0, 0, 0, 0, 0],
  35. perception: [0, 0, 0, 1, 0, 0, 0, 0],
  36. furtivite: [0, 0, 0, 0, 1, 0, 0, 0],
  37. informatique: [0, 0, 0, 0, 0, 1, 0, 0],
  38. medecine: [0, 0, 0, 0, 0, 0, 1, 0],
  39. ingenierie: [0, 0, 0, 0, 0, 0, 0, 1],
  40. dpasse: [1, 2, 0, 1, 0, 0, 0, 0],
  41. drecep: [1, 1, 0, 2, 0, 0, 0, 0],
  42. dplaque: [3, 1, 0, 0, 0, 0, 0, 0],
  43. dfeinte: [1, 1, 0, 1, 0, 0, 0, 0],
  44. dinter: [0, 1, 0, 1, 0, 0, 0, 0],
  45. dtir: [1, 1, 0, 0, 0, 0, 0, 0],
  46. darret: [1, 0, 0, 3, 0, 0, 0, 0],
  47. hack: [0, 1, 0, 0, 0, 16, 0, 3],
  48. programmation: [0, 0, 0, 0, 0, 9, 0, 1],
  49. diag_meca: [0, 0, 0, 2, 0, 1, 0, 2],
  50. cablage: [0, 0, 0, 0, 0, 3, 0, 7],
  51. assemblage: [0, 0, 0, 1, 0, 0, 0, 4],
  52. desassemblage: [1, 0, 0, 0, 0, 0, 0, 4],
  53. reparation: [1, 0, 0, 0, 0, 0, 0, 4],
  54. soudure: [1, 0, 0, 3, 0, 0, 0, 6],
  55. crochetage: [0, 1, 0, 0, 0, 0, 0, 3],
  56. desamorcer: [0, 1, 0, 3, 0, 0, 0, 16],
  57. diag_medical: [0, 0, 0, 1, 0, 0, 4, 0],
  58. chirurgie: [0, 1, 0, 1, 0, 0, 3, 0],
  59. massage_cardiaque: [3, 0, 0, 0, 0, 0, 7, 0],
  60. perfusion: [0, 1, 0, 2, 0, 0, 2, 0],
  61. desinfecter: [0, 3, 0, 0, 0, 0, 2, 0],
  62. garot: [1, 0, 0, 0, 0, 0, 1, 0],
  63. tir: [0, 1, 0, 4, 0, 0, 0, 0],
  64. parade: [0, 4, 0, 1, 0, 0, 0, 0],
  65. esquive: [1, 9, 0, 0, 0, 0, 0, 0],
  66. liberation: [4, 5, 0, 0, 0, 0, 0, 1],
  67. immobilisation: [1, 0, 1, 0, 0, 0, 0, 0],
  68. equilibre: [0, 4, 1, 0, 0, 0, 0, 0],
  69. volonte: [4, 2, 9, 1, 1, 1, 1, 1],
  70. blessure: [0, 1, 9, 0, 0, 0, 0, 0],
  71. enfoncer: [7, 0, 3, 0, 0, 0, 0, 0],
  72. mensonge: [0, 3, 0, 0, 5, 0, 2, 0],
  73. dmensonge: [0, 3, 0, 5, 0, 0, 2, 0],
  74. maquillage: [0, 8, 0, 2, 0, 0, 0, 0],
  75. musique: [0, 3, 0, 2, 0, 0, 0, 0],
  76. accorder: [0, 0, 0, 2, 0, 0, 0, 3],
  77. fee_lation: [0, 6, 0, 1, 0, 0, 4, 0],
  78. orgasme: [0, 1, 1, 0, 0, 0, 0, 0],
  79. skype: [0, 0, 0, 0, 0, 0, 2, 0],
  80. fee_niasse: [0, 1, 1, 0, 0, 0, 0, 0],
  81. overflow: [1, 1, 1, 1, 1, 1, 1, 1],
  82. }
  83.  
  84. const getStats = function() {
  85. let stats = [];
  86.  
  87. for (let i = 1; i <= 8; i++) {
  88. stats.push(parseInt($('#statistiques .infos .stat_' + i + '_entier').text()));
  89. }
  90.  
  91. return stats;
  92. }
  93.  
  94. const computeValue = function(skillName){
  95. if (!formulas[skillName]) {
  96. return null;
  97. }
  98.  
  99. const stats = getStats();
  100. const totalWeight = formulas[skillName].reduce(((total, weight) => total + weight), 0);
  101. const skillPoints = stats.reduce(((total, stat, i) => total + stat * formulas[skillName][i]), 0);
  102.  
  103. return 100 - Math.floor((skillPoints / totalWeight) / 6);
  104. }
  105.  
  106. const retrieveValue = function(facesde, comp, diff)
  107. {
  108. const chatContent = $("#chatContent").text().trim().replace(/[^\S\n]{2,}/g, ' ');
  109.  
  110. if (!chatContent) {
  111. return;
  112. }
  113.  
  114. const lignes = chatContent.split("\n");
  115.  
  116. for (let i = lignes.length - 1; i >= 0; i--) {
  117. let ligne = lignes[i].trim();
  118.  
  119. if (ligne.includes($("txt_pseudo").text() + " lance 1 dé de " + facesde + " et fait")) {
  120.  
  121. let result = parseInt(ligne.substring(ligne.indexOf("et fait") + 7).trim()) + (100 - facesde);
  122. let threshold = 0;
  123.  
  124. switch(diff) {
  125. case "f":
  126. case "facile":
  127. threshold = 25;
  128. diff = "facile";
  129. break;
  130. case "m":
  131. case "moyen":
  132. threshold = 50;
  133. diff = "moyen";
  134. break;
  135. case "d":
  136. case "difficile":
  137. threshold = 75;
  138. diff = "difficile";
  139. break;
  140. default:
  141. threshold = parseInt(diff) || 0;
  142. }
  143.  
  144. let textResult = "";
  145.  
  146. if (!threshold) {
  147. textResult += "/me [couleur=jaune]fait "+ result +" à son jet de " + comp + "[/couleur]";
  148. }
  149. else if (["facile", "moyen", "difficile"].includes(diff)) {
  150. textResult += result >= threshold ?
  151. "/me [couleur=vert]réussit[/couleur] " :
  152. "/me [couleur=rouge]rate[/couleur] ";
  153. textResult += "[couleur=jaune]un jet " + diff + " de " + comp + " et fait " + result + "[/couleur]";
  154. }
  155. else {
  156. textResult += result >= threshold ?
  157. "/me [couleur=vert]réussit[/couleur] " :
  158. "/me [couleur=rouge]rate[/couleur] ";
  159. textResult += "[couleur=jaune]un jet de " + comp + " en faisant " + result + " contre un seuil de " + threshold + "[/couleur]";
  160. }
  161.  
  162. $("#chatForm .text_chat").val(textResult);
  163. nav.getChat().send();
  164. break;
  165. }
  166. }
  167.  
  168. }
  169.  
  170. const jetDes = function(e) {
  171. if (e.keyCode==13) {
  172. let value = $("#chatForm .text_chat").val();
  173.  
  174. if (!value.match(/^\/roll [a-zA-Z]+/)) {
  175. return; // Ne traiter que l'envoi de /roll avec commande (ignore également les XdY)
  176. }
  177.  
  178. let comp = value.trim().split(" ")[1].toLowerCase();
  179. const diff = value.trim().split(" ")[2];
  180.  
  181. comp = aliases[comp] || comp;
  182. const facesde = computeValue(comp);
  183.  
  184. if (facesde) {
  185. value = '/roll 1d' + facesde;
  186. setTimeout(function() {
  187. retrieveValue(facesde, comp, diff)
  188. }, 500);
  189. }
  190. else {
  191. e.preventDefault(); // Empêche l'envoi d'un roll mal écrit
  192. }
  193.  
  194. $("#chatForm .text_chat").val(value);
  195.  
  196. }
  197. }
  198.  
  199. document.addEventListener('keypress', jetDes, false);
  200. console.log("Script Roll - Actif.");