GobZilla

Outils d'aide au jeu

  1. // ==UserScript==
  2. // @name GobZilla
  3. // @namespace Gobland
  4. // @description Outils d'aide au jeu
  5. // @include http://games.gobland.fr/jeuC.html
  6. // @include http://games.gobland.fr/act.php
  7. // @include http://games.gobland.fr/Vue.php
  8. // @include http://games.gobland.fr/Menu.php
  9. // @include http://games.gobland.fr/Meute.php
  10. // @include http://games.gobland.fr/ProfilPerso.php
  11. // @include http://games.gobland.fr/SmallEquipement.php
  12. // @include http://games.gobland.fr/fo_equipement.php*
  13. // @include http://games.gobland.fr/Equipement.php
  14. // @include http://games.gobland.fr/fo_orders.php*
  15. // @include http://games.gobland.fr/amelioration.php
  16. // @include http://games.gobland.fr/Follower.php*
  17. // @include http://games.gobland.fr/Followers.php**
  18. // @include http://games.gobland.fr/Options.php
  19. // @include http://games.gobland.fr/activDLA.php
  20. // @include http://games.gobland.fr/actions.php
  21. // @include http://games.gobland.fr/playActions.php
  22. // @include http://games.gobland.fr/goodies.php*
  23. // @include http://games.gobland.fr/stock.php?*
  24. // @include http://games.gobland.fr/membresClan.php
  25. // @include http://games.gobland.fr/Quetes.php
  26. // @include http://games.gobland.fr/depot.php*
  27. // @match http://games.gobland.fr/index.php*
  28. // @match https://games.gobland.fr/index.php*
  29. // @match http://games.gobland.fr/playActions.php?todo=52
  30. // @require https://cdnjs.cloudflare.com/ajax/libs/raphael/2.3.0/raphael.js
  31. // @require https://greasemonkey.github.io/gm4-polyfill/gm4-polyfill.js
  32. // @require https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js
  33. // @copyright Lordslair, Seishin, Glak (393) et Death Métal (330)
  34. // @author DeathMétal 330 - Glak 393
  35. // @license https://creativecommons.org/licenses/by-sa/4.0/
  36. // @version 2.0.5.0
  37. // @icon https://i.ibb.co/HB9XztJ/gobzilla.jpg
  38. // ==/UserScript==
  39.  
  40.  
  41.  
  42.  
  43.  
  44.  
  45.  
  46. // fonction herboriser (test seulement)
  47. (function() {
  48. 'use strict';
  49.  
  50. const rangMultiplicateur = {
  51. 'Apprenti': 1.5,
  52. 'Compagnon': 2,
  53. 'Maître': 2.5,
  54. 'Grand Maître': 3
  55. };
  56.  
  57. function askPER() {
  58. let per = localStorage.getItem('per_total');
  59. if (!per || isNaN(parseInt(per))) {
  60. per = prompt("Entrez votre PER total (PER + bonus éventuel)");
  61. if (per !== null && !isNaN(parseInt(per))) {
  62. localStorage.setItem('per_total', per);
  63. }
  64. }
  65. return parseInt(per);
  66. }
  67.  
  68. function parsePage() {
  69. const content = document.querySelector('#identite .deborde');
  70. if (!content) return;
  71.  
  72. const html = content.innerHTML;
  73.  
  74. const matchCoord = html.match(/X=(-?\d+)\s+Y=(-?\d+)\s+N=(-?\d+)/);
  75. if (!matchCoord) return;
  76.  
  77. const x0 = parseInt(matchCoord[1]);
  78. const y0 = parseInt(matchCoord[2]);
  79. const n0 = parseInt(matchCoord[3]);
  80.  
  81. const directionMatch = html.match(/elle se trouve ([^<]+)/);
  82. if (!directionMatch) return;
  83.  
  84. const directionText = directionMatch[1];
  85.  
  86. const rangMatch = html.match(/en tant que (\w+ ?\w*)/i);
  87. const rang = rangMatch ? rangMatch[1].trim() : "Apprenti";
  88.  
  89. const per = askPER();
  90. if (!per) return;
  91.  
  92. const portéeMax = Math.floor(rangMultiplicateur[rang] * per);
  93. const portéeMin = Math.floor(rangMultiplicateur['Apprenti'] * per); // portée min = apprenti
  94.  
  95. const direction = {
  96. x: 0,
  97. y: 0,
  98. n: 0
  99. };
  100.  
  101. if (directionText.includes('plus en Osten')) direction.x = 1;
  102. if (directionText.includes('plus en Western')) direction.x = -1;
  103. if (directionText.includes('plus en Nordi')) direction.y = 1;
  104. if (directionText.includes('plus en Sudi')) direction.y = -1;
  105. if (directionText.includes('plus en Haut')) direction.n = 1;
  106. if (directionText.includes('plus en Bas')) direction.n = -1;
  107.  
  108. const nPortéeMin = Math.floor(portéeMin / 2);
  109. const nPortéeMax = Math.floor(portéeMax / 2);
  110.  
  111. const xMin = x0 + direction.x * portéeMin;
  112. const xMax = x0 + direction.x * portéeMax;
  113. const yMin = y0 + direction.y * portéeMin;
  114. const yMax = y0 + direction.y * portéeMax;
  115. const nMin = n0 + direction.n * nPortéeMin;
  116. const nMax = n0 + direction.n * nPortéeMax;
  117.  
  118. const result = `
  119. <div style="border: 2px dashed #4caf50; padding: 8px; margin-top: 10px;">
  120. 📍 <b>Estimation position de la plante</b><br>
  121. Direction : ${directionText}<br>
  122. Coordonnées actuelles : X=${x0}, Y=${y0}, N=${n0}<br>
  123. <b>Fourchette estimée</b> :<br>
  124. X entre ${Math.min(xMin,xMax)} et ${Math.max(xMin,xMax)}<br>
  125. Y entre ${Math.min(yMin,yMax)} et ${Math.max(yMin,yMax)}<br>
  126. N entre ${Math.min(nMin,nMax)} et ${Math.max(nMin,nMax)}<br>
  127. (Portée ${rang} : ${portéeMax} cases, profondeur : ${nPortéeMax})
  128. </div>
  129. `;
  130.  
  131. content.innerHTML += result;
  132. }
  133.  
  134. window.addEventListener('load', parsePage);
  135. })();
  136.  
  137.  
  138.  
  139. //==================================================================
  140. /// Anaglobiseur (calculateur d'évolutiuon) (page amélioration)
  141. //=================================================================
  142.  
  143. if ($(location).attr('href').match(/http:\/\/(.*\.)?gobland\.fr\/amelioration\.php/i)) {
  144.  
  145. // Fonction pour créer les boutons + et -
  146. function createButtons(row, currentValue, costValue, price, updateValueFunc, improvements, specialty, characteristic ) {
  147. const buttonPlus = document.createElement('button');
  148. buttonPlus.textContent = '+';
  149. const buttonMinus = document.createElement('button');
  150. buttonMinus.textContent = '-';
  151. row.appendChild(buttonMinus);
  152. row.appendChild(buttonPlus);
  153.  
  154. buttonPlus.addEventListener('click', () => {
  155. const characteristicName = row.children[0].innerText.split('(')[0].trim();
  156. if (characteristicName === 'Durée du Tour') {
  157. let upgradesDuration = parseInt(row.children[2].innerText);
  158. upgradesDuration--;
  159. row.children[2].innerText = upgradesDuration;
  160. updateDuration(row, upgradesDuration);
  161. costValue += price;
  162. row.children[3].innerText = costValue;
  163. improvements.innerText = parseInt(improvements.innerText) + 1; // Augmente Nb Améliorations
  164. row.children[2].innerText = parseInt(improvements.innerText) + 1
  165. } else if (characteristicName === 'Points de Vie Maximum') {
  166. currentValue += 10;
  167. costValue += price;
  168. row.children[1].innerText = currentValue;
  169. row.children[3].innerText = costValue;
  170. improvements.innerText = parseInt(improvements.innerText) + 1; // Modifier cette ligne
  171. } else {
  172. currentValue = updateValueFunc(currentValue, 1); // Augmenter la valeur
  173. costValue += price; // Mettre à jour le coût
  174. improvements.innerText = parseInt(improvements.innerText) + 1; // Mettre à jour Nb Améliorations
  175. row.children[1].innerText = currentValue; // Mettre à jour la colonne "Valeur Actuelle"
  176. row.children[3].innerText = costValue; // Mettre à jour la colonne "Coût Amélioration Suivante"
  177. }
  178. updateTotalCost();
  179. updateDisplayedValues();
  180. calculateLevel();
  181. adjustPricesBasedOnSpecialty(specialiteJoueur);
  182. getPriceForSpecialty(specialty, characteristic);
  183. });
  184.  
  185. buttonMinus.addEventListener('click', () => {
  186. const characteristicName = row.children[0].innerText.split('(')[0].trim();
  187. if (characteristicName === 'Durée du Tour') {
  188. let upgradesDuration = parseInt(row.children[2].innerText);
  189. upgradesDuration++;
  190. row.children[2].innerText = upgradesDuration;
  191. updateDuration(row, upgradesDuration);
  192. costValue -= price;
  193. row.children[3].innerText = costValue;
  194. improvements.innerText = parseInt(improvements.innerText) - 1; // Augmente Nb Améliorations
  195. row.children[2].innerText = parseInt(improvements.innerText) - 1;
  196. } else if (characteristicName === 'Points de Vie Maximum') {
  197. currentValue -= 10;
  198. costValue -= price;
  199. row.children[1].innerText = currentValue;
  200. row.children[3].innerText = costValue;
  201. improvements.innerText = parseInt(improvements.innerText) -1; // Modifier cette ligne
  202. } else {
  203. currentValue = updateValueFunc(currentValue, -1); // Augmenter la valeur
  204. costValue -= price; // Mettre à jour le coût
  205. improvements.innerText = parseInt(improvements.innerText) + -1; // Mettre à jour Nb Améliorations
  206. row.children[1].innerText = currentValue; // Mettre à jour la colonne "Valeur Actuelle"
  207. row.children[3].innerText = costValue; // Mettre à jour la colonne "Coût Amélioration Suivante"
  208. }
  209. updateTotalCost();
  210. updateDisplayedValues();
  211. calculateLevel();
  212.  
  213. });
  214.  
  215. }
  216.  
  217.  
  218. // Fonction pour mettre à jour la colonne Nb Améliorations
  219. function updateImprovements(row, change) {
  220. let currentImprovements = parseInt(row.children[2].innerText);
  221. currentImprovements += change;
  222. row.children[2].innerText = currentImprovements;
  223. }
  224.  
  225. // Gestion durée du tour (marche mal)
  226. // Fonction pour mettre à jour la durée du tour en heures et minutes
  227. function updateDuration(row, upgrades) {
  228. let newDurationInMinutes = 30 - (upgrades * 3);
  229. let currentDurationText = row.children[1].innerText;
  230. let currentDurationParts = currentDurationText.split(' ');
  231. let currentHours = parseInt(currentDurationParts[0]);
  232. let currentMinutes = parseInt(currentDurationParts[3]);
  233. let currentDurationInMinutes = currentHours * 60 + currentMinutes;
  234. let updatedDuration = currentDurationInMinutes + newDurationInMinutes;
  235. let updatedHours = Math.floor(updatedDuration / 60);
  236. let remainingMinutes = updatedDuration % 60;
  237.  
  238. row.children[1].innerText = updatedHours + ' heures et ' + remainingMinutes + ' minutes';
  239. }
  240. // Fonction pour mettre à jour une valeur en fonction de l'incrément/decrement
  241. function updateValue(value, change) {
  242. return value + change;
  243. }
  244.  
  245.  
  246.  
  247. // Sélection des caractéristiques et initialisation des valeurs
  248. const characteristics = [
  249. document.querySelectorAll('tr.pair')[1], // Durée du tour
  250. document.querySelectorAll('tr.pair')[2], // PV max
  251. document.querySelectorAll('tr.pair')[3], // Perception
  252. document.querySelectorAll('tr.pair')[4], // Attaque
  253. document.querySelectorAll('tr.pair')[5], // Esquive
  254. document.querySelectorAll('tr.pair')[6], // Dégâts
  255. document.querySelectorAll('tr.pair')[7] // Régénération
  256.  
  257. ];
  258.  
  259.  
  260. // Ajout d'une Ligne Total
  261. // Sélection de la ligne "Dés de Régénération (+1D3)"
  262. const regenerationRow = document.querySelectorAll('tr.pair')[7]; // Modifier le sélecteur si nécessaire
  263. // Création de la ligne "Total"
  264. const totalRow = document.createElement('tr');
  265. // Colonne 1 (caractéristique)
  266. const totalCell1 = document.createElement('td');
  267. totalCell1.textContent = 'Total';
  268.  
  269. totalRow.appendChild(totalCell1);
  270. // Colonne 2 (total des valeurs actuelles)
  271. const totalCell2 = document.createElement('td');
  272. totalRow.appendChild(totalCell2);
  273. // Colonne 3 (vide pour laisser la colonne Nb Améliorations)
  274. const totalCell3 = document.createElement('td');
  275. totalRow.appendChild(totalCell3);
  276. // Colonne 4 (total des coûts)
  277. const totalCostValue = Array.from(document.querySelectorAll('tr.pair td:nth-child(4)'))
  278. .slice(1) // Ignorer la première ligne (en-tête)
  279. .reduce((acc, cell) => acc + parseInt(cell.innerText), 0);
  280. const totalCell4 = document.createElement('td');
  281. totalCell4.textContent = totalCostValue;
  282. totalCell4.title = "total cumulatif des PI dépensés. Basé sur prix 16 sauf regen 30 et spécilité 12";
  283. totalRow.appendChild(totalCell4);
  284. // Insérer la ligne "Total" après la ligne "Dés de Régénération (+1D3)"
  285. regenerationRow.parentNode.insertBefore(totalRow, regenerationRow.nextSibling);
  286.  
  287.  
  288.  
  289. //Gestion des Dons
  290. // Récupération des éléments pour chaque don
  291. const donsRows = [
  292. document.querySelector('tr.pair:nth-child(13)'),
  293. document.querySelector('tr.pair:nth-child(14)'),
  294. document.querySelector('tr.pair:nth-child(15)'),
  295. document.querySelector('tr.pair:nth-child(16)'),
  296. document.querySelector('tr.pair:nth-child(17)')
  297. ];
  298. // Tableau des coûts pour chaque don
  299. const donsCosts = [10, 20, 10, 10, 10];
  300. // Tableau des améliorations pour chaque don
  301. const donsImprovements = donsRows.map(row => row ? parseImprovements(row) - 1 : /* Valeur par défaut */ 0);
  302. // Tableau des coûts totaux pour chaque don
  303. const donsTotalCosts = donsCosts.map((cost, index) => {
  304. if (donsRows[index]) {
  305. return calculateTotalCost(cost, donsImprovements[index]);
  306. }
  307. // Si le don n'est pas trouvé, attribuer une valeur par défaut (par exemple, 0)
  308. return /* Valeur par défaut */ 100;
  309. });
  310. // Calcul du coût total de tous les dons
  311. const totalDonCostValue = donsTotalCosts.reduce((acc, curr) => acc + curr, 0);
  312. localStorage.setItem('totalDonCostValue', totalDonCostValue);
  313. // Création de la ligne "Total" pour les dons
  314. const totalDonRow = document.createElement('tr');
  315. totalDonRow.innerHTML = '<td>Total</td><td></td><td></td><td></td>';
  316. const totalDonCostCell = totalDonRow.querySelector('td:last-child');
  317. totalDonCostCell.textContent = totalDonCostValue;
  318. totalDonCostCell.title = "Il s'agit du total cumulatif dépensé, en tenant compte des dons qui n'apparaissent pas ici (ceux améliorés à fond)";
  319. // Insérer la ligne "Total" après la dernière ligne de dons
  320. const lastDonRow = document.querySelector('tr.pair:last-child');
  321. lastDonRow.parentNode.appendChild(totalDonRow);
  322. // Fonction pour extraire le coût d'un don à partir de sa ligne
  323. function parseDonCost(row) {
  324. if (row) {
  325. const costText = row.querySelector('td:nth-child(4)').innerText;
  326. return parseInt(costText);
  327. }
  328. return 0;
  329. }
  330. // Fonction pour extraire le nombre d'améliorations d'un don à partir de sa ligne
  331. function parseImprovements(row) {
  332. if (row) {
  333. const improvementsText = row.querySelector('td:nth-child(3)').innerText.split(' ')[0];
  334. return parseInt(improvementsText);
  335. }
  336. return 0;
  337. }
  338. // Fonction pour calculer le coût total d'un don en fonction de son coût de base et du nombre d'améliorations
  339. function calculateTotalCost(baseCost, improvements) {
  340. let totalCostDon = 0;
  341. for (let i = 1; i <= improvements; i++) {
  342. totalCostDon += baseCost * i;
  343. }
  344. return totalCostDon;
  345. }
  346.  
  347.  
  348. function getPriceForSpecialty(specialty, characteristic) {
  349. return specialtyPrices[specialty]?.[characteristic] || defaultPrices[characteristic];
  350.  
  351. }
  352.  
  353. function adjustPricesBasedOnSpecialty(specialty) {
  354. // Réinitialisation des prix par défaut
  355. defaultPrices = {
  356. 'Durée du Tour': 16,
  357. 'Points de Vie Maximum': 16,
  358. 'Perception': 16,
  359. 'Dés d\'Attaque': 16,
  360. 'Dés d\'Esquive': 16,
  361. 'Dés de Dégats': 16,
  362. 'Dés de Régénération': 30
  363. // Ajoutez d'autres caractéristiques avec leurs prix correspondants
  364. };
  365.  
  366. // Réinitialisation des prix spécifiques à la spécialité
  367. specialtyPrices = {
  368. 'Points de Vie': { 'Points de Vie Maximum': 12 },
  369. 'Perception': { 'Perception': 12 },
  370. 'Attaque': { 'Dés d\'Attaque': 12 },
  371. 'Esquive': { 'Dés d\'Esquive': 12 },
  372. 'Dégats': { 'Dés de Dégats': 12 },
  373. 'Régénération': { 'Dés de Régénération': 12 }
  374. };
  375.  
  376. // Mettre à jour les prix en fonction de la nouvelle spécialité
  377. Object.keys(defaultPrices).forEach(key => {
  378. const price = getPriceForSpecialty(specialty, key);
  379. defaultPrices[key] = price;
  380. console.log('const price', price);
  381. });
  382.  
  383. localStorage.setItem('specialiteJoueur', specialty);
  384. localStorage.setItem('prix par défaut', JSON.stringify(defaultPrices));
  385. localStorage.setItem('prix spécialité', JSON.stringify(specialtyPrices));
  386.  
  387. console.log('prix spécialité', specialtyPrices);
  388. console.log('prix par défaut', defaultPrices);
  389. console.log('Spécialité enregistrée', specialty);
  390.  
  391. updateTotalCost(); // Mettre à jour le coût total
  392. updateDisplayedValues(); // Mettre à jour les valeurs affichées
  393. calculateLevel(); // Mettre à jour le niveau
  394.  
  395. }
  396.  
  397.  
  398.  
  399.  
  400. let specialiteJoueur = localStorage.getItem('specialiteJoueur');
  401. if (specialiteJoueur) {
  402. adjustPricesBasedOnSpecialty(specialiteJoueur);
  403. console.log('Spécialité enregistrée :', specialiteJoueur);
  404. } else {
  405. console.log('Aucune spécialité enregistrée.');
  406. alert('Sélectionnez une spécialité pour faire des projections sur votre gobelin!');
  407.  
  408. }
  409. console.log('Spécialité enregistrée :', specialiteJoueur);
  410. const targetElement = document.querySelector('.gfmm > table:nth-child(1) > tbody:nth-child(1) > tr:nth-child(2) > td:nth-child(1)');
  411. console.log("Élément cible trouvé :", targetElement);
  412.  
  413. const specialtySelect = document.createElement('select');
  414. specialtySelect.id = 'specialtySelect';
  415. specialtySelect.title = 'Bienvenue sur AnaGlobiliseur. Choisir votre spécialité pour calculer (a peu pres) les PI nécessaires et le niveau projeté en fonction des caractéristiques que vous voulez monter'
  416.  
  417. const defaultOption = document.createElement('option');
  418. defaultOption.value = '';
  419.  
  420. specialtySelect.appendChild(defaultOption);
  421.  
  422. const specialties = ['Points de Vie', 'Attaque', 'Esquive', 'Dégats', 'Régénération', 'Perception'];
  423. specialties.forEach(specialty => {
  424. const option = document.createElement('option');
  425. option.value = specialty;
  426. option.textContent = specialty;
  427. specialtySelect.appendChild(option);
  428. });
  429. if (specialiteJoueur) {
  430. specialtySelect.value = specialiteJoueur;
  431. }
  432. specialtySelect.addEventListener('change', () => {
  433. specialiteJoueur = specialtySelect.value;
  434. adjustPricesBasedOnSpecialty(specialiteJoueur);
  435. localStorage.setItem('specialiteJoueur', specialiteJoueur); // Mise à jour dans le stockage local
  436. location.reload();
  437. location.reload();
  438. });
  439.  
  440. targetElement.appendChild(specialtySelect);
  441. console.log("Liste déroulante insérée dans l'élément cible.");
  442.  
  443.  
  444.  
  445. characteristics.forEach(row => {
  446. const currentValue = parseInt(row.children[1].innerText);
  447. const improvements = row.children[2];
  448. const costValue = parseInt(row.children[3].innerText);
  449. const characteristicName = row.children[0].innerText.match(/(.*) \(.*/)[1];
  450. const price = getPriceForSpecialty(localStorage.getItem('specialiteJoueur'), characteristicName);
  451. createButtons(row, currentValue, costValue, price, updateValue, improvements);
  452. });
  453.  
  454.  
  455.  
  456. function updateTotalCost() {
  457. const specialiteJoueur = localStorage.getItem('specialiteJoueur'); // Récupérer la spécialité choisie depuis le localStorage
  458. const totalCost = characteristics.reduce((acc, row) => {
  459. const characteristicName = row.children[0].innerText.split('(')[0].trim(); // Récupération du nom sans les parenthèses
  460. const improvements = parseInt(row.children[2].innerText); // Nombre d'améliorations
  461. const price = getPriceForSpecialty(specialiteJoueur, characteristicName); // Utilisation de la fonction pour récupérer le prix
  462.  
  463. let cumulativeCost = 0;
  464. for (let i = 1; i <= improvements; i++) {
  465. cumulativeCost += price * i;
  466. }
  467.  
  468.  
  469. // Affichage du détail pour chaque ligne dans la console
  470. console.log(`Ligne: ${characteristicName} - Prix unitaire: ${price} - Améliorations: ${improvements} - Coût total: ${cumulativeCost}`);
  471.  
  472. return acc + cumulativeCost;
  473. }, 0);
  474.  
  475. console.log('Total:', totalCost); // Affichage du total dans la console
  476.  
  477. // Enregistrement du total dans le localStorage
  478. localStorage.setItem('totalCost', totalCost);
  479.  
  480. // Mise à jour de l'affichage du total dans l'interface HTML
  481. const totalCell = document.querySelector('.gfmm > table:nth-child(1) > tbody:nth-child(1) > tr:nth-child(11) > td:nth-child(4)');
  482. totalCell.textContent = totalCost;
  483. }
  484.  
  485.  
  486.  
  487.  
  488. /// Pour calculer le niveau en fonction du total de PI
  489. function calculateLevel() {
  490. const nbPIActuels = window.localStorage.getItem('nbPIActuelsValue');
  491. const levels = [
  492.  
  493. { requiredPI: 0, level: 1 },
  494. { requiredPI: 10, level: 2 },
  495. { requiredPI: 30, level: 3 },
  496. { requiredPI: 60, level: 4 },
  497. { requiredPI: 100, level: 5 },
  498. { requiredPI: 150, level: 6 },
  499. { requiredPI: 210, level: 7 },
  500. { requiredPI: 280, level: 8 },
  501. { requiredPI: 360, level: 9 },
  502. { requiredPI: 450, level: 10 },
  503. { requiredPI: 550, level: 11 },
  504. { requiredPI: 660, level: 12 },
  505. { requiredPI: 780, level: 13 },
  506. { requiredPI: 910, level: 14 },
  507. { requiredPI: 1050, level: 15 },
  508. { requiredPI: 1200, level: 16 },
  509. { requiredPI: 1360, level: 17 },
  510. { requiredPI: 1530, level: 18 },
  511. { requiredPI: 1710, level: 19 },
  512. { requiredPI: 1900, level: 20 },
  513. { requiredPI: 2100, level: 21 },
  514. { requiredPI: 2310, level: 22 },
  515. { requiredPI: 2530, level: 23 },
  516. { requiredPI: 2760, level: 24 },
  517. { requiredPI: 3000, level: 25 },
  518. { requiredPI: 3250, level: 26 },
  519. { requiredPI: 3510, level: 27 },
  520. { requiredPI: 3780, level: 28 },
  521. { requiredPI: 4060, level: 29 },
  522. { requiredPI: 4350, level: 30 },
  523. { requiredPI: 4650, level: 31 },
  524. { requiredPI: 4960, level: 32 },
  525. { requiredPI: 5280, level: 33 },
  526. { requiredPI: 5610, level: 34 },
  527. { requiredPI: 5950, level: 35 },
  528. { requiredPI: 6300, level: 36 },
  529. { requiredPI: 6660, level: 37 },
  530. { requiredPI: 7030, level: 38 },
  531. { requiredPI: 7410, level: 39 },
  532. { requiredPI: 7800, level: 40 },
  533. { requiredPI: 8200, level: 41 },
  534. { requiredPI: 8610, level: 42 },
  535. { requiredPI: 9030, level: 43 },
  536. { requiredPI: 9460, level: 44 },
  537. { requiredPI: 9900, level: 45 },
  538. { requiredPI: 10350, level: 46 },
  539. { requiredPI: 10810, level: 47 },
  540. { requiredPI: 11280, level: 48 },
  541. { requiredPI: 11760, level: 49 },
  542. { requiredPI: 12250, level: 50 },
  543. { requiredPI: 12750, level: 51 },
  544. { requiredPI: 13260, level: 52 },
  545. { requiredPI: 13780, level: 53 },
  546. { requiredPI: 14310, level: 54 },
  547. { requiredPI: 14850, level: 55 },
  548. { requiredPI: 15400, level: 56 },
  549. { requiredPI: 15960, level: 57 },
  550. { requiredPI: 16530, level: 58 },
  551. { requiredPI: 17110, level: 59 },
  552. { requiredPI: 17700, level: 60 },
  553. { requiredPI: 18300, level: 61 },
  554. { requiredPI: 18910, level: 62 },
  555. { requiredPI: 19530, level: 63 },
  556. { requiredPI: 20170, level: 64 },
  557. { requiredPI: 20820, level: 65 },
  558. { requiredPI: 21480, level: 66 },
  559. { requiredPI: 22150, level: 67 },
  560. { requiredPI: 22830, level: 68 },
  561. { requiredPI: 23520, level: 69 },
  562. { requiredPI: 24220, level: 70 },
  563. { requiredPI: 24930, level: 71 },
  564. { requiredPI: 25650, level: 72 },
  565. { requiredPI: 26380, level: 73 },
  566. { requiredPI: 27120, level: 74 },
  567. { requiredPI: 27870, level: 75 },
  568. { requiredPI: 28630, level: 76 },
  569. { requiredPI: 29400, level: 77 },
  570. { requiredPI: 30180, level: 78 },
  571. { requiredPI: 30970, level: 79 },
  572. { requiredPI: 31770, level: 80 },
  573. { requiredPI: 32580, level: 81 },
  574. { requiredPI: 33400, level: 82 },
  575. { requiredPI: 34230, level: 83 },
  576. { requiredPI: 35070, level: 84 },
  577. { requiredPI: 35920, level: 85 },
  578. { requiredPI: 36780, level: 86 },
  579. { requiredPI: 37650, level: 87 },
  580. { requiredPI: 38530, level: 88 },
  581. { requiredPI: 39420, level: 89 },
  582. { requiredPI: 40320, level: 90 },
  583. { requiredPI: 41230, level: 91 },
  584. { requiredPI: 42150, level: 92 },
  585. { requiredPI: 43080, level: 93 },
  586. { requiredPI: 44020, level: 94 },
  587. { requiredPI: 44970, level: 95 },
  588. { requiredPI: 45930, level: 96 },
  589. { requiredPI: 46900, level: 97 },
  590. { requiredPI: 47880, level: 98 },
  591. { requiredPI: 48870, level: 99 },
  592. { requiredPI: 49870, level: 100 }
  593. ];
  594.  
  595. let currentLevel = 1;
  596. for (const { requiredPI, level } of levels) {
  597. if (nbPIActuels >= requiredPI) {
  598. currentLevel = level;
  599. } else {
  600. break;
  601. }
  602. }
  603. console.log('niveau', currentLevel);
  604. return currentLevel;
  605.  
  606. }
  607.  
  608.  
  609. const PX = window.localStorage.getItem('PX');
  610. const PXPerso = window.localStorage.getItem('PXPerso');
  611. const PI = window.localStorage.getItem('PI');
  612. console.log('PX', PX);
  613. const totalCost = window.localStorage.getItem('totalCost');
  614. const nbPIActuels = window.localStorage.getItem('nbPIActuels');
  615. const PIapprentissagesText = `PI investis dans les apprentissages :`;
  616. const PIapprentissagesValue = nbPIActuels - totalDonCostValue - totalCost - PI - PXPerso;
  617. localStorage.setItem('PIapprentissagesText', PIapprentissagesText);
  618. localStorage.setItem('PIapprentissagesValue', PIapprentissagesValue);
  619.  
  620. function updateDisplayedValues() {
  621. // Récupérer les valeurs du local storage
  622. const niveau = window.localStorage.getItem('niveau');
  623. const PX = window.localStorage.getItem('PX');
  624. const PXperso = window.localStorage.getItem('PXperso');
  625. const PI = window.localStorage.getItem('PI');
  626. const totalCost = window.localStorage.getItem('totalCost');
  627. const PIapprentissagesText = window.localStorage.getItem('PIapprentissagesText');
  628. const PIapprentissagesValue = window.localStorage.getItem('PIapprentissagesValue');
  629.  
  630. // Trouver l'élément contenant le texte "Vous pouvez vous améliorer à concurrence de ...."
  631. const targetElement = document.querySelector('tr.pair:nth-child(1) > td:nth-child(1)');
  632. // Créer des éléments pour afficher les valeurs mises à jour
  633. const niveauText = `Niveau actuel : ${niveau}`;
  634. const nbPIActuelsText = `Total PI simulés :`;
  635. const nbActualText = `Vous avez actuellement :`;
  636. const nbPIActuels = window.localStorage.getItem('nbPIActuels');
  637. const nbPIActuelsValue = Math.floor(+totalCost + +totalDonCostValue + +PIapprentissagesValue + +PI);
  638. localStorage.setItem('nbPIActuelsValue', nbPIActuelsValue);
  639. // Calculer le niveau en fonction de nbPIActuels
  640. const currentLevel = calculateLevel(parseInt(nbPIActuelsValue));
  641. const currentLevelText = `Niveau atteint : ${currentLevel}`;
  642. const PICompText = 'PI investis dans les caractéristiques : '
  643. const PICompValue = totalCost;
  644.  
  645.  
  646. // Pour calculer le nombre de PX par jour depuis la création
  647. const diffpx = nbPIActuelsValue - nbPIActuels;
  648. console.log(diffpx);
  649. let dateCreationGobelin = localStorage.getItem('DateCrea');
  650. let dateCrea = new Date(dateCreationGobelin);
  651. let dateActuelle = new Date();
  652. let differenceEnMs = dateActuelle - dateCrea;
  653. let differenceEnJours = Math.floor(differenceEnMs / (1000 * 60 * 60 * 24));
  654. if (!localStorage.getItem('xpParJourfiged')) {
  655. // Calcul de xpParJourfiged
  656. const xpParJour = nbPIActuelsValue !== 0 ? nbPIActuelsValue / differenceEnJours : 0;
  657. const xpParJourArrondi = xpParJour.toFixed(2);
  658. localStorage.setItem('xpParJourfiged', xpParJourArrondi);
  659. }
  660.  
  661.  
  662. const xpParJourfiged = localStorage.getItem('xpParJourfiged');
  663. const nbdejourneeded = diffpx/xpParJourfiged;
  664. const nbdejourneededArrondi = nbdejourneeded.toFixed(2);
  665. const daytoyear = nbdejourneededArrondi/365;
  666. const daytoyearround = daytoyear.toFixed(1);
  667.  
  668. const newContent = `
  669. <div>${nbActualText + "<strong>" + nbPIActuels + " PI" + "</strong>"}</div>
  670. <div>${PIapprentissagesText + "<strong>" + +PIapprentissagesValue + "</strong>"}</div>
  671. <div>${PICompText + "<strong>" + PICompValue + "</strong>"}</div>
  672. <div>${niveauText}</div>
  673. <div>${nbPIActuelsText + "<strong>" + nbPIActuelsValue + "</strong>"}</div>
  674. <div>${currentLevelText}</div>
  675. <div>${"<strong>" + differenceEnJours + "</strong>" + " jours sont passés depuis votre naissance, vous avez gagné " + "<strong>" + xpParJourfiged + " px/jour" + "</strong>"}</div>
  676. <div>${"Pour atteindre les valeurs simulées au rythme actuel il vous faudra " + "<strong>" + nbdejourneededArrondi + " jours" + "</strong>" + " (" + "<strong>" + daytoyearround + " années" + "</strong>" + ")"}</div>
  677. `;
  678.  
  679.  
  680. // Création d'un nouvel élément div pour contenir le nouveau contenu
  681. const newElement = document.createElement('div');
  682. newElement.innerHTML = newContent;
  683. // Remplacement du contenu existant par le contenu nouvellement créé
  684. targetElement.innerHTML = ''; // Vide d'abord le contenu existant
  685. targetElement.appendChild(newElement);
  686. }
  687.  
  688. updateDisplayedValues();
  689. calculateLevel();
  690. }
  691.  
  692.  
  693.  
  694. //==============================================================================
  695. /// calculateur des DLA (page mon profil et menu.php)
  696. //==============================================================================
  697.  
  698. /// récup des variable dans mon profil
  699. if (window.location.href === 'http://games.gobland.fr/ProfilPerso.php') {
  700.  
  701. // Fonction pour actualiser les variables et rafraîchir la page
  702.  
  703.  
  704.  
  705. // Récupération de l'élément contenant les dates
  706. const dateContainer = document.querySelector('#content div#identite table.gf tbody tr:nth-child(2) td:nth-child(2)');
  707.  
  708. // Vérification si l'élément est récupéré
  709. if (dateContainer) {
  710. // Récupération de tous les éléments <span> dans dateContainer
  711. const spans = dateContainer.querySelectorAll('span.dla');
  712.  
  713. // Vérification si les éléments <span> sont trouvés
  714. if (spans.length >= 3) {
  715. const DLA1 = spans[0].nextSibling.textContent.trim();
  716. const DLA2 = spans[1].nextSibling.textContent.trim();
  717. const DLA3 = spans[2].nextSibling.textContent.trim();
  718.  
  719.  
  720. // Stockage dans le local storage
  721. localStorage.setItem('DLA1', DLA1);
  722. localStorage.setItem('DLA2', DLA2);
  723. localStorage.setItem('DLA3', DLA3);
  724.  
  725. } else {
  726. console.error('Erreur récup DLAs . Pas assez de balises <span> trouvées.');
  727. }
  728.  
  729.  
  730.  
  731.  
  732. // Recherche de l'élément XPath spécifique
  733. const xpath = '/html/body/div[3]/div/table/tbody/tr[2]/td[2]/table/tbody/tr[2]/td/br[3]';
  734. const xpathResult = document.evaluate(xpath, document, null, XPathResult.ANY_TYPE, null);
  735.  
  736. // Récupération du nœud correspondant à l'élément XPath
  737. const node = xpathResult.iterateNext();
  738.  
  739. if (node) {
  740. // Récupération du texte suivant l'élément XPath
  741. const valeurPAText = node.nextSibling.textContent;
  742.  
  743. // Expression régulière pour extraire le nombre
  744. const regex = /(\d+)/;
  745. const match = valeurPAText.match(regex);
  746.  
  747. if (match && match[1]) {
  748. valeurPA = parseInt(match[1], 10);
  749. console.log('Valeur de PA:', valeurPA);
  750. localStorage.setItem('valeurPA', valeurPA);
  751. } else {
  752. console.error('Aucune correspondance trouvée pour la valeur de PA.');
  753. }
  754. } else {
  755. console.error('Élément XPath pour la valeur de PA non trouvé.');
  756. }
  757. }
  758. else {
  759. console.error('Conteneur de dates non trouvé.');
  760. }
  761.  
  762.  
  763.  
  764. // Récupération de l'heure actuelle de Paris
  765. const now = new Date();
  766. console.log('now', now);
  767.  
  768. const options = { timeZone: 'Europe/Paris', hour24: false };
  769. const currentDateTime = now.toLocaleString('fr-FR', options);
  770.  
  771. // Conversion des dates en objets Date
  772. const DLA1 = localStorage.getItem('DLA1');
  773. const DLA2 = localStorage.getItem('DLA2');
  774. const DLA3 = localStorage.getItem('DLA3');
  775. const dateDLA1 = new Date(DLA1);
  776. const dateDLA2 = new Date(DLA2);
  777. const dateDLA3 = new Date(DLA3);
  778. localStorage.setItem('dateDLA1', dateDLA1);
  779. localStorage.setItem('dateDLA2', dateDLA2);
  780. localStorage.setItem('dateDLA3', dateDLA3);
  781. console.log('Date pour DLA1:', dateDLA1);
  782. console.log('Date pour DLA2:', dateDLA2);
  783. console.log('Date pour DLA3:', dateDLA3);
  784.  
  785. // Calcul de la différence en millisecondes
  786. const diffDLA1 = dateDLA1 - now;
  787. const diffDLA2 = dateDLA2 - now;
  788. const diffDLA3 = dateDLA3 - now;
  789. localStorage.setItem('diffDLA1', diffDLA1);
  790. localStorage.setItem('diffDLA2', diffDLA2);
  791. localStorage.setItem('diffDLA3', diffDLA3);
  792.  
  793. // Calcul de la différence en minutes
  794. const diffMinutesDLA1 = Math.round(Math.abs(diffDLA1 / (1000 * 60)));
  795. const diffMinutesDLA2 = Math.round(Math.abs(diffDLA2 / (1000 * 60)));
  796. const diffMinutesDLA3 = Math.round(Math.abs(diffDLA3 / (1000 * 60)));
  797. localStorage.setItem('diffMinutesDLA1', diffMinutesDLA1);
  798. localStorage.setItem('diffMinutesDLA2', diffMinutesDLA2);
  799. localStorage.setItem('diffMinutesDLA3', diffMinutesDLA3);
  800. console.log('Différence DLA1 en minutes:', diffMinutesDLA1, 'minutes');
  801. console.log('Différence DLA2 en minutes:', diffMinutesDLA2, 'minutes');
  802. console.log('Différence DLA3 en minutes:', diffMinutesDLA3, 'minutes');
  803.  
  804.  
  805. // Enregistrement de l'heure de réactualisation des variables dans le localStorage
  806. const lastRefreshTime = new Date().toLocaleString('fr-FR', { timeZone: 'Europe/Paris' });
  807. localStorage.setItem('lastRefreshTime', lastRefreshTime);
  808.  
  809. }
  810.  
  811.  
  812.  
  813.  
  814.  
  815. /// affichage des variables dans le menu left (j'ai galéré on doit pvr faire mieux^^)
  816. if ($(location).attr('href').match(/http:\/\/(.*\.)?gobland\.fr\/Menu\.php/i)) {
  817.  
  818. // Récupération de l'élément ciblé
  819. const DLA1 = localStorage.getItem('DLA1');
  820. const DLA2 = localStorage.getItem('DLA2');
  821. const DLA3 = localStorage.getItem('DLA3');
  822. const diffMinutesDLA1 = localStorage.getItem('diffMinutesDLA1');
  823. const diffMinutesDLA2 = localStorage.getItem('diffMinutesDLA2');
  824. const diffMinutesDLA3 = localStorage.getItem('diffMinutesDLA3');
  825. const dateDLA1 = new Date(localStorage.getItem('dateDLA1'));
  826. const dateDLA2 = new Date(localStorage.getItem('dateDLA2'));
  827. const dateDLA3 = new Date(localStorage.getItem('dateDLA3'));
  828. const valeurPA = localStorage.getItem('valeurPA');
  829. const now = new Date();
  830. const targetElement = document.getElementById('dim');
  831. let textToInsert = '';
  832.  
  833.  
  834.  
  835.  
  836.  
  837. // Obtenez le jour de la semaine (0 pour dimanche, 1 pour lundi, ... , 6 pour samedi)
  838. const dayOfWeek = now.getDay();
  839.  
  840. // Vérifiez si c'est le week-end (samedi ou dimanche)
  841. const isWeekend = dayOfWeek === 0 || dayOfWeek === 6;
  842.  
  843. // Conditions pour déterminer le texte à insérer
  844. //speedXekk end
  845. if (isWeekend) {
  846. if (now > dateDLA3) {
  847. textToInsert = `<span style="color: red" title="Décalez de ${diffMinutesDLA3} minutes pour ne pas perdre votre trimul">Trimul dépassé!</span>`;
  848. } else if (now > dateDLA2) {
  849. textToInsert = `<span style="color: blue" title="Trimul dans ${diffMinutesDLA3} minutes">Cumul jouable</span>`;
  850. } else if (now > dateDLA1) {
  851. if (valeurPA === '0') {
  852. textToInsert = `<span style="color: green" title="Vous pouvez activer. Cumul dans ${diffMinutesDLA2} minutes">DLA dépassée</span>`;
  853. } else {
  854. textToInsert = `<span style="color: red" title="Décalez de ${diffMinutesDLA1} minutes pour ne pas perdre vos ${valeurPA} PA">DLA dépassée</span>`;
  855. }
  856. } else if (now < dateDLA1) {
  857. textToInsert = `<span style="color: green" title="Il vous reste ${valeurPA} PA">DLA dans ${diffMinutesDLA1} minutes</span>`;
  858. }
  859. }
  860.  
  861. //pas speed week end
  862. if (!isWeekend) {
  863. if (now > dateDLA3) {
  864. textToInsert = `<span style="color: red" title="Décalez de ${diffMinutesDLA3} minutes pour ne pas perdre de DLA">DLA dépassée</span>`;
  865. } else if (now > dateDLA2) {
  866. textToInsert = `<span style="color: red" title="Décalez de ${diffMinutesDLA2} minutes pour jouer un cumul">DLA dépassée</span>`;
  867. } else if (now > dateDLA1) {
  868. if (valeurPA === '0') {
  869. textToInsert = `<span style="color: green" title="Vous pouvez activer. Cumul dans ${diffMinutesDLA2} minutes">DLA dépassée</span>`;
  870. } else {
  871. textToInsert = `<span style="color: red" title="Décalez de ${diffMinutesDLA1} minutes pour ne pas perdre vos ${valeurPA} PA">DLA dépassée</span>`;
  872. }
  873. } else if (now < dateDLA1) {
  874. textToInsert = `<span style="color: green" title="Il vous reste ${valeurPA} PA">DLA dans ${diffMinutesDLA1} minutes</span>`;
  875. }
  876. }
  877.  
  878. targetElement.insertAdjacentHTML('afterend', `<br>${textToInsert}`);
  879.  
  880.  
  881. // Ajout du texte sur la date du dernier resfresh
  882. // Récupération de l'élément ciblé
  883. const targetElement2 = document.querySelector('.dla > span:nth-child(7)');
  884.  
  885. if (targetElement) {
  886. const lastRefreshTime = localStorage.getItem('lastRefreshTime');
  887.  
  888. if (lastRefreshTime) {
  889. const smallText = document.createElement('small');
  890. smallText.textContent = `(${lastRefreshTime})`;
  891. smallText.style.fontSize = 'smaller'; // Réduit la taille de la police
  892. smallText.title = 'Date du dernier refresh. Pour rafraichir le calcul, allez sur votre page profil et actualisez la page'
  893. targetElement2.appendChild(document.createElement('br')); // Saut de ligne
  894. targetElement2.appendChild(smallText); // Ajout du texte entre parenthèses après le 7e span
  895. }
  896. }
  897.  
  898. }
  899.  
  900.  
  901.  
  902. //==========================================================================================================================================================================================================================
  903. ///affichage de l'icone Gobzilla avec version au survol dans le menu left
  904. //==========================================================================================================================================================================================================================
  905. (function() {
  906. 'use strict';
  907.  
  908.  
  909. var iconUrl = 'https://i.ibb.co/s1MG4Dt/g-OBZILLAICON-removebg.png';
  910. var scriptVersion = GM_info.script.version;
  911. // URL de redirection au clic sur l'icône
  912. var redirectionUrl = 'http://games.gobland.fr/goodies.php';
  913.  
  914.  
  915. var icon = document.createElement('img');
  916. icon.src = iconUrl;
  917. icon.style.position = 'absolute';
  918. icon.style.top = '-145px'; //
  919. icon.style.left = '80px';
  920. icon.style.zIndex = '9999';
  921. icon.style.width = '80px';
  922. icon.style.height = '50px';
  923. icon.style.opacity = '0.7';
  924. icon.title = 'Version du script: ' + scriptVersion;
  925.  
  926.  
  927. // Ajout du gestionnaire d'événements pour le clic sur l'icône
  928. icon.addEventListener('click', function() {
  929. window.open(redirectionUrl, '_blank', 'width=500,height=500'); // Ouvre l'URL dans une nouvelle fenêtre flottante
  930. });
  931.  
  932. // Sélectionnez l'endroit où vous souhaitez ajouter l'icône
  933. var targetElement = document.querySelector('.presentation'); // Remplacez par la classe ou l'ID de l'élément où vous voulez ajouter l'icône
  934.  
  935. // Ajoutez l'icône à l'emplacement sélectionné
  936. if (targetElement) {
  937. targetElement.appendChild(icon);
  938. }
  939. })();
  940.  
  941. //==========================================================================================================================================================================================================================
  942. // Page suivants - Ajout de la vue sur la page "ordre", ajout de boutons de racourcis vers des ordres et mise en couleur de la position sur le profil
  943. //==========================================================================================================================================================================================================================
  944.  
  945. // Vérification si la variable a déjà été définie
  946. if (!window.localStorage.getItem('followersnumbers')) {
  947. // Sélection de l'élément contenant les informations des Suivants
  948. let followersTable = document.querySelector('td[style="text-align:left;vertical-align:top;"] table');
  949.  
  950. // Vérification si l'élément existe
  951. if (followersTable) {
  952. let followersnumbers = []; // Tableau pour stocker les numéros
  953. let followersnames = []; // Tableau pour stocker les textes restants
  954.  
  955. // Récupération de tous les éléments <a> dans la table
  956. let followerLinks = followersTable.querySelectorAll('a');
  957.  
  958. // Parcours des liens pour extraire les informations
  959. followerLinks.forEach(link => {
  960. let text = link.textContent; // Récupération du texte du lien
  961.  
  962. // Vérification du motif "[numéro] texte restant"
  963. let regex = /\[(\d+)\]\s(.+)/;
  964. let match = text.match(regex);
  965.  
  966. if (match) {
  967. let numero = match[1]; // Numéro entre crochet
  968. let resteTexte = match[2]; // Texte restant
  969.  
  970. // Stockage dans les tableaux
  971. followersnumbers.push(numero);
  972. followersnames.push(resteTexte);
  973. }
  974. });
  975.  
  976. // Enregistrement dans le stockage local
  977. localStorage.setItem('followersnumbers', JSON.stringify(followersnumbers));
  978. localStorage.setItem('followersnames', JSON.stringify(followersnames));
  979. }
  980. }
  981.  
  982.  
  983.  
  984.  
  985. //mise en couleur de la position de la CM dans Profil
  986. if ($(location).attr('href').match(/http:\/\/(.*\.)?gobland\.fr\/Follower\.php\?IdFO=\d+/i)) {
  987. (function() {
  988. // Sélectionne tous les éléments 'td' contenant le texte des positions
  989. const positionElements = document.querySelectorAll('td[style="text-align:left;"]');
  990.  
  991. // Parcours des éléments pour trouver celui contenant les informations de position
  992. positionElements.forEach((element) => {
  993. const text = element.textContent.trim();
  994. if (text.startsWith('X =') && text.includes('Y =') && text.includes('N =')) {
  995. const positionInfo = text.match(/X = (-?\d+) \| Y = (-?\d+) \| N = (-?\d+)/);
  996. if (positionInfo && positionInfo.length === 4) {
  997. const posX = positionInfo[1];
  998. const posY = positionInfo[2];
  999. const posN = positionInfo[3];
  1000.  
  1001. // Créer des éléments <strong> pour mettre en gras le texte et le colorer en rouge
  1002. const posXElement = document.createElement('strong');
  1003. posXElement.textContent = `X = ${posX}`;
  1004. posXElement.style.color = 'red'; // Changer la couleur en rouge
  1005.  
  1006. const posYElement = document.createElement('strong');
  1007. posYElement.textContent = `Y = ${posY}`;
  1008. posYElement.style.color = 'red'; // Changer la couleur en rouge
  1009.  
  1010. const posNElement = document.createElement('strong');
  1011. posNElement.textContent = `N = ${posN} `;
  1012. posNElement.style.color = 'red'; // Changer la couleur en rouge
  1013.  
  1014. // Créer un élément pour le reste du texte
  1015. const restOfText = document.createElement('span');
  1016. restOfText.textContent = text.slice(text.indexOf('Perception'));
  1017.  
  1018. // Remplacer le contenu de l'élément avec les éléments <strong> colorés et le reste du texte
  1019. element.innerHTML = '';
  1020. element.appendChild(posXElement);
  1021. element.appendChild(document.createTextNode(' | '));
  1022. element.appendChild(posYElement);
  1023. element.appendChild(document.createTextNode(' | '));
  1024. element.appendChild(posNElement);
  1025. element.appendChild(document.createElement('br'));
  1026. element.appendChild(restOfText);
  1027. }
  1028. }
  1029. });
  1030. })();
  1031. }
  1032.  
  1033.  
  1034. if ($(location).attr('href').match(/http:\/\/(.*\.)?gobland\.fr\/fo_equipement\.php\?IdFO=\d+/i)) {
  1035. // Sélection de l'élément spécifié dans la page
  1036. var elements = document.querySelectorAll('html body div#content div#identite table.gf tbody tr td.gfmm table tbody tr td.left table tbody tr.pair td');
  1037.  
  1038. // Vérification si des éléments sont trouvés
  1039. if (elements.length > 0) {
  1040. // Création d'un tableau pour stocker les contenus des éléments
  1041. var contents = [];
  1042.  
  1043. // Boucle à travers les éléments trouvés pour récupérer leur contenu
  1044. elements.forEach(function(element) {
  1045. var content = element.textContent.trim();
  1046. contents.push(content);
  1047. });
  1048.  
  1049. // Stockage des contenus dans le stockage local
  1050. localStorage.setItem('contenus_elements', JSON.stringify(contents));
  1051.  
  1052. // Affichage des contenus dans la console (pour vérification)
  1053. console.log('Contenus des éléments :', contents);
  1054. } else {
  1055. console.log('Aucun élément correspondant trouvé.');
  1056. }
  1057. }
  1058.  
  1059.  
  1060.  
  1061. // ajout de la vue (trèsors) direct dans la page Ordre, si on clique sur une ID ça ajoute l'odre, ya aussi des boutons de raccourcis
  1062. if ($(location).attr('href').match(/http:\/\/(.*\.)?gobland\.fr\/fo_orders\.php\?IdFO=\d+/i)) {
  1063. window.addEventListener('load', function() {
  1064.  
  1065. // Récupération des données de trésors depuis localStorage
  1066. const tresorsData = localStorage.getItem('tresorsData');
  1067.  
  1068. if (!tresorsData) {
  1069. const errorMessage = document.createElement('div');
  1070. errorMessage.textContent = 'Aucune donnée, allez sur votre page de vue avant';
  1071. errorMessage.style.color = 'red'; // Style facultatif pour le texte
  1072.  
  1073. // Insérer le message d'erreur dans le corps de la page ou un élément spécifique
  1074. document.body.appendChild(errorMessage);
  1075. } else {
  1076. const tresors = JSON.parse(tresorsData);
  1077.  
  1078. // Création d'un élément de tableau
  1079. const nouveauTableau = document.createElement('table');
  1080. nouveauTableau.style.border = '1px solid black'; // Style du tableau
  1081.  
  1082. // Création de l'en-tête du tableau
  1083. const enTete = nouveauTableau.createTHead();
  1084. const enTeteLigne = enTete.insertRow();
  1085. ['Distance', 'Réf.', 'Nom', 'X', 'Y', 'N'].forEach((enteteColonne) => {
  1086. const cellule = enTeteLigne.insertCell();
  1087. cellule.textContent = enteteColonne;
  1088. cellule.style.fontWeight = 'bold'; // Style pour l'en-tête
  1089. cellule.style.border = '1px solid black'; // Style des cellules
  1090. });
  1091.  
  1092. // Ajout des données de trésors dans le tableau
  1093. const corps = nouveauTableau.createTBody();
  1094. tresors.forEach((tresor) => {
  1095. const ligne = corps.insertRow();
  1096. ['distance', 'reference', 'nom', 'x', 'y', 'n'].forEach((colonne, index) => {
  1097. const cellule = ligne.insertCell();
  1098.  
  1099.  
  1100.  
  1101. cellule.textContent = tresor[colonne];
  1102. cellule.style.border = '1px solid black'; // Style des cellules
  1103. });
  1104. });
  1105.  
  1106. // Trouver l'élément spécifique où insérer le tableau des trésors
  1107. const elementSpecifique = document.evaluate('/html/body/div[3]/div/table/tbody/tr[2]/td[2]/form/table/tbody/tr[6]', document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
  1108.  
  1109. if (elementSpecifique) {
  1110. // Insérer le tableau des trésors après l'élément spécifique
  1111. elementSpecifique.insertAdjacentElement('afterend', nouveauTableau);
  1112. console.log('Tableau inséré avec succès');
  1113. } else {
  1114. console.log('Élément spécifique non trouvé');
  1115. }
  1116. }
  1117.  
  1118. });
  1119.  
  1120.  
  1121.  
  1122.  
  1123.  
  1124. window.addEventListener('load', function() {
  1125. const tresorsData = localStorage.getItem('tresorsData');
  1126.  
  1127. if (tresorsData) {
  1128. const tresors = JSON.parse(tresorsData);
  1129. const selectedNumbers = [];
  1130. const positions = [];
  1131. let moveCommand = '';
  1132. let pickCommand = '';
  1133.  
  1134. // Créer un élément pour le message contextuel
  1135. const tooltip = document.createElement('div');
  1136. tooltip.style.position = 'absolute';
  1137. tooltip.style.backgroundColor = '#f7f12e';
  1138. tooltip.style.border = '1px solid #d3d3d3';
  1139. tooltip.style.padding = '5px';
  1140. tooltip.style.borderRadius = '5px';
  1141. tooltip.style.boxShadow = '0px 0px 10px rgba(0,0,0,0.2)';
  1142. tooltip.style.display = 'none'; // Masquer par défaut
  1143. tooltip.textContent = 'Ordre ajouté';
  1144. document.body.appendChild(tooltip);
  1145.  
  1146. // Créer un tableau pour suivre les cellules cliquées
  1147. const clickedRefCells = new Set(); // Pour les cellules de la colonne Réf.
  1148. const clickedPosCells = new Set(); // Pour les cellules de position
  1149.  
  1150. // Gérer les cellules de la colonne "Réf."
  1151. const references = [];
  1152. const xpathRef = '/html/body/div[3]/div/table/tbody/tr[2]/td[2]/form/table/tbody/table/tbody/tr/td[2]';
  1153. const refElements = document.evaluate(xpathRef, document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
  1154. for (let i = 0; i < refElements.snapshotLength; i++) {
  1155. references.push(refElements.snapshotItem(i));
  1156. }
  1157.  
  1158. references.forEach((reference) => {
  1159. reference.style.cursor = 'crosshair';
  1160. reference.title = 'Cliquez pour ramasser';
  1161. reference.addEventListener('click', function(event) {
  1162. event.preventDefault(); // Empêche les actions par défaut
  1163.  
  1164.  
  1165.  
  1166.  
  1167.  
  1168. // Appliquer le style à la cellule cliquée
  1169. this.style.border = '4px solid red'; // Bordure pour la cellule cliquée
  1170.  
  1171. const referenceText = this.textContent.trim();
  1172. const referenceValue = parseInt(referenceText);
  1173.  
  1174. if (!isNaN(referenceValue)) {
  1175. selectedNumbers.push(referenceValue);
  1176.  
  1177. if (selectedNumbers.length === 1) {
  1178. pickCommand = `pick(OBJECT, ${selectedNumbers[0]});`;
  1179. } else {
  1180. const formattedNumbers = selectedNumbers.join(', ');
  1181. pickCommand = `foreach(objects() as o):if(in(id(o), array(${formattedNumbers}))):pick(OBJECT, id(o));endif;endforeach;`;
  1182. }
  1183.  
  1184. updateTextarea();
  1185. }
  1186.  
  1187. // Afficher le message contextuel à côté du curseur
  1188. tooltip.style.left = `${event.pageX + 10}px`; // Position horizontale
  1189. tooltip.style.top = `${event.pageY + 10}px`; // Position verticale
  1190. tooltip.style.display = 'block'; // Afficher le message
  1191. });
  1192. });
  1193.  
  1194. // Gérer les cellules de position (X, Y, N)
  1195. const positionCells = [];
  1196. const xpathPos = '/html/body/div[3]/div/table/tbody/tr[2]/td[2]/form/table/tbody/table/tbody/tr/td[position() >= 4]';
  1197. const posElements = document.evaluate(xpathPos, document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
  1198. for (let i = 0; i < posElements.snapshotLength; i++) {
  1199. positionCells.push(posElements.snapshotItem(i));
  1200. }
  1201.  
  1202. positionCells.forEach((positionCell) => {
  1203. positionCell.style.cursor = 'crosshair';
  1204. positionCell.title = 'Cliquez pour se déplacer à cet endroit';
  1205. positionCell.addEventListener('click', function(event) {
  1206. event.preventDefault(); // Empêche les actions par défaut
  1207.  
  1208. // Appliquer le style à la cellule cliquée
  1209. if (!clickedPosCells.has(this)) {
  1210. this.style.backgroundColor = '#d3d3d3'; // Couleur de fond pour la cellule cliquée
  1211. clickedPosCells.add(this); // Ajouter à l'ensemble des cellules cliquées
  1212. }
  1213.  
  1214. let position = '';
  1215. const positionCells = this.parentElement.querySelectorAll("td:nth-child(n+4)");
  1216. positionCells.forEach((cell, index) => {
  1217. position += cell.textContent.trim();
  1218. if (index !== positionCells.length - 1) {
  1219. position += ', ';
  1220. }
  1221. });
  1222.  
  1223. moveCommand = `move(${position});`;
  1224.  
  1225. updateTextarea();
  1226.  
  1227. // Afficher le message contextuel à côté du curseur
  1228. tooltip.style.left = `${event.pageX + 10}px`; // Position horizontale
  1229. tooltip.style.top = `${event.pageY + 10}px`; // Position verticale
  1230. tooltip.style.display = 'block'; // Afficher le message
  1231. });
  1232. });
  1233.  
  1234. // Fonction pour réinitialiser le style des cellules
  1235. function resetCellStyles() {
  1236. // Réinitialiser le style des cellules de position uniquement
  1237. positionCells.forEach(cell => {
  1238. if (!clickedPosCells.has(cell)) {
  1239. cell.style.backgroundColor = ''; // Réinitialiser la couleur de fond des cellules de position
  1240. }
  1241. });
  1242.  
  1243. // Réinitialiser le style des cellules de référence uniquement
  1244. references.forEach(cell => {
  1245. if (!clickedRefCells.has(cell)) {
  1246. cell.style.border = ''; // Réinitialiser la bordure des cellules de référence
  1247. }
  1248. });
  1249. }
  1250.  
  1251. // Fonction pour mettre à jour le contenu du textarea
  1252. function updateTextarea() {
  1253. const textarea = document.querySelector("textarea[name='sc']");
  1254. let output = '';
  1255.  
  1256. if (moveCommand) {
  1257. output += `${moveCommand}\n`;
  1258. }
  1259.  
  1260. if (pickCommand) {
  1261. output += `${pickCommand}\n`;
  1262. }
  1263.  
  1264. textarea.value = output;
  1265. }
  1266.  
  1267. // Cacher le message contextuel lorsque la souris se déplace
  1268. document.addEventListener('mousemove', function() {
  1269. tooltip.style.display = 'none'; // Cacher le message lorsqu'on se déplace
  1270. });
  1271.  
  1272. } else {
  1273. console.log('Aucune donnée de trésors trouvée dans localStorage');
  1274. }
  1275.  
  1276.  
  1277.  
  1278.  
  1279.  
  1280.  
  1281.  
  1282.  
  1283.  
  1284.  
  1285. // Fonction pour générer le texte à insérer dans le textarea en fonction du bouton cliqué
  1286. function generateText(action) {
  1287. let output = '';
  1288. switch (action) {
  1289. case 'move':
  1290. output = 'move();';
  1291. break;
  1292. case 'toutramasser':
  1293. output = 'foreach(objects() as o):pick(OBJECT, id(o));endforeach;';
  1294. break;
  1295. case 'toutdeposerausol':
  1296. output = 'drop(OBJECT, ALL, GROUND, GROUND);';
  1297. break;
  1298. case 'toutdeposerauchateau':
  1299. output = 'drop(OBJECT, ALL, PLACE, 45337);';
  1300. break;
  1301. case 'toutdeposeraumanoir':
  1302. output = 'drop(OBJECT, ALL, PLACE, 46494);';
  1303. break;
  1304. case 'toutramassersaufcorps':
  1305. output = 'foreach(objects() as o):if(bnot(eq(category(o), "Corps"))):pick(OBJECT, id(o));endif;endforeach;';
  1306. break;
  1307. case 'entrainer':
  1308. output = 'train();';
  1309. break;
  1310. case 'dépot1objetcase':
  1311. output = 'drop(OBJECT, ID de l objet, GROUND, GROUND);';
  1312. break;
  1313. case 'dépot1objetchateau':
  1314. output = 'drop(OBJECT, ID de l objet, PLACE, 45337);';
  1315. break;
  1316. case 'dépot1objetmanoir':
  1317. output = 'drop(OBJECT, ID de l objet, PLACE, 46494);';
  1318. break;
  1319. case 'ramasserplantes':
  1320. output = 'foreach(plants() as o):pick(PLANT, id(o));endforeach;';
  1321. break;
  1322. case 'ramasserct':
  1323. output = "foreach(objects() as o): if(eq(name(o), 'CT')): pick(OBJECT, id(o)); endif; endforeach;"
  1324. break;
  1325. case 'attackmonster':
  1326. output = "attack(MONSTER, Id);"
  1327. break;
  1328. case 'attackall':
  1329. output = "foreach(monsters() as o):attack(MONSTER, id(o));endforeach;"
  1330. break;
  1331. case 'equip':
  1332. output = "equip(Id);"
  1333. break;
  1334. case 'unequip':
  1335. output = "unequip(Id);"
  1336. break;
  1337. case 'scout':
  1338. output = "scout();"
  1339. break;
  1340. case 'passtp':
  1341. output = "enter(PLACE|PORTAL, Id);"
  1342. break;
  1343. // Ajoutez des cases pour d'autres actions ou boutons
  1344. default:
  1345. break;
  1346. }
  1347. return output;
  1348. }
  1349.  
  1350. // recup du num de goblin pour l'ordre follow
  1351. function generateFollowOrder(distance) {
  1352. const gobId = localStorage.getItem('gobId'); // Récupérer l'ID depuis le local storage
  1353.  
  1354. if (!gobId) {
  1355. return "Je n'ai pas votre numéro, visitez votre page profil et revenez ici !"; // Retourner le message si gobId est null
  1356. }
  1357.  
  1358. const followOrder = `follow(PLAYER, ${gobId}, ${distance});`;
  1359. return followOrder;
  1360. }
  1361. // Création de la liste déroulante pour choisir la distance pour l'ordre follow
  1362. const followDistanceSelect = document.createElement('select');
  1363. followDistanceSelect.style.backgroundColor= '#64b3e4';
  1364. [0, 1, 2, 3, 4, 5].forEach((value) => {
  1365. const option = document.createElement('option');
  1366. option.value = value;
  1367.  
  1368. option.textContent = value + ' cases'; // Ajout de " cases" après chaque nombre
  1369. followDistanceSelect.appendChild(option);
  1370. });
  1371.  
  1372.  
  1373.  
  1374. // Sélection du textarea
  1375. const textarea = document.querySelector("textarea[name='sc']");
  1376.  
  1377. // Fonction pour insérer du texte dans le textarea
  1378. function insertText(text) {
  1379. textarea.value += text + '\n'; // Ajout du nouveau texte à la suite du texte existant
  1380. }
  1381.  
  1382.  
  1383. // Création du bouton 0 "Move"
  1384. const button0 = document.createElement('button');
  1385. button0.textContent = 'Se déplacer';
  1386. button0.style.backgroundColor= '#a8eff1'; // Définir la couleur de fond
  1387. button0.title = 'cliquer sur une position dans le tableau en dessous pour faire déplacer votre suivant à cet endroit, ou cliquez ici et ajoutez manuellement vos coordonées';
  1388. button0.addEventListener('click', function(event) {
  1389. event.preventDefault(); // Empêche le rafraîchissement de la page
  1390. const output = generateText('move');
  1391. insertText(output);
  1392. });
  1393.  
  1394.  
  1395. // Création du premier bouton "Tout ramasser"
  1396. const button1 = document.createElement('button');
  1397. button1.textContent = 'Tout ramasser';
  1398. button1.style.backgroundColor= '#e4ed97'; // Définir la couleur de fond
  1399. button1.addEventListener('click', function(event) {
  1400. event.preventDefault(); // Empêche le rafraîchissement de la page
  1401. const output = generateText('toutramasser');
  1402. insertText(output);
  1403. });
  1404.  
  1405. // Création du deuxième bouton
  1406. const button2 = document.createElement('button');
  1407. button2.textContent = 'Tout déposer (sol)';
  1408. button2.style.backgroundColor= '#e4ed97'; // Définir la couleur de fond
  1409. button2.addEventListener('click', function(event) {
  1410. event.preventDefault(); // Empêche le rafraîchissement de la page
  1411. const output = generateText('toutdeposerausol');
  1412. insertText(output);
  1413. });
  1414.  
  1415. // Création du troisième bouton
  1416. const button3 = document.createElement('button');
  1417. button3.textContent = 'Tout déposer (chateau)';
  1418. button3.style.backgroundColor= '#e4ed97'; // Définir la couleur de fond
  1419. button3.addEventListener('click', function(event) {
  1420. event.preventDefault(); // Empêche le rafraîchissement de la page
  1421. const output = generateText('toutdeposerauchateau');
  1422. insertText(output);
  1423. });
  1424.  
  1425. // Création du troisième bouton
  1426. const button3b = document.createElement('button');
  1427. button3b.textContent = 'Tout déposer (manoir)';
  1428. button3b.style.backgroundColor= '#e4ed97'; // Définir la couleur de fond
  1429. button3b.addEventListener('click', function(event) {
  1430. event.preventDefault(); // Empêche le rafraîchissement de la page
  1431. const output = generateText('toutdeposeraumanoir');
  1432. insertText(output);
  1433. });
  1434.  
  1435. // Création du 4em bouton
  1436. const button4 = document.createElement('button');
  1437. button4.textContent = 'Tout ramasser (sauf corps)';
  1438. button4.style.backgroundColor= '#e4ed97'; // Définir la couleur de fond
  1439. button4.addEventListener('click', function(event) {
  1440. event.preventDefault(); // Empêche le rafraîchissement de la page
  1441. const output = generateText('toutramassersaufcorps');
  1442. insertText(output);
  1443. });
  1444.  
  1445. // Création du 5em bouton
  1446. const button5 = document.createElement('button');
  1447. button5.textContent = 'Entrainer';
  1448. button5.style.backgroundColor= '#a8eff1';
  1449. button5.addEventListener('click', function(event) {
  1450. event.preventDefault(); // Empêche le rafraîchissement de la page
  1451. const output = generateText('entrainer');
  1452. insertText(output);
  1453. });
  1454.  
  1455. // Création du 6em bouton
  1456. const button6 = document.createElement('button');
  1457. button6.textContent = 'Déposer un objet (sol)';
  1458. button6.title = 'remplacer ID par l id de votre objet';
  1459. button6.style.backgroundColor= '#e4ed97'; // Définir la couleur de fond
  1460. button6.addEventListener('click', function(event) {
  1461. event.preventDefault(); // Empêche le rafraîchissement de la page
  1462. const output = generateText('dépot1objetcase');
  1463. insertText(output);
  1464. });
  1465.  
  1466. // Création du 7em bouton
  1467. const button7 = document.createElement('button');
  1468. button7.textContent = 'Déposer un objet (chateau)';
  1469. button7.title = 'remplacer ID par l id de votre objet';
  1470. button7.style.backgroundColor= '#e4ed97'; // Définir la couleur de fond
  1471. button7.addEventListener('click', function(event) {
  1472. event.preventDefault(); // Empêche le rafraîchissement de la page
  1473. const output = generateText('dépot1objetchateau');
  1474. insertText(output);
  1475. });
  1476.  
  1477. // Création du 7em bouton bis
  1478. const button7b = document.createElement('button');
  1479. button7b.textContent = 'Déposer un objet (manoir)';
  1480. button7b.title = 'remplacer ID par l id de votre objet';
  1481. button7b.style.backgroundColor= '#e4ed97'; // Définir la couleur de fond
  1482. button7b.addEventListener('click', function(event) {
  1483. event.preventDefault(); // Empêche le rafraîchissement de la page
  1484. const output = generateText('dépot1objetmanoir');
  1485. insertText(output);
  1486. });
  1487.  
  1488. // Création du 8em bouton
  1489. const button8 = document.createElement('button');
  1490. button8.textContent = 'Ramasser plantes';
  1491. button8.style.backgroundColor= '#e4ed97'; // Définir la couleur de fond
  1492. button8.addEventListener('click', function(event) {
  1493. event.preventDefault(); // Empêche le rafraîchissement de la page
  1494. const output = generateText('ramasserplantes');
  1495. insertText(output);
  1496. });
  1497.  
  1498. // Création du 9em bouton
  1499. const button9 = document.createElement('button');
  1500. button9.textContent = 'Ramasser CT';
  1501. button9.style.backgroundColor= '#e4ed97'; // Définir la couleur de fond
  1502. button9.addEventListener('click', function(event) {
  1503. event.preventDefault(); // Empêche le rafraîchissement de la page
  1504. const output = generateText('ramasserct');
  1505. insertText(output);
  1506. });
  1507.  
  1508. // Création du bouton pour l'ordre follow
  1509. const followButton = document.createElement('button');
  1510. followButton.textContent = 'Me suivre à';
  1511. followButton.style.backgroundColor= '#a8eff1';
  1512. followButton.title = 'Sélectionner la distance et cliquer';
  1513. followButton.addEventListener('click', function(event) {
  1514. event.preventDefault(); // Empêche le rafraîchissement de la page
  1515. const distance = followDistanceSelect.value;
  1516. const followOrderText = generateFollowOrder(distance);
  1517. insertText(followOrderText);
  1518. });
  1519.  
  1520. // Création du 11em bouton
  1521. const button11 = document.createElement('button');
  1522. button11.textContent = 'Attaquer un monstre';
  1523. button11.style.backgroundColor= '#d37d7d'
  1524. button11.title = "Remplacer l'ID";
  1525. button11.addEventListener('click', function(event) {
  1526. event.preventDefault(); // Empêche le rafraîchissement de la page
  1527. const output = generateText('attackmonster');
  1528. insertText(output);
  1529. });
  1530.  
  1531. // Création du 12em bouton
  1532. const button12 = document.createElement('button');
  1533. button12.textContent = 'Attaquer tout';
  1534. button12.style.backgroundColor= '#d37d7d'
  1535. button12.addEventListener('click', function(event) {
  1536. event.preventDefault(); // Empêche le rafraîchissement de la page
  1537. const output = generateText('attackall');
  1538. insertText(output);
  1539. });
  1540.  
  1541. // Création du 13em bouton
  1542. const button13 = document.createElement('button');
  1543. button13.textContent = 'Equiper';
  1544. button13.style.backgroundColor= '#e4ed97';
  1545. button13.title = "Remplacer l'ID";
  1546. button13.addEventListener('click', function(event) {
  1547. event.preventDefault(); // Empêche le rafraîchissement de la page
  1548. const output = generateText('equip');
  1549. insertText(output);
  1550. });
  1551.  
  1552. // Création du 14em bouton
  1553. const button14 = document.createElement('button');
  1554. button14.textContent = 'Déséquiper';
  1555. button14.style.backgroundColor= '#e4ed97';
  1556. button14.title = "Remplacer l'ID";
  1557. button14.addEventListener('click', function(event) {
  1558. event.preventDefault(); // Empêche le rafraîchissement de la page
  1559. const output = generateText('unequip');
  1560. insertText(output);
  1561. });
  1562.  
  1563. // Création du 15em bouton
  1564. const button15 = document.createElement('button');
  1565. button15.textContent = 'Espionner';
  1566. button15.style.backgroundColor= '#a8eff1';
  1567. button15.addEventListener('click', function(event) {
  1568. event.preventDefault(); // Empêche le rafraîchissement de la page
  1569. const output = generateText('scout');
  1570. insertText(output);
  1571. });
  1572.  
  1573. // Création du 16em bouton
  1574. const button16 = document.createElement('button');
  1575. button16.textContent = 'Prendre un TP';
  1576. button16.style.backgroundColor= '#a8eff1';
  1577. button16.title = "Remplacer l'ID";
  1578. button16.addEventListener('click', function(event) {
  1579. event.preventDefault(); // Empêche le rafraîchissement de la page
  1580. const output = generateText('passtp');
  1581. insertText(output);
  1582. });
  1583.  
  1584.  
  1585.  
  1586.  
  1587. function createDropdownMenu() {
  1588. // Création du menu déroulant avec des options
  1589. const dropdown = document.createElement('select');
  1590. const option1 = document.createElement('option');
  1591. option1.textContent = 'Option 1';
  1592. const option2 = document.createElement('option');
  1593. option2.textContent = 'Option 2';
  1594. // Ajout des options au menu déroulant
  1595. dropdown.appendChild(option1);
  1596. dropdown.appendChild(option2);
  1597. // Style pour positionner le menu déroulant
  1598. dropdown.style.position = 'absolute';
  1599. dropdown.style.left = '150px'; // Changer la position en fonction de votre mise en page
  1600. dropdown.style.top = '50px'; // Changer la position en fonction de votre mise en page
  1601. // Ajout du menu déroulant au document
  1602. document.body.appendChild(dropdown);
  1603. return dropdown;
  1604. }
  1605.  
  1606. // Trouver les boutons "Déposer un objet (sol)" et "Déposer un objet (château)"
  1607. const solButton = document.querySelector('.gfmm > form:nth-child(11) > div:nth-child(2) > div:nth-child(5) > button:nth-child(8)');
  1608. const chateauButton = document.querySelector('.gfmm > form:nth-child(11) > div:nth-child(2) > div:nth-child(5) > button:nth-child(9)');
  1609.  
  1610. // Gérer l'événement de clic sur le bouton "Déposer un objet (sol)"
  1611. if (solButton) {
  1612. solButton.addEventListener('click', function() {
  1613. // Créer le menu déroulant
  1614. const dropdown = createDropdownMenu();
  1615. // Positionner le menu à côté du bouton "Déposer un objet (sol)"
  1616. dropdown.style.left = solButton.getBoundingClientRect().right + 'px';
  1617. dropdown.style.top = solButton.getBoundingClientRect().top + 'px';
  1618. });
  1619. }
  1620.  
  1621. // Gérer l'événement de clic sur le bouton "Déposer un objet (château)"
  1622. if (chateauButton) {
  1623. chateauButton.addEventListener('click', function() {
  1624. // Créer le menu déroulant
  1625. const dropdown = createDropdownMenu();
  1626. // Positionner le menu à côté du bouton "Déposer un objet (château)"
  1627. dropdown.style.left = chateauButton.getBoundingClientRect().right + 'px';
  1628. dropdown.style.top = chateauButton.getBoundingClientRect().top + 'px';
  1629. });
  1630. }
  1631.  
  1632.  
  1633.  
  1634.  
  1635. // Création des conteneurs pour chaque catégorie
  1636. const basicActionsContainer = document.createElement('div');
  1637. const equipmentContainer = document.createElement('div');
  1638. const warriorsContainer = document.createElement('div');
  1639.  
  1640. // Ajout des boutons dans les conteneurs appropriés
  1641. basicActionsContainer.appendChild(button0);
  1642. basicActionsContainer.appendChild(button5); // Actions de base
  1643. basicActionsContainer.appendChild(followButton);
  1644. basicActionsContainer.appendChild(followDistanceSelect);
  1645. basicActionsContainer.appendChild(button15);
  1646. basicActionsContainer.appendChild(button16);
  1647. equipmentContainer.appendChild(button1); // Équipement
  1648. equipmentContainer.appendChild(button4);
  1649. equipmentContainer.appendChild(button8);
  1650. equipmentContainer.appendChild(button9);
  1651. equipmentContainer.appendChild(document.createElement('br'));
  1652. equipmentContainer.appendChild(button2);
  1653. equipmentContainer.appendChild(button3);
  1654. equipmentContainer.appendChild(button3b);
  1655. equipmentContainer.appendChild(button6);
  1656. equipmentContainer.appendChild(button7);
  1657. equipmentContainer.appendChild(button7b);
  1658. equipmentContainer.appendChild(document.createElement('br'));
  1659. equipmentContainer.appendChild(button13);
  1660. equipmentContainer.appendChild(button14);
  1661. warriorsContainer.appendChild(button11); // Guerriers
  1662. warriorsContainer.appendChild(button12);
  1663. // Ajout du style pour masquer les catégories par défaut
  1664. basicActionsContainer.style.display = 'none';
  1665. equipmentContainer.style.display = 'none';
  1666. warriorsContainer.style.display = 'none';
  1667.  
  1668.  
  1669.  
  1670.  
  1671. // Gestionnaire d'événement pour masquer ou afficher une catégorie
  1672. function toggleCategory(category, button) {
  1673. const display = category.style.display;
  1674. if (display === 'none') {
  1675. category.style.display = 'block';
  1676. button.textContent = button.textContent.replace('►', '▼');
  1677.  
  1678. } else {
  1679. category.style.display = 'none';
  1680. button.textContent = button.textContent.replace('▼', '►');
  1681.  
  1682. }
  1683. }
  1684.  
  1685. // Fonction pour créer un bouton de catégorie et son gestionnaire d'événements
  1686. function createCategoryButton(container, buttonText) {
  1687. const toggleButton = document.createElement('button');
  1688. toggleButton.textContent = `${buttonText} ►`;
  1689. toggleButton.addEventListener('click', function(event) {
  1690. event.preventDefault(); // Empêcher le rafraîchissement de la page
  1691. toggleCategory(container, this);
  1692. });
  1693. return toggleButton;
  1694. }
  1695.  
  1696. // Création des boutons pour masquer ou afficher les catégories
  1697. const basicActionsToggle = createCategoryButton(basicActionsContainer, 'Actions de base');
  1698. basicActionsToggle.title = "Cliquez pour afficher/masquer les actions de base";
  1699. basicActionsToggle.style.backgroundColor= '#8de4e7';
  1700. basicActionsToggle.style.fontWeight= 'bold'
  1701. const equipmentToggle = createCategoryButton(equipmentContainer, 'Équipement');
  1702. equipmentToggle.style.backgroundColor= '#ced688';
  1703. equipmentToggle.style.fontWeight= 'bold'
  1704. const warriorsToggle = createCategoryButton(warriorsContainer, 'Guerriers');
  1705. warriorsToggle.style.backgroundColor= '#d37d7d';
  1706. warriorsToggle.style.fontWeight= 'bold'
  1707.  
  1708. // Trouver l'élément spécifique où insérer les boutons
  1709. const specificElement = document.evaluate('/html/body/div[3]/div/table/tbody/tr[2]/td[2]/form/table', document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
  1710.  
  1711. if (specificElement) {
  1712. // Création d'un conteneur principal pour tous les boutons et les catégories
  1713. const allButtonsContainer = document.createElement('div');
  1714. allButtonsContainer.appendChild(basicActionsToggle);
  1715. allButtonsContainer.appendChild(basicActionsContainer);
  1716. allButtonsContainer.appendChild(document.createElement('br'));
  1717. allButtonsContainer.appendChild(equipmentToggle);
  1718. allButtonsContainer.appendChild(equipmentContainer);
  1719. allButtonsContainer.appendChild(document.createElement('br'));
  1720. allButtonsContainer.appendChild(warriorsToggle);
  1721. allButtonsContainer.appendChild(warriorsContainer);
  1722.  
  1723. // Ajoutez les autres catégories de la même manière
  1724.  
  1725. // Insérer le conteneur des boutons avant l'élément spécifique
  1726. specificElement.parentNode.insertBefore(allButtonsContainer, specificElement);
  1727. } else {
  1728. console.log('Élément spécifique non trouvé');
  1729. }
  1730. // Sélectionner l'élément cible
  1731. const targetElement = document.querySelector('div.titreMenu:nth-child(9)');
  1732.  
  1733. if (targetElement) {
  1734. // Créer un nouvel élément pour le texte
  1735. const newElement = document.createElement('p'); // Utilise un <p> pour le texte, ou tout autre élément approprié
  1736. newElement.textContent = 'Bienvenue sur GobZilla Script. Cliquez directement sur des coordonées dans la vue clonée pour y déplacer votre suivant. Cliquez sur une ou plusieurs ID de trésors pour les ramasser. Sinon, utilisez les boutons'; // Définir le texte du nouvel élément
  1737.  
  1738. // Ajouter le nouvel élément sous l'élément cible
  1739. targetElement.parentNode.insertBefore(newElement, targetElement.nextSibling);
  1740. } else {
  1741. console.error('L\'élément spécifié n\'a pas été trouvé.');
  1742. }
  1743. });
  1744.  
  1745.  
  1746.  
  1747.  
  1748. // Sélection de l'élément contenant le code
  1749. const codeElement = document.querySelector('td > div > pre > code > span > span');
  1750.  
  1751. if (codeElement) {
  1752. // Récupération du texte de l'élément
  1753. const texte = codeElement.textContent.trim();
  1754.  
  1755. // Extraction du mot "stop"
  1756. const stopIndex = texte.indexOf('stop');
  1757. let stopData = '';
  1758.  
  1759. if (stopIndex !== -1) {
  1760. // Si le mot "stop" est trouvé, récupération de la partie du texte à partir de "stop"
  1761. stopData = texte.substring(stopIndex, stopIndex + 4);
  1762. console.log('Donnée "stop" extraite :', stopData);
  1763. } else {
  1764. console.log('Mot "stop" non trouvé dans le texte');
  1765. }
  1766. } else {
  1767. console.log('Élément contenant le code non trouvé');
  1768. }
  1769. }
  1770.  
  1771.  
  1772.  
  1773. //==========================================================================================================================================================================================================================
  1774. // Page équipement - récuprer les BM du matos templaté et en calculer le total
  1775. //==========================================================================================================================================================================================================================
  1776. if ($(location).attr('href').match(/http:\/\/(.*\.)?gobland\.fr\/Equipement\.php/i)) {
  1777. (function() {
  1778. 'use strict';
  1779.  
  1780. let elements = document.querySelectorAll('td.blanc');
  1781.  
  1782. elements.forEach(element => {
  1783. if (element.innerText.includes("Viverne")) {
  1784. let regex = /(DEG:\W\d+)/g;
  1785. element.innerHTML = element.innerHTML.replace(regex, '<span style="color: #e530cf ;">$1</span>');
  1786. }
  1787. else if (element.innerText.includes("Centaure")) {
  1788. let regex = /(ATT:\W\d+|DEG:\+\d+|PER:\W\d+)/g;
  1789. element.innerHTML = element.innerHTML.replace(regex, '<span style="color: #e530cf ;">$1</span>');
  1790. }
  1791. else if (element.innerText.includes("Titan")) {
  1792. let regex = /(ATT:\W\d+|DEG:\W\d+|ESQ:\W\d+)/g;
  1793. element.innerHTML = element.innerHTML.replace(regex, '<span style="color: #e530cf ;">$1</span>');
  1794. }
  1795. else if (element.innerText.includes("Sphinx")) {
  1796. let regex = /(ArmMag:\W\d+)/g;
  1797. element.innerHTML = element.innerHTML.replace(regex, '<span style="color: #e530cf ;">$1</span>');
  1798. }
  1799. else if (element.innerText.includes("Lézard Géant")) {
  1800. let regex = /(-30 Min)/g;
  1801. element.innerHTML = element.innerHTML.replace(regex, '<span style="color: #e530cf ;">$1</span>');
  1802. }
  1803. else if (element.innerText.includes("Griffon")) {
  1804. let regex = /(ATT:\W\d+|PER:\W\d+)/g;
  1805. element.innerHTML = element.innerHTML.replace(regex, '<span style="color: #e530cf ;">$1</span>');
  1806. }
  1807. else if (element.innerText.includes("Minotaure")) {
  1808. let regex = /(ArmMag:\W\d+|ESQ:\W\d+)/g;
  1809. element.innerHTML = element.innerHTML.replace(regex, '<span style="color: #e530cf ;">$1</span>');
  1810. }
  1811. else if (element.innerText.includes("Oni")) {
  1812. let regex = /(ATT:\W\d+|REG:\W\d+)/g;
  1813. element.innerHTML = element.innerHTML.replace(regex, '<span style="color: #e530cf ;">$1</span>');
  1814. }
  1815. else if (element.innerText.includes("Golem")) {
  1816. let regex = /(\+30 Min|ArmMag:\W\d+)/g;
  1817. element.innerHTML = element.innerHTML.replace(regex, '<span style="color: #e530cf ;">$1</span>');
  1818. }
  1819. else if (element.innerText.includes("Galopin")) {
  1820. let regex = /(ESQ:\W\d+|DEG:\W\d+)/g;
  1821. element.innerHTML = element.innerHTML.replace(regex, '<span style="color: #e530cf ;">$1</span>');
  1822. }
  1823. else if (element.innerText.includes("Dragon")) {
  1824. let regex = /(ATT:\W\d+|DEG:\W\d+|ESQ:\W\d+|ArmMag:\W\d+|RM:\W\d+%|MM\W\d+%)/g;
  1825. element.innerHTML = element.innerHTML.replace(regex, '<span style="color: #e530cf ;">$1</span>');
  1826. }
  1827. else if (element.innerText.includes("Phoenix")) {
  1828. let regex = /(DEG:\W\d+|REG:\W\d+|MS:\W\d+%)/g;
  1829. element.innerHTML = element.innerHTML.replace(regex, '<span style="color: #e530cf ;">$1</span>');
  1830. }
  1831. else if (element.innerText.includes("Ombre")) {
  1832. let regex = /(ATT:\W\d+|DEG:\W\d+|PER:\W\d+|RT\W\d+%|MT\W\d+%)/g;
  1833. element.innerHTML = element.innerHTML.replace(regex, '<span style="color: #e530cf ;">$1</span>');
  1834. }
  1835.  
  1836. });
  1837. })();
  1838.  
  1839. // Fonction pour extraire et calculer les bonus magiques des objets équipés
  1840. function calculerBonusMagiques() {
  1841. // Sélection des balises contenant les informations des objets équipés
  1842. const elements = document.querySelectorAll('.blanc');
  1843.  
  1844. let attBonus = 0;
  1845. let armBonus = 0;
  1846. let esqBonus = 0;
  1847. let perBonus = 0;
  1848. let degBonus = 0;
  1849. let regBonus = 0;
  1850. let tempsBonus = 0;
  1851.  
  1852. // Parcours de chaque élément pour extraire les informations
  1853. elements.forEach((element) => {
  1854. const text = element.innerText.toLowerCase();
  1855.  
  1856. if (text.includes('oni')) {
  1857. attBonus += 1;
  1858. regBonus += 1;
  1859. }
  1860. else if (text.includes('griffon')) {
  1861. attBonus += 1;
  1862. perBonus += 1;
  1863. }
  1864. else if (text.includes('viverne')) {
  1865. degBonus += 1;
  1866. }
  1867. else if (text.includes('centaure')) {
  1868. attBonus += 1;
  1869. degBonus += 1;
  1870. perBonus -= 1;
  1871. }
  1872. else if (text.includes('titan')) {
  1873. attBonus += 1;
  1874. degBonus += 1;
  1875. esqBonus -= 1;
  1876. }
  1877. else if (text.includes('sphinx ')) {
  1878. armBonus += 1;
  1879. }
  1880. else if (text.includes('lézard')) {
  1881. tempsBonus -= 30;
  1882. }
  1883. else if (text.includes('minotaure')) {
  1884. armBonus += 1;
  1885. esqBonus -= 1;
  1886. }
  1887.  
  1888. else if (text.includes('golem')) {
  1889. tempsBonus += 30;
  1890. armBonus += 2;
  1891. }
  1892. else if (text.includes('galopin')) {
  1893. esqBonus += 1;
  1894. degBonus -= 1;
  1895. }
  1896.  
  1897. else if (text.includes('dragon')) {
  1898. attBonus += 1;
  1899. degBonus += 1;
  1900. esqBonus -= 3;
  1901. armBonus += 2;
  1902. }
  1903. else if (text.includes('phoenix')) {
  1904. degBonus += 1;
  1905. regBonus += 2;
  1906. }
  1907. else if (text.includes('ombre')) {
  1908. attBonus += 1;
  1909. degBonus += 1;
  1910. perBonus -= 1;
  1911. }
  1912.  
  1913. });
  1914.  
  1915. // Calcul du total des bonus malus magiques
  1916. const totalBonus = `ATT${attBonus} | ESQ${esqBonus} | DEG${degBonus} | REG${regBonus} | Arm${armBonus} | PER${perBonus} | Temps${tempsBonus}`;
  1917.  
  1918. // Sélection de l'élément où insérer les bonus
  1919. const enleverButton = document.querySelector('input[name="maction"][value="Enlever"]');
  1920.  
  1921. // Création d'un élément pour afficher les bonus
  1922. const bonusElement = document.createElement('div');
  1923. // Ajout des styles pour la couleur et le centrage
  1924. bonusElement.style.color = '#e530cf'; // Couleur e530cf
  1925. bonusElement.style.fontWeight = 'bold' ; // gras
  1926. bonusElement.style.marginTop = '20px'; // Ajout d'un espace sous l'élément
  1927.  
  1928. // Fonction pour afficher un symbole '+' ou '-' en fonction de la valeur du bonus
  1929. const afficherSymbole = (valeur) => (valeur > 0 ? '+' : valeur < 0 ? '-' : '');
  1930.  
  1931. // Texte pour afficher les bonus
  1932. let texteBonus = 'Total des BMM: ';
  1933.  
  1934. // Liste des bonus individuels avec leur nom et valeur
  1935. const bonusIndividuels = [
  1936. { nom: 'ATT', valeur: attBonus },
  1937. { nom: 'ESQ', valeur: esqBonus },
  1938. { nom: 'DEG', valeur: degBonus },
  1939. { nom: 'REG', valeur: regBonus },
  1940. { nom: 'ArmMag', valeur: armBonus },
  1941. { nom: 'PER', valeur: perBonus },
  1942. { nom: 'Temps', valeur: tempsBonus },
  1943. ];
  1944.  
  1945. // Boucle à travers chaque bonus individuel et les ajouter au texte
  1946. bonusIndividuels.forEach((bonus) => {
  1947. const symbole = afficherSymbole(bonus.valeur);
  1948. const valeurAbsolue = Math.abs(bonus.valeur);
  1949.  
  1950. // Si la valeur du bonus est différente de zéro, l'ajouter au texte
  1951. if (bonus.valeur !== 0) {
  1952. texteBonus += `${bonus.nom}${symbole}${valeurAbsolue} | `;
  1953. }
  1954. });
  1955.  
  1956. // Supprimer le dernier symbole '|' s'il est présent à la fin
  1957. texteBonus = texteBonus.replace(/\s*\|\s*$/, '');
  1958.  
  1959. // Création d'un élément avec le texte des bonus
  1960. const totalBBMElement = document.createElement('div');
  1961. totalBBMElement.textContent = texteBonus;
  1962. bonusElement.appendChild(totalBBMElement);
  1963.  
  1964. // Insertion du texte des bonus après l'élément "Enlever"
  1965. enleverButton.insertAdjacentElement('afterend', bonusElement);
  1966. }
  1967.  
  1968. // Appel de la fonction une fois que la page est chargée
  1969. window.addEventListener('load', calculerBonusMagiques);
  1970.  
  1971. }
  1972.  
  1973.  
  1974. //==========================================================================================================================================================================================================================
  1975. // Page Option - Description de Gobzilla quand on clique sur Goodies et Gobzilla
  1976. //==========================================================================================================================================================================================================================
  1977.  
  1978. // rename Goodies
  1979. if ($(location).attr('href').match(/http:\/\/(.*\.)?gobland\.fr\/Options\.php/i)) {
  1980. (function() {
  1981. 'use strict';
  1982.  
  1983. var newLinkText = "[Googies et GobZilla]";
  1984.  
  1985. var goodiesLink = document.querySelector('a[href="goodies.php"]');
  1986. if (goodiesLink) {
  1987. goodiesLink.textContent = newLinkText;
  1988. }
  1989.  
  1990. })
  1991. ();
  1992. }
  1993.  
  1994. // ajoute un paragraphe de description de Gobzilla
  1995. if ($(location).attr('href').match(/http:\/\/(.*\.)?gobland\.fr\/Goodies\.php/i)) {
  1996. (function() {
  1997. 'use strict';
  1998.  
  1999. var newLinkText = "[Googies et GobZilla]";
  2000.  
  2001. var goodiesLink = document.querySelector('a[href="goodies.php"]');
  2002. if (goodiesLink) {
  2003. goodiesLink.textContent = newLinkText;
  2004. }
  2005.  
  2006.  
  2007. var newMessageLines = [
  2008. "Roulé à la main sous les Aisselles par DeathMétal 330, puis grandement amélioré par Glak 393",
  2009. "Fonctions principales :",
  2010. "- GobCDM : Cliquez sur un monstre dans la page vue pour avoir sa cdm, si déja dans la base de donnée",
  2011. " - Affiche une vue 2d activable ou non ",
  2012. " - Boutons pour les ordres des suivants ",
  2013. " - Décoche le vestiaire, décoche l'activation de DLA ",
  2014. ' - Masquer les petits monstres, masquer les arbres',
  2015. " - Calcul auto de nombre d'entrainements pour passer lvl supérieur" ,
  2016. " - Récupération des caracs et calculs des skills au survol de la souris. ",
  2017. " - Calcul sur les Matériaux, page équipement et habitation",
  2018. " - Modifie la Css et met en couleur les Gobelins et les gros monstres dans la vue . En rouge > 40, en orange >35, en orange clair >30",
  2019. "- Filtre et tri des monstres + compteur, tri des plantes",
  2020. "- Affiche les lieux étendus (lieux hors de vue), ainsi que les plantes étendues (plantes hors vue, activable via une coche)",
  2021. " - Herboriser : Affiche en couleur verte les plantes herborisables",
  2022. " - Met en évidence le Bonus/Malus de concentration sur la page Mon profil ",
  2023. " - Calcul des Bonus Malus Magiques de l'équipement sur la page equipement et met en évidence les bonus magiques sur chaque objet ",
  2024. " - Ajout d'icônes dans le profil et dans la vue ",
  2025. " 🥰 amis",
  2026. " 👨‍🍳 monstre à cuisiner ",
  2027. "👁️👁️👁️ VLC Totale",
  2028. "👁️👁️ VLC Importante",
  2029. "👁️ VLC partielle",
  2030. " Bipez moi si vous voyez des erreurs, il doit y en avoir......."
  2031. ];
  2032.  
  2033.  
  2034.  
  2035. var developmentMessage = document.querySelector('font[color="RED"]');
  2036. if (developmentMessage) {
  2037. developmentMessage.textContent = ''; // Clear existing content
  2038.  
  2039. // Add an image
  2040. var imageElement = document.createElement('img');
  2041. imageElement.src = 'https://i.ibb.co/cgqGVCt/g-OBZILLAICON.png'; // Replace with the URL of your image
  2042. imageElement.style.maxWidth = '60%'; // Ensure the image fits within the content
  2043. developmentMessage.appendChild(imageElement);
  2044.  
  2045. var welcomeTitle = document.createElement('div');
  2046. welcomeTitle.style.fontSize = '24px'; // Larger font size
  2047. welcomeTitle.style.fontWeight = 'bold'; // Bold style
  2048. welcomeTitle.style.marginBottom = '10px'; // Add some space below
  2049. welcomeTitle.textContent = 'Bienvenue sur GobZilla';
  2050. developmentMessage.appendChild(welcomeTitle);
  2051. newMessageLines.forEach(function(line) {
  2052. var paragraph = document.createElement('p');
  2053. paragraph.style.color = 'black';
  2054. if (line === "Fonctions principales :") {
  2055. var underline = document.createElement('u');
  2056. underline.textContent = line;
  2057. paragraph.appendChild(underline);
  2058. } else {
  2059. paragraph.textContent = line;
  2060. }
  2061. developmentMessage.appendChild(paragraph);
  2062. });
  2063. }
  2064. })();
  2065.  
  2066. }
  2067.  
  2068. //==========================================================================================================================================================================================================================
  2069. // Page Clan - Récupération des infos et affichage au survol (surrement a fusionner avec meute juste en dessous)
  2070. //==========================================================================================================================================================================================================================
  2071. if ($(location).attr('href').match(/http:\/\/(.*\.)?gobland\.fr\/membresClan\.php/i)) {
  2072. // XPath pour la colonne des noms des goblins
  2073. const xpathExpression = "//table[@class='tab90']/tbody/tr/th[3]";
  2074. const gobelinPasswords = {
  2075. '330': '30fae3bb4bf976a5cd29628102d42fd2',
  2076. '393': '461a9bdebd3bca149b7b07380b23c7fb',
  2077. '346': '0da2dc91e48d987245a1c6b1662ea41f',
  2078. '387': 'e49a305f7e7e0c784890f47793dd838a',
  2079. '386' : 'b67d6b06e728729e6a2111ca7ffcf387',
  2080. '388': 'c6d64737a6737cdb73a405353b3f1771',
  2081. '411': 'd72e3819d988118cd76f3f5105c8fc7d',
  2082. '407' : '8fdbd9336997cf1dab7a72cbd80733a3',
  2083. '385': 'd8136cab7a465e1e1e2be460c161ef7e',
  2084. '405' : 'e3d4c7b9250c8bde4c0a4ac7a596ecbb',
  2085. '458' : '1eac37ef925c635c9be62212deba8642',
  2086. '456' : '94238d5187351be4adbfc220e6baea4e'
  2087. };
  2088.  
  2089. const goblinIDs = ['330', '393', '346', '387' , '386', '388', '411', '407', '385', '405' , '456' , '458'];
  2090. // Noms des goblins
  2091. const goblinNames = {
  2092. '330': 'DeathMétal',
  2093. '393': 'Glakus Batak Batak',
  2094. '346': 'Globulus',
  2095. '387': 'SeRiNy',
  2096. '386': 'IKI',
  2097. '388': 'Wose',
  2098. '411': 'TKeePeR',
  2099. '407': 'Groot',
  2100. '385': 'Tamarand',
  2101. '405': 'Catarate',
  2102. '456' : 'Kroc le Bo',
  2103. '458' : 'Shadox'
  2104. };
  2105.  
  2106. function getGoblinInfoById(id) {
  2107. const goblinData = localStorage.getItem(`goblinInfo_${id}`);
  2108. console.log(`Data for ID ${id}:`, goblinData); // Vérification dans la console
  2109.  
  2110. return goblinData;
  2111. }
  2112. // Fonction pour afficher les données dans une info bulle
  2113. function showGoblinInfoOnHover() {
  2114. const playerLinks = document.querySelectorAll('td.pfmm a');
  2115.  
  2116. playerLinks.forEach(link => {
  2117. link.addEventListener('mouseover', (event) => {
  2118. const playerId = link.getAttribute('href').match(/\((\d+)\)/)[1];
  2119. const goblinInfo = getGoblinInfoById(playerId);
  2120.  
  2121. const tooltip = document.createElement('div');
  2122. tooltip.classList.add('tooltip');
  2123.  
  2124. if (goblinInfo) {
  2125. const lines = goblinInfo.split('\n'); // Divise les lignes
  2126. const table = document.createElement('table');
  2127. table.classList.add('tooltip-table');
  2128.  
  2129. lines.forEach((line, index) => {
  2130. const rowData = line.split(',').map(data => data.replace(/^"|"$/g, '')); // Divise les données par colonne et supprime les guillemets
  2131.  
  2132. const row = document.createElement('tr');
  2133. rowData.forEach(cellData => {
  2134. const cell = document.createElement(index === 0 ? 'th' : 'td'); // Utilisation de th pour la première ligne
  2135. cell.textContent = cellData;
  2136. row.appendChild(cell);
  2137. });
  2138.  
  2139. table.appendChild(row);
  2140. });
  2141.  
  2142. tooltip.appendChild(table);
  2143. } else {
  2144. tooltip.textContent = "Aucune information disponible, mot de passe de clan manquant";
  2145. }
  2146.  
  2147. document.body.appendChild(tooltip);
  2148.  
  2149. tooltip.style.position = 'absolute';
  2150. tooltip.style.top = `${event.clientY + window.scrollY}px`;
  2151. tooltip.style.left = `${event.clientX}px`;
  2152. tooltip.style.backgroundColor = 'white';
  2153. tooltip.style.border = '1px solid black';
  2154. tooltip.style.padding = '5px';
  2155. tooltip.style.zIndex = '9999';
  2156. tooltip.style.backgroundColor = 'yellow'
  2157.  
  2158. link.addEventListener('mouseout', () => {
  2159. tooltip.remove();
  2160. });
  2161. });
  2162. });
  2163. }
  2164.  
  2165. // Appel de la fonction pour afficher les infos bulles
  2166. showGoblinInfoOnHover();
  2167.  
  2168.  
  2169. // Création du bouton
  2170. const refreshButton = document.createElement('input');
  2171. refreshButton.type = 'button';
  2172. refreshButton.value = 'Rafraîchir les données externes';
  2173. refreshButton.title = 'Cliquez ici pour actualiser les données externes. NE PAS ABUSER';
  2174. refreshButton.onclick = refreshData; // Assure-toi que la fonction refreshData est définie
  2175.  
  2176. // Ajout de classe au bouton (facultatif)
  2177. refreshButton.classList.add('refresh-button');
  2178.  
  2179. // Trouver l'emplacement où tu veux insérer le bouton
  2180. const centerElement = document.querySelector('#identite .pfmm');
  2181. if (centerElement) {
  2182. centerElement.appendChild(refreshButton);
  2183. } else {
  2184. console.error('Impossible de trouver l\'emplacement pour insérer le bouton.');
  2185. }
  2186.  
  2187. // Création de l'élément de style
  2188. const style = document.createElement('style');
  2189. style.innerHTML = `
  2190. .refresh-button {
  2191. display: block;
  2192. margin: 0 auto;
  2193. text-align: center;
  2194. }
  2195. `;
  2196.  
  2197. // Ajout du style au head de la page
  2198. document.head.appendChild(style);
  2199.  
  2200. let lastFetchTime = performance.now();
  2201.  
  2202. function refreshData() {
  2203. goblinIDs.forEach(id => {
  2204. const password = gobelinPasswords[id];
  2205. const url = `http://ie.gobland.fr/IE_Profil.php?id=${id}&passwd=${password}&sep=,&`;
  2206.  
  2207. fetch(url)
  2208. .then(response => response.text())
  2209. .then(csvData => {
  2210. localStorage.setItem(`goblinInfo_${id}`, csvData);
  2211. const currentTime = performance.now();
  2212. const timeElapsed = currentTime - lastFetchTime;
  2213. lastFetchTime = currentTime;
  2214.  
  2215. console.log(`Données pour l'ID ${id} rafraîchies et stockées dans le local storage.`);
  2216. console.log(`Temps écoulé depuis le dernier appel pour ID ${id}: ${timeElapsed} millisecondes`);
  2217.  
  2218. // Convertir le temps en heures et/ou minutes
  2219. const timeInMinutes = Math.floor(timeElapsed / (1000 * 60));
  2220. const hours = Math.floor(timeInMinutes / 60);
  2221. const minutes = timeInMinutes % 60;
  2222. const formattedTime = `${hours}h ${minutes}m`;
  2223.  
  2224. // Mettre à jour le titre du bouton avec le temps écoulé
  2225. refreshButton.title = `Cliquez ici pour actualiser les données externes. NE PAS ABUSER. Dernière mise à jour il y a ${formattedTime}`;
  2226. })
  2227. .catch(error => {
  2228. console.error(`Erreur lors de la récupération du CSV pour l'ID ${id}:`, error);
  2229. });
  2230. });
  2231. }
  2232.  
  2233. }
  2234. //==========================================================================================================================================================================================================================
  2235. // Page Meute - Récupération du niveau pour calcul des PX et récup de l'heure de DLA via ieprofil
  2236. //==========================================================================================================================================================================================================================
  2237. if ($(location).attr('href').match(/http:\/\/(.*\.)?gobland\.fr\/Meute\.php/i)) {
  2238. var lvlmeute = $('center:contains("Niveau de la meute :")').text().match(/^(\D*)(\d+)/)[2];
  2239. window.localStorage.setItem('lvlmeute', lvlmeute);
  2240. } else {
  2241. var lvlmeute = window.localStorage.getItem('lvlmeute');
  2242. }
  2243.  
  2244.  
  2245. /// recup des données sur http://ie.gobland.fr/IE_Profil.php?id=XXX
  2246. if ($(location).attr('href').match(/http:\/\/(.*\.)?gobland\.fr\/Meute\.php/i)) {
  2247. (function() {
  2248. const gobelinPasswords = {
  2249. '330': '30fae3bb4bf976a5cd29628102d42fd2',
  2250. '393': '461a9bdebd3bca149b7b07380b23c7fb',
  2251. '346': '0da2dc91e48d987245a1c6b1662ea41f',
  2252. '387': 'e49a305f7e7e0c784890f47793dd838a',
  2253. '386' : 'b67d6b06e728729e6a2111ca7ffcf387',
  2254. '388': 'c6d64737a6737cdb73a405353b3f1771',
  2255. '411': 'd72e3819d988118cd76f3f5105c8fc7d',
  2256. '407' : '8fdbd9336997cf1dab7a72cbd80733a3',
  2257. '385': 'd8136cab7a465e1e1e2be460c161ef7e',
  2258. '405' : 'e3d4c7b9250c8bde4c0a4ac7a596ecbb',
  2259. '458' : '1eac37ef925c635c9be62212deba8642',
  2260. '456' : '94238d5187351be4adbfc220e6baea4e'
  2261.  
  2262. };
  2263.  
  2264. const goblinIDs = ['330', '393', '346', '387' , '386', '388', '411', '407', '385', '405' , '456', '458'];
  2265.  
  2266. const goblinNames = {
  2267. '330': 'DeathMétal',
  2268. '393': 'Glakus Batak Batak',
  2269. '346': 'Globulus',
  2270. '387':'SeRiNy',
  2271. '386':'IKI',
  2272. '388': 'Wose',
  2273. '411':'TKeePeR',
  2274. '407':'Groot',
  2275. '385':'Tamarand',
  2276. '405':'Catarate',
  2277. '456' : 'Kroc le Bo',
  2278. '458' : 'Shadox'
  2279. };
  2280.  
  2281. function extractinfos(csvData) {
  2282. const rows = csvData.split('\n');
  2283. if (rows.length < 2) return null;
  2284.  
  2285. const headers = rows[0].split(',');
  2286. const dataIndex = headers.indexOf('DLA');
  2287. if (dataIndex === -1) return null;
  2288.  
  2289. const dataArray = rows[1].split(',');
  2290. return dataArray[dataIndex];
  2291. }
  2292.  
  2293. //ici c'est un peu le bordel j'avoue
  2294. function updateTableWithDLA(infosValue, goblinName) {
  2295.  
  2296. }
  2297.  
  2298. // Enregistrement du dernier temps de récupération de données
  2299. let lastFetchTime = performance.now();
  2300.  
  2301. function refreshData() {
  2302. goblinIDs.forEach(id => {
  2303. const password = gobelinPasswords[id];
  2304. const url = `http://ie.gobland.fr/IE_Profil.php?id=${id}&passwd=${password}&sep=,&`;
  2305.  
  2306. fetch(url)
  2307. .then(response => response.text())
  2308. .then(csvData => {
  2309. localStorage.setItem(`goblinInfo_${id}`, csvData);
  2310. const currentTime = performance.now();
  2311. const timeElapsed = currentTime - lastFetchTime;
  2312. lastFetchTime = currentTime;
  2313.  
  2314. console.log(`Données pour l'ID ${id} rafraîchies et stockées dans le local storage.`);
  2315. console.log(`Temps écoulé depuis le dernier appel pour ID ${id}: ${timeElapsed} millisecondes`);
  2316.  
  2317. // Convertir le temps en heures et/ou minutes
  2318. const timeInMinutes = Math.floor(timeElapsed / (1000 * 60));
  2319. const hours = Math.floor(timeInMinutes / 60);
  2320. const minutes = timeInMinutes % 60;
  2321. const formattedTime = `${hours}h ${minutes}m`;
  2322.  
  2323. // Mettre à jour le titre du bouton avec le temps écoulé
  2324. refreshButton.title = `Cliquez ici pour actualiser les données externes. NE PAS ABUSER. Dernière mise à jour il y a ${formattedTime}`;
  2325. })
  2326. .catch(error => {
  2327. console.error(`Erreur lors de la récupération du CSV pour l'ID ${id}:`, error);
  2328. });
  2329. });
  2330. }
  2331.  
  2332.  
  2333.  
  2334. const refreshButton = document.createElement('input');
  2335. refreshButton.type = 'button';
  2336. refreshButton.value = 'Rafraîchir les données externes';
  2337. refreshButton.title = 'Cliquez ici pour actualiser les données externes. NE PAS ABUSER';
  2338. refreshButton.onclick = refreshData;
  2339.  
  2340. refreshButton.classList.add('refresh-button'); // Ajout de la classe au bouton
  2341.  
  2342. const centerElement = document.querySelector('#identite .pfmm');
  2343. if (centerElement) {
  2344. centerElement.appendChild(refreshButton);
  2345. } else {
  2346. console.error('Impossible de trouver l\'emplacement pour insérer le bouton.');
  2347. }
  2348. })();
  2349.  
  2350. // Ajout de styles CSS pour centrer le bouton
  2351. const style = document.createElement('style');
  2352. style.innerHTML = `
  2353. .refresh-button {
  2354. display: block;
  2355. margin: 0 auto;
  2356. text-align: center;
  2357. }
  2358. `;
  2359. document.head.appendChild(style);
  2360.  
  2361.  
  2362.  
  2363. // Sélection de la colonne "Santé"
  2364. const healthColumn = document.querySelector('.tab75 > tbody:nth-child(1) > tr:nth-child(2) > td:nth-child(4)');
  2365.  
  2366. // Appliquer le style pour empêcher le texte de passer à la ligne
  2367. if (healthColumn) {
  2368. healthColumn.style.whiteSpace = 'nowrap';
  2369. }
  2370.  
  2371.  
  2372. // Fonction pour récupérer les informations du local storage
  2373. function getGoblinInfoById(id) {
  2374. const goblinData = localStorage.getItem(`goblinInfo_${id}`);
  2375. console.log(`Data for ID ${id}:`, goblinData); // Vérification dans la console
  2376.  
  2377. return goblinData;
  2378. }
  2379.  
  2380. // Fonction pour afficher les infos bulles
  2381. function showGoblinInfoOnHover() {
  2382. const playerLinks = document.querySelectorAll('td.pfmm a');
  2383.  
  2384. playerLinks.forEach(link => {
  2385. link.addEventListener('mouseover', (event) => {
  2386. const playerId = link.getAttribute('href').match(/\((\d+)\)/)[1];
  2387. const goblinInfo = getGoblinInfoById(playerId);
  2388.  
  2389. const tooltip = document.createElement('div');
  2390. tooltip.classList.add('tooltip');
  2391.  
  2392. if (goblinInfo) {
  2393. const lines = goblinInfo.split('\n'); // Divise les lignes
  2394. const table = document.createElement('table');
  2395. table.classList.add('tooltip-table');
  2396.  
  2397. lines.forEach((line, index) => {
  2398. const rowData = line.split(',').map(data => data.replace(/^"|"$/g, '')); // Divise les données par colonne et supprime les guillemets
  2399.  
  2400. const row = document.createElement('tr');
  2401. rowData.forEach(cellData => {
  2402. const cell = document.createElement(index === 0 ? 'th' : 'td'); // Utilisation de th pour la première ligne
  2403. cell.textContent = cellData;
  2404. row.appendChild(cell);
  2405. });
  2406.  
  2407. table.appendChild(row);
  2408. });
  2409.  
  2410. tooltip.appendChild(table);
  2411. } else {
  2412. tooltip.textContent = "Aucune information disponible, mot de passe de clan manquant";
  2413. }
  2414.  
  2415. document.body.appendChild(tooltip);
  2416.  
  2417. tooltip.style.position = 'absolute';
  2418. tooltip.style.top = `${event.clientY + window.scrollY}px`;
  2419. tooltip.style.left = `${event.clientX}px`;
  2420. tooltip.style.backgroundColor = 'white';
  2421. tooltip.style.border = '1px solid black';
  2422. tooltip.style.padding = '5px';
  2423. tooltip.style.zIndex = '9999';
  2424. tooltip.style.backgroundColor = 'yellow'
  2425.  
  2426. link.addEventListener('mouseout', () => {
  2427. tooltip.remove();
  2428. });
  2429. });
  2430. });
  2431. }
  2432.  
  2433. // Appel de la fonction pour afficher les infos bulles
  2434. showGoblinInfoOnHover();
  2435.  
  2436. }
  2437.  
  2438. $(document).ready(function () {
  2439. // Récupérer le message stocké dans localStorage
  2440. const criStatus = localStorage.getItem("criStatus");
  2441.  
  2442. // Si le message n'est pas trouvé dans le localStorage, utiliser un message par défaut
  2443. const messageToDisplay = criStatus || "Aucune information disponible";
  2444.  
  2445. // Si on est sur la page "vue", afficher le message stocké
  2446. if ($(location).attr('href').match(/^http:\/\/(.*\.)?gobland\.fr\/vue\.php$/i)) {
  2447. // Vérifier si un message existe dans le localStorage
  2448. if (criStatus) {
  2449. console.log("Message récupéré : " + criStatus);
  2450. } else {
  2451. console.log("Aucun message trouvé, affichage par défaut.");
  2452. }
  2453.  
  2454. // Créer l'élément pour le message
  2455. const messageElement = $("<div>")
  2456. .text(messageToDisplay)
  2457. .css({
  2458. "margin-top": "14px",
  2459. "text-align": "center",
  2460. "font-weight": "bold",
  2461. "color": criStatus === "Vous êtes sous cri de Guerre" ? "green" : "red",
  2462. });
  2463.  
  2464. // Insérer le message sous les boutons
  2465. $("input[type='button'][value='Envoyer un MP']")
  2466. .parent() // Cible le parent de chaque bouton
  2467. .before(messageElement);
  2468. }
  2469.  
  2470. // Si on est sur la page "meute", déterminer le statut et l'enregistrer dans localStorage
  2471. if ($(location).attr('href').match(/http:\/\/(.*\.)?gobland\.fr\/Meute\.php/i)) {
  2472. let criActif = false; // Variable pour vérifier si un membre a un niveau 0
  2473.  
  2474. // Parcourir chaque ligne du tableau des membres de la meute
  2475. $("#content table.tab75 tbody tr").each(function () {
  2476. // Extraire le niveau du membre
  2477. const levelCell = $(this).find("td:nth-child(3)").text().trim(); // Cellule avec le niveau
  2478.  
  2479. // Recherche du niveau (le dernier nombre dans la cellule)
  2480. const match = levelCell.match(/\d+$/);
  2481. if (match) {
  2482. const level = parseInt(match[0], 10);
  2483. console.log("Niveau trouvé : " + level);
  2484.  
  2485. // Si un niveau est égal à 0, on active le cri de guerre
  2486. if (level === 0) {
  2487. criActif = true;
  2488. return false; // Arrêter la boucle dès qu'on trouve un niveau égal à 0
  2489. }
  2490. }
  2491. });
  2492.  
  2493. // Déterminer le message en fonction de l'état du cri
  2494. let message;
  2495. if (criActif) {
  2496. message = "Vous êtes sous cri de Guerre";
  2497. } else {
  2498. message = "Attention, pas de cri actif actuellement";
  2499. }
  2500.  
  2501. // Enregistrer le message dans localStorage
  2502. localStorage.setItem("criStatus", message);
  2503.  
  2504. // Afficher le message sur la page "meute"
  2505. $("<div>")
  2506. .text(message)
  2507. .css("color", criActif ? "green" : "red")
  2508. .css("font-weight", "bold")
  2509. .css("margin-top", "12px")
  2510. .insertAfter("#content table.tab75");
  2511. }
  2512.  
  2513. // Affichage pour confirmation dans la console
  2514. console.log("Message : " + messageToDisplay);
  2515. });
  2516.  
  2517.  
  2518.  
  2519. //==========================================================================================================================================================================================================================
  2520. // Page de résultat d'action - Envoi des CdM à GobZilla
  2521. //==========================================================================================================================================================================================================================
  2522. if ($(location).attr('href').match(/http:\/\/(.*\.)?gobland\.fr\/act\.php/i)) {
  2523. // Extraction des caracs min - max d'une ligne de CdM
  2524. function extractMinMax(intervalle) {
  2525. var parse = intervalle.match(/entre (\d+) et (\d+)/);
  2526. if (parse != null) {
  2527. return new Array(parseInt(parse[1]), parseInt(parse[2]));
  2528. } else {
  2529. parse = intervalle.match(/inférieur ou égal à (\d+)/);
  2530. if (parse != null) {
  2531. return new Array(1, parseInt(parse[1]));
  2532. } else {
  2533. parse = intervalle.match(/supérieur ou égal à (\d+)/);
  2534. if (parse != null) {
  2535. return new Array(parseInt(parse[1]), parse[1]*1.5);
  2536. } else {
  2537. return null;
  2538. }
  2539. }
  2540. }
  2541. }
  2542.  
  2543. $( document ).ready(function() {
  2544. if ($("h1").text() == "Connaissance des Monstres") {
  2545. // Analyse de la CdM
  2546. var conteneur = $("#identite").find("div.deborde");
  2547. var rang = null;
  2548. var executionLinesArr = conteneur.find("center:first").text().split("\n");
  2549. $.each( executionLinesArr, function( key, value ) {
  2550. if (value.indexOf("AVEZ RÉUSSI") > 0) {
  2551. rang = value.substring(
  2552. value.indexOf("en tant que") + 12,
  2553. value.indexOf(" ("));
  2554. return false;
  2555. }
  2556. });
  2557. console.log("Rang = " + rang);
  2558. // Vérification du rang : on ne traite pas les CdM des grouillots
  2559. if (rang == "Maître" || rang == "Grand Maître") {
  2560. var resultLinesArr = conteneur.text().split("\n");
  2561. var cdm = {};
  2562. cdm.gob = window.localStorage.getItem('gobId');
  2563. cdm.rang = rang;
  2564. $.each( resultLinesArr, function( key, value ) {
  2565. lineArr = value.split(" : ");
  2566. // Construction de la CdM en parsant la page
  2567. switch (lineArr[0]) {
  2568. case "Le monstre ciblé fait partie des":
  2569. cdm.nom = lineArr[1].split("(")[1].split(" - ")[0];
  2570. cdm.numMob = lineArr[1].split(" - N° ")[1].split(")")[0];
  2571. break;
  2572. case "Niveau":
  2573. cdm.niveau = lineArr[1];
  2574. break;
  2575. case "Points de Vie":
  2576. var arrMinMax = extractMinMax(lineArr[1]);
  2577. cdm.pvMin = arrMinMax[0];
  2578. cdm.pvMax = arrMinMax[1];
  2579. break;
  2580. case "Dés d'Attaque":
  2581. var arrMinMax = extractMinMax(lineArr[1]);
  2582. cdm.attMin = arrMinMax[0];
  2583. cdm.attMax = arrMinMax[1];
  2584. break;
  2585. case "Dés d'Esquive":
  2586. var arrMinMax = extractMinMax(lineArr[1]);
  2587. cdm.esqMin = arrMinMax[0];
  2588. cdm.esqMax = arrMinMax[1];
  2589. break;
  2590. case "Dés de Dégât":
  2591. var arrMinMax = extractMinMax(lineArr[1]);
  2592. cdm.degMin = arrMinMax[0];
  2593. cdm.degMax = arrMinMax[1];
  2594. break;
  2595. case "Dés de Régénération":
  2596. var arrMinMax = extractMinMax(lineArr[1]);
  2597. cdm.regMin = arrMinMax[0];
  2598. cdm.regMax = arrMinMax[1];
  2599. break;
  2600. case "Perception":
  2601. var arrMinMax = extractMinMax(lineArr[1]);
  2602. cdm.perMin = arrMinMax[0];
  2603. cdm.perMax = arrMinMax[1];
  2604. break;
  2605. case "Armure Physique":
  2606. var arrMinMax = extractMinMax(lineArr[1]);
  2607. cdm.armurePhyMin = arrMinMax[0];
  2608. cdm.armurePhyMax = arrMinMax[1];
  2609. break;
  2610. case "Armure Magique":
  2611. var arrMinMax = extractMinMax(lineArr[1]);
  2612. cdm.armureMagMin = arrMinMax[0];
  2613. cdm.armureMagMax = arrMinMax[1];
  2614. break;
  2615. case "Durée du tour":
  2616. var arrMinMax = extractMinMax(lineArr[1]);
  2617. cdm.tourMin = arrMinMax[0];
  2618. cdm.tourMax = arrMinMax[1];
  2619. break;
  2620. case "Créature volante":
  2621. cdm.vol = lineArr[1];
  2622. break;
  2623. case "Attaque à distance":
  2624. cdm.distance = lineArr[1];
  2625. break;
  2626. case "Pouvoir":
  2627. cdm.pouvoir = lineArr[1];
  2628. break;
  2629. case "Nombre d'attaques":
  2630. cdm.nbAttaques = lineArr[1];
  2631. break;
  2632. case "Habitat":
  2633. cdm.habitat = lineArr[1];
  2634. break;
  2635. case "Comportement":
  2636. cdm.comportement = lineArr[1];
  2637. break;
  2638. case "Intelligence":
  2639. cdm.intelligence = lineArr[1];
  2640. break;
  2641. case "Vitesse de déplacement":
  2642. cdm.vitesse = lineArr[1];
  2643. break;
  2644. case "Vision du Caché":
  2645. cdm.vlc = lineArr[1];
  2646. break;
  2647. }
  2648. });
  2649.  
  2650. // Envoi de la CdM
  2651. var url = "https://gobzilla.incaworld.fr/cdm";
  2652. var result = $("<center></center>");
  2653. console.log(cdm);
  2654. var data = JSON.stringify(cdm);
  2655. console.log(data);
  2656. $.ajax({
  2657. type: "PUT",
  2658. url: url,
  2659. contentType: "application/json",
  2660. data: data
  2661. })
  2662. .done(function() {
  2663. result.html("<br><b>**** CdM envoyée à GobZilla ****</b>");
  2664. })
  2665. .fail(function(err) {
  2666. console.log(err);
  2667. result.html("<br><b>**** Echec de l'envoi de la CdM à GobZilla ****</b>");
  2668. })
  2669. .always(function() {
  2670. result.insertAfter(conteneur.find("center:last"));
  2671. });
  2672. }
  2673. }
  2674. });
  2675. }
  2676.  
  2677. //==========================================================================================================================================================================================================================
  2678. // Page MENU (left)
  2679. //==========================================================================================================================================================================================================================
  2680. if ($(location).attr('href').match(/http:\/\/(.*\.)?gobland\.fr\/Menu\.php/i)) {
  2681. // Enregistrement dans le stockage local de l'identité du Gob
  2682. var gobContainer = $(".presentation").find('a:first');
  2683. window.localStorage.setItem('gobName', gobContainer.text());
  2684. window.localStorage.setItem('gobId', gobContainer.attr('href').match(/javascript:EPV\((\d+)\)/)[1]);
  2685. }
  2686.  
  2687.  
  2688. //==========================================================================================================================================================================================================================
  2689. // Page ACTIONS (footer) Affiche en couleur les monstres qui manquent de CDM
  2690. //==========================================================================================================================================================================================================================
  2691. if ($(location).attr('href').match(/http:\/\/(.*\.)?gobland\.fr\/playActions\.php/i)) {
  2692. function showHideCdmNeededActions() {
  2693. var displayCdmNeededChecked = window.localStorage.getItem('displayCdmNeededChecked');
  2694.  
  2695. if(displayCdmNeededChecked == 1) {
  2696. var cdmNeeded = window.localStorage.getItem('cdmNeeded');
  2697. $.each(cdmNeeded.split(","), function(index, value) {
  2698. $('option:contains("' + value + '")').css("background-color", "#FF99FF");
  2699. });
  2700. } else {
  2701. $(".cdmNeeded").removeClass("cdmNeeded");
  2702. }
  2703. }
  2704.  
  2705. // Après chargement de la page, lancement des enhancements
  2706. $( document ).ready(function() {
  2707. showHideCdmNeededActions();
  2708. });
  2709. }
  2710.  
  2711. //==========================================================================================================================================================================================================================
  2712. // Page VUE. Vue 2D, divers filtres/tri, modification de la CSS, lieux et plantes étendus, CDM, Compteur de créatures
  2713. //==========================================================================================================================================================================================================================
  2714. if ($(location).attr('href').match(/^http:\/\/(.*\.)?gobland\.fr\/vue\.php$/i)) {
  2715.  
  2716.  
  2717.  
  2718. // Intégration de CSS pour le loader et la CDM
  2719. var myCSS = `
  2720. #preFilter label {
  2721. padding-left: 10px;
  2722. }
  2723. #preFilter {
  2724. padding: 5px;
  2725. margin-bottom: 5px;
  2726. border: 1px solid black;
  2727. text-align: center;
  2728. }
  2729. #btnRefresh {
  2730. display: block;
  2731. text-align: center;
  2732. margin: auto;
  2733. }
  2734. #filterDiv {
  2735. padding-bottom: 5px;
  2736. }
  2737. #filterDiv label {
  2738. padding-left: 10px;
  2739. }
  2740. .ckbFilter {
  2741. vertical-align: middle;
  2742. }
  2743. .cdmNeeded {
  2744. background-color: #FF99FF;
  2745. }
  2746. .cuisine {
  2747. background-color: #99FF99;
  2748. }
  2749. .cdmContainer {
  2750. background: url(http://images.gobland.fr/v1.0/grande-fenetre/gf-centre.png);
  2751. border: 2px solid #666;
  2752. font-family: sans-serif;
  2753. font-size: 12px;
  2754. padding: 10px;
  2755. display: inline-block;
  2756. background-color: #ddd;
  2757. position: fixed;
  2758. width: 400px;
  2759. left: 270px;
  2760. top: 10%;
  2761. }
  2762. .cdmContainer .title {
  2763. font-weight: bold;
  2764. font-size: 14px;
  2765. }
  2766. .cdmContainer span {
  2767. display: block;
  2768. padding: 2px;
  2769. }
  2770. .lds-roller {
  2771. display: inline-block;
  2772. position: fixed;
  2773. width: 80px;
  2774. height: 80px;
  2775. left: 415px;
  2776. top: 50%;
  2777. z-index: 1000;
  2778. }
  2779. .lds-roller div {
  2780. animation: lds-roller 1.2s cubic-bezier(0.5, 0, 0.5, 1) infinite;
  2781. transform-origin: 40px 40px;
  2782. }
  2783. .lds-roller div:after {
  2784. content: " ";
  2785. display: block;
  2786. position: absolute;
  2787. width: 7px;
  2788. height: 7px;
  2789. border-radius: 50%;
  2790. background: #000;
  2791. margin: -4px 0 0 -4px;
  2792. }
  2793. .lds-roller div:nth-child(1) {
  2794. animation-delay: -0.036s;
  2795. }
  2796. .lds-roller div:nth-child(1):after {
  2797. top: 63px;
  2798. left: 63px;
  2799. }
  2800. .lds-roller div:nth-child(2) {
  2801. animation-delay: -0.072s;
  2802. }
  2803. .lds-roller div:nth-child(2):after {
  2804. top: 68px;
  2805. left: 56px;
  2806. }
  2807. .lds-roller div:nth-child(3) {
  2808. animation-delay: -0.108s;
  2809. }
  2810. .lds-roller div:nth-child(3):after {
  2811. top: 71px;
  2812. left: 48px;
  2813. }
  2814. .lds-roller div:nth-child(4) {
  2815. animation-delay: -0.144s;
  2816. }
  2817. .lds-roller div:nth-child(4):after {
  2818. top: 72px;
  2819. left: 40px;
  2820. }
  2821. .lds-roller div:nth-child(5) {
  2822. animation-delay: -0.18s;
  2823. }
  2824. .lds-roller div:nth-child(5):after {
  2825. top: 71px;
  2826. left: 32px;
  2827. }
  2828. .lds-roller div:nth-child(6) {
  2829. animation-delay: -0.216s;
  2830. }
  2831. .lds-roller div:nth-child(6):after {
  2832. top: 68px;
  2833. left: 24px;
  2834. }
  2835. .lds-roller div:nth-child(7) {
  2836. animation-delay: -0.252s;
  2837. }
  2838. .lds-roller div:nth-child(7):after {
  2839. top: 63px;
  2840. left: 17px;
  2841. }
  2842. .lds-roller div:nth-child(8) {
  2843. animation-delay: -0.288s;
  2844. }
  2845. .lds-roller div:nth-child(8):after {
  2846. top: 56px;
  2847. left: 12px;
  2848. }
  2849. @keyframes lds-roller {
  2850. 0% {
  2851. transform: rotate(0deg);
  2852. }
  2853. 100% {
  2854. transform: rotate(360deg);
  2855. }
  2856. }`;
  2857. var myStyle = document.createElement("style");
  2858. myStyle.setAttribute("type", "text/css");
  2859. myStyle.appendChild(document.createTextNode(myCSS));
  2860. document.body.appendChild(myStyle);
  2861.  
  2862. // HTML pour le loader
  2863. var loader = $("<div id=\"loader\" class=\"lds-roller\"><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div></div>");
  2864. $("#content").append(loader);
  2865. $("#loader").hide();
  2866.  
  2867. // HTML pour les CdM
  2868. var cdm = $("<div id=\"cdm\" class=\"cdmContainer\"></div>");
  2869. $("#content").append(cdm);
  2870. cdm.click(function(evt) {
  2871. evt.preventDefault();
  2872. $("#cdm").hide();
  2873. });
  2874. $("#cdm").hide();
  2875.  
  2876. const raceGobs = ["Musculeux", "Mentalo", "Nodef", "Trad Scion", "Vis Yonnair", "Zozo Giste"];
  2877. const monstreAMasquer = ["Lémure", "Sprigan", "Larbin démoniaque", "Plante Carnivore", "Abishaii Blanc", "Abishaii Bleu" , "Abishaii Noir ", "Abishaii Vert" , "Ame-en-peine" , "Pitimarmotte" , "Diablotin" ];
  2878. const ArbresAMasquer = ["Arbre"];
  2879. const suivants =["Créature mécanique", "Squelette", "Pierreux" , "Esprit-rôdeur" , "Zombi"];
  2880.  
  2881.  
  2882.  
  2883. //insere un lien vers GobMaps
  2884. (function() {
  2885. 'use strict';
  2886.  
  2887. // Fonction pour créer et insérer l'icône
  2888. function insertIcon() {
  2889. // Vérifier si l'icône existe déjà pour éviter les doublons
  2890. if (document.getElementById("gobmaps-icon")) {
  2891. console.log("Icône déjà insérée, arrêt.");
  2892. return;
  2893. }
  2894.  
  2895. // Créer un conteneur pour l'icône
  2896. const iconContainer = document.createElement("div");
  2897. iconContainer.id = "gobmaps-icon";
  2898. iconContainer.style.textAlign = "center";
  2899. iconContainer.style.margin = "0 0";
  2900. iconContainer.style.fontFamily = "Arial, sans-serif";
  2901.  
  2902. // Créer le lien avec l'icône
  2903. const link = document.createElement("a");
  2904. link.href = "https://gobmaps.rf.gd/carte.html";
  2905. link.title = "Aller sur GobMaps"; // Tooltip au survol
  2906. link.target = "_blank";
  2907.  
  2908. // Créer l'élément image
  2909. const icon = document.createElement("img");
  2910. icon.src = "https://i.ibb.co/tpnPvnYv/favicon.jpg";
  2911. icon.alt = "GobMaps";
  2912. icon.style.width = "32px"; // Ajustez la taille si nécessaire
  2913. icon.style.height = "26px";
  2914. icon.style.verticalAlign = "middle";
  2915.  
  2916. link.appendChild(icon);
  2917. iconContainer.appendChild(link);
  2918.  
  2919. // Trouver le bouton "Envoyer des PX"
  2920. const pxButton = document.querySelector('center input[type="BUTTON"][value="Envoyer des PX"]');
  2921.  
  2922. if (pxButton && pxButton.parentNode) {
  2923. console.log("Bouton 'Envoyer des PX' trouvé, insertion de l'icône après.");
  2924. // Insérer après le bouton "Envoyer des PX"
  2925. pxButton.parentNode.insertBefore(iconContainer, pxButton.nextSibling.nextSibling); // Passe après l'espace ( )
  2926. } else {
  2927. console.warn("Bouton 'Envoyer des PX' non trouvé.");
  2928. // Fallback : insérer dans #content
  2929. const contentDiv = document.getElementById("content");
  2930. if (contentDiv) {
  2931. console.log("Insertion de secours dans #content.");
  2932. contentDiv.appendChild(iconContainer);
  2933. } else {
  2934. console.warn("Aucun conteneur de secours (#content) trouvé.");
  2935. }
  2936. }
  2937. }
  2938.  
  2939. // Essayer d'insérer l'icône au chargement initial
  2940. document.addEventListener("DOMContentLoaded", () => {
  2941. console.log("DOM chargé, tentative d'insertion de l'icône.");
  2942. insertIcon();
  2943. });
  2944.  
  2945. // Observer les changements dans le DOM pour un chargement dynamique
  2946. const observer = new MutationObserver((mutations, obs) => {
  2947. console.log("Changement détecté dans le DOM, nouvelle tentative d'insertion.");
  2948. insertIcon();
  2949. // Arrêter l'observation si l'icône a été insérée
  2950. if (document.getElementById("gobmaps-icon")) {
  2951. obs.disconnect();
  2952. console.log("Icône insérée, observation arrêtée.");
  2953. }
  2954. });
  2955.  
  2956. observer.observe(document.body, { childList: true, subtree: true });
  2957. console.log("Observation du DOM démarrée.");
  2958. })();
  2959.  
  2960.  
  2961.  
  2962. /// Coloration des gobs
  2963. $.each(raceGobs, function(index, value) {
  2964. $('#TCREATURES > center > table > tbody > tr > td:contains("' + value + '")').parent().css("background-color","#ccccff");
  2965. });
  2966.  
  2967. // Coloration des suivants avec condition supplémentaire
  2968. $.each(suivants, function(index, value) {
  2969. $('#TCREATURES > center > table > tbody > tr > td:contains("' + value + '")').each(function() {
  2970. // Récupérez le texte de l'élément td contenant le lien
  2971. var texte = $(this).parent().find('td:eq(2)').text();
  2972. // Utilisez une expression régulière pour extraire le nombre entre parenthèses
  2973. var nombre = texte.match(/\((\d+)\)/);
  2974. // Vérifiez si le nombre extrait existe et est supérieur à 1000
  2975. if (nombre && parseInt(nombre[1]) < 1000000) {
  2976. // Coloration de l'élément parent de l'élément td
  2977. $(this).parent().css("background-color", "#ffadde");
  2978. }
  2979. });
  2980. });
  2981. //// Coloration des gros mobs et indication px
  2982. $("#TCREATURES > center > table > tbody > tr").each( function(){
  2983. var nValue = parseInt($(this).find('td').eq(8).text(), 10); // Obtenez la valeur de la colonne N
  2984. if (nValue === 0) {
  2985. $(this).css({
  2986. "font-style": "italic", // Appliquer le style italique à la ligne entière
  2987. "color": "grey" // Changer la couleur du texte en gris
  2988. });
  2989. $(this).find('td a').css("color", "grey"); // Changer la couleur du lien en gris
  2990. } else {
  2991. $(this).css({
  2992. "font-style": "normal", // Réinitialiser le style si la valeur de N n'est pas 0
  2993. "color": "black" // Réinitialiser la couleur du texte
  2994. });
  2995. $(this).find('td a').css("color", "blue"); // Réinitialiser la couleur du lien
  2996. }
  2997.  
  2998.  
  2999. var race = $(this).find('td').eq(4).text();
  3000. if (jQuery.inArray(race, raceGobs) < 0) {
  3001. var tdlevel = $(this).find('td');
  3002. var lvl = parseInt(tdlevel.eq(3).text(), 10);
  3003. if (isNaN(lvl)) return;
  3004. if (lvl > 39) {
  3005. $(this).css("background-color","#f55442")
  3006. } else if (lvl > 29) {
  3007. $(this).css("background-color","#f59c42")
  3008. } else if (lvl > 25) {
  3009. $(this).css("background-color","#f5b342")
  3010. }
  3011.  
  3012.  
  3013. var id = 0;
  3014. var infosMob = $(this).find('a:first').attr('href').match(/javascript:EMV\((\d+)\)/);
  3015. if (infosMob != null) {
  3016. id = parseInt(infosMob[1]);
  3017. if (id < 9999) {
  3018. // $(this).css("background-color", "#6fcf97"); // Green background for creatures with ID < 9999
  3019. $(this).find('td').eq(2).css("background-color", "#c791b1"); // Apply green background to the ID cell
  3020. }
  3021. }
  3022.  
  3023.  
  3024.  
  3025.  
  3026. /// création de tresorsData qui récup les trésors dans la vue et est utilisé dans les ordres des suivants
  3027. const tableauTresors = document.getElementById('TOBJETS');
  3028.  
  3029. if (tableauTresors) {
  3030. // Sélection des lignes du tableau
  3031. const lignes = tableauTresors.getElementsByTagName('tr');
  3032. const tresors = [];
  3033.  
  3034. // Parcours de chaque ligne du tableau
  3035. for (let i = 1; i < lignes.length; i++) {
  3036. const colonnes = lignes[i].getElementsByTagName('td');
  3037.  
  3038. // Extraction des données de chaque colonne
  3039. const distance = colonnes[0].textContent;
  3040. const reference = colonnes[1].textContent;
  3041. const nom = colonnes[2].textContent;
  3042. const x = colonnes[3].textContent;
  3043. const y = colonnes[4].textContent;
  3044. const n = colonnes[5].textContent;
  3045.  
  3046. // Stockage des données dans un objet
  3047. const tresorObj = {
  3048. distance,
  3049. reference,
  3050. nom,
  3051. x,
  3052. y,
  3053. n
  3054. };
  3055.  
  3056. // Ajout de l'objet à la liste des trésors
  3057. tresors.push(tresorObj);
  3058. }
  3059.  
  3060. // Stockage des trésors dans localStorage
  3061. localStorage.setItem('tresorsData', JSON.stringify(tresors));
  3062. }
  3063.  
  3064.  
  3065.  
  3066. /// Ajout de l'affichage d'une CDM au clic sur la race
  3067. $(this).find('td').eq(4).css("cursor", "pointer");
  3068. $(this).find('td').eq(4).click(function(evt) {
  3069. evt.preventDefault();
  3070.  
  3071. $("#loader").show();
  3072.  
  3073. var url = "https://gobzilla.incaworld.fr/cdm/"+race+"/"+lvl+"/"+id;
  3074. $.getJSON( url, function( data ) {
  3075. if (data["race"] != undefined) {
  3076. $("#loader").hide();
  3077. $("#cdm").html(
  3078. "<div class=\"title\">" + data["nom"] + (data["numMob"]?" (n° " + data["numMob"] + ")":"") + "</div>"
  3079. + "<p>Le monstre fait partie des : " + data["race"] + "</p>"
  3080. + "<span>Niveau moyen : " + data["niveau"] + "</span>"
  3081. + "<span>Points de Vie : entre " + data["pvMin"] + " à " + data["pvMax"] + "</span>"
  3082. + "<span>Dés d'Attaque : entre " + data["attMin"] + " et " + data["attMax"] + "</span>"
  3083. + "<span>Dés d'Esquive : entre " + data["esqMin"] + " et " + data["esqMax"] + "</span>"
  3084. + "<span>Dés de Dégât : entre " + data["degMin"] + " et " + data["degMax"] + "</span>"
  3085. + "<span>Dés de Régénération : entre " + data["regMin"] + " et " + data["regMax"] + "</span>"
  3086. + "<span>Perception : entre " + data["perMin"] + " et " + data["perMax"] + "</span>"
  3087. + "<span>Armure Physique : entre " + data["armurePhyMin"] + " et " + data["armurePhyMax"] + "</span>"
  3088. + "<span>Armure Magique : entre " + data["armureMagMin"] + " et " + data["armureMagMax"] + "</span>"
  3089. + "<span>Tour : entre " + data["tourMin"] + "h et " + data["tourMax"] + "h</span>"
  3090. + "<span>Pouvoir : " + data["pouvoir"] + "</span>"
  3091. + "<span>Créature volante : " + (data["vol"]?"Oui":"Non") + "</span>"
  3092. + "<span>Attaque à distance : " + (data["distance"]?"Oui":"Non") + "</span>"
  3093. + "<span>Nombre d'attaques : " + data["nbAttaques"] + "</span>"
  3094. + "<span>Comportement : " + data["comportement"] + "</span>"
  3095. + "<span>Intelligence : " + data["intelligence"] + "</span>"
  3096. + "<span>Vitesse : " + data["vitesse"] + "</span>"
  3097. + "<span>VLC : " + data["vlc"] + "</span>"
  3098. + "<span>" + data["magie"] + "</span></br>"
  3099. + "<b>Moyenne basée sur " + data["nbCdm"] + " CdM</b>");
  3100. } else {
  3101. $("#loader").hide();
  3102. $("#cdm").html("Pas de CDM en stock !");
  3103. }
  3104. $("#cdm").show();
  3105. });
  3106. });
  3107.  
  3108. if (lvlmeute != undefined) {
  3109. var px = Math.max(0, 20+2*(lvl-lvlmeute)+lvl);
  3110. tdlevel.prop('title', px + "px");
  3111. } else {
  3112. tdlevel.prop('title', "Merci de visiter la page meute pour charger le niveau");
  3113. }
  3114. }
  3115. });
  3116.  
  3117.  
  3118. //// fonction filtre creatures dans la vue
  3119. (function() {
  3120. 'use strict';
  3121.  
  3122. const table = document.querySelector('#TCREATURES table');
  3123.  
  3124. if (table) {
  3125. const headers = table.querySelectorAll('th');
  3126.  
  3127. headers.forEach(header => {
  3128. if (!header.hasAttribute('colspan')) {
  3129. header.style.cursor = 'pointer';
  3130.  
  3131. const arrowUp = document.createElement('span');
  3132. arrowUp.textContent = ' ▲';
  3133. arrowUp.className = 'sortIndicator';
  3134. arrowUp.style.display = 'none';
  3135.  
  3136. const arrowDown = document.createElement('span');
  3137. arrowDown.textContent = ' ▼';
  3138. arrowDown.className = 'sortIndicator';
  3139. arrowDown.style.display = 'none';
  3140.  
  3141. header.appendChild(arrowUp);
  3142. header.appendChild(arrowDown);
  3143.  
  3144. let ascending = false;
  3145.  
  3146. // Utilisation de l'attribut title pour l'infobulle
  3147. header.title = "Cliquer pour classer dans l'ordre";
  3148.  
  3149. header.addEventListener('click', () => {
  3150. // reset sort indicators
  3151. $(".sortIndicator").css("display", 'none');
  3152.  
  3153. const headerIndex = Array.from(headers).indexOf(header);
  3154. let rows = Array.from(table.querySelectorAll('tbody tr'));
  3155.  
  3156. rows.sort((a, b) => {
  3157. const aValue = a.cells[headerIndex].textContent.trim();
  3158. const bValue = b.cells[headerIndex].textContent.trim();
  3159.  
  3160. // La 1ère ligne est toujours en haut
  3161. if (a.cells[0].textContent.trim().match("^Dist.")) return -1;
  3162.  
  3163. let result = aValue.localeCompare(bValue, undefined, { numeric: true });
  3164.  
  3165. if (!ascending) {
  3166. result *= -1;
  3167. }
  3168.  
  3169. return result;
  3170. });
  3171.  
  3172. ascending = !ascending;
  3173.  
  3174. arrowUp.style.display = ascending ? 'none' : 'inline-block';
  3175. arrowDown.style.display = ascending ? 'inline-block' : 'none';
  3176.  
  3177. table.querySelector('tbody').innerHTML = '';
  3178. rows.forEach(row => table.querySelector('tbody').appendChild(row));
  3179. });
  3180. }
  3181. });
  3182. }
  3183. })();
  3184.  
  3185.  
  3186. //// fonction filtre trésors dans la vue
  3187. (function() {
  3188. 'use strict';
  3189.  
  3190. const table = document.querySelector('#TOBJETS table');
  3191.  
  3192. if (table) {
  3193. const headers = table.querySelectorAll('th');
  3194.  
  3195. headers.forEach(header => {
  3196. if (!header.hasAttribute('colspan')) {
  3197. header.style.cursor = 'pointer';
  3198.  
  3199. const arrowUp = document.createElement('span');
  3200. arrowUp.textContent = ' ▲';
  3201. arrowUp.className = 'sortIndicator';
  3202. arrowUp.style.display = 'none';
  3203.  
  3204. const arrowDown = document.createElement('span');
  3205. arrowDown.textContent = ' ▼';
  3206. arrowDown.className = 'sortIndicator';
  3207. arrowDown.style.display = 'none';
  3208.  
  3209. header.appendChild(arrowUp);
  3210. header.appendChild(arrowDown);
  3211.  
  3212. let ascending = false;
  3213.  
  3214. // Utilisation de l'attribut title pour l'infobulle
  3215. header.title = "Cliquer pour classer dans l'ordre";
  3216.  
  3217. header.addEventListener('click', () => {
  3218. // reset sort indicators
  3219. $(".sortIndicator").css("display", 'none');
  3220.  
  3221. const headerIndex = Array.from(headers).indexOf(header);
  3222. let rows = Array.from(table.querySelectorAll('tbody tr'));
  3223.  
  3224. rows.sort((a, b) => {
  3225. const aValue = a.cells[headerIndex].textContent.trim();
  3226. const bValue = b.cells[headerIndex].textContent.trim();
  3227.  
  3228. // La 1ère ligne est toujours en haut
  3229. if (a.cells[0].textContent.trim().match("^Dist.")) return -1;
  3230.  
  3231. let result = aValue.localeCompare(bValue, undefined, { numeric: true });
  3232.  
  3233. if (!ascending) {
  3234. result *= -1;
  3235. }
  3236.  
  3237. return result;
  3238. });
  3239.  
  3240. ascending = !ascending;
  3241.  
  3242. arrowUp.style.display = ascending ? 'none' : 'inline-block';
  3243. arrowDown.style.display = ascending ? 'inline-block' : 'none';
  3244.  
  3245. table.querySelector('tbody').innerHTML = '';
  3246. rows.forEach(row => table.querySelector('tbody').appendChild(row));
  3247. });
  3248. }
  3249. });
  3250. }
  3251. })();
  3252.  
  3253.  
  3254.  
  3255. //// fonction filtre plantes dans la vue
  3256. (function() {
  3257. 'use strict';
  3258.  
  3259. const table = document.querySelector('#TPLANTS table');
  3260.  
  3261. if (table) {
  3262. const headers = table.querySelectorAll('th');
  3263.  
  3264. headers.forEach(header => {
  3265. if (!header.hasAttribute('colspan')) {
  3266. header.style.cursor = 'pointer';
  3267.  
  3268. const arrowUp = document.createElement('span');
  3269. arrowUp.textContent = ' ▲';
  3270. arrowUp.className = 'sortIndicator';
  3271. arrowUp.style.display = 'none';
  3272.  
  3273. const arrowDown = document.createElement('span');
  3274. arrowDown.textContent = ' ▼';
  3275. arrowDown.className = 'sortIndicator';
  3276. arrowDown.style.display = 'none';
  3277.  
  3278. header.appendChild(arrowUp);
  3279. header.appendChild(arrowDown);
  3280.  
  3281. let ascending = false;
  3282.  
  3283. header.addEventListener('click', () => {
  3284. // reset sort indicators
  3285. $(".sortIndicator").css("display", 'none');
  3286.  
  3287. const headerIndex = Array.from(headers).indexOf(header);
  3288. let rows = Array.from(table.querySelectorAll('tbody tr'));
  3289.  
  3290. rows.sort((a, b) => {
  3291. const aValue = a.cells[headerIndex].textContent.trim();
  3292. const bValue = b.cells[headerIndex].textContent.trim();
  3293.  
  3294. // La 1ère ligne est toujours en haut
  3295. if (a.cells[0].textContent.trim().match("^Dist.")) return -1;
  3296.  
  3297. let result = aValue.localeCompare(bValue, undefined, { numeric: true });
  3298.  
  3299. if (!ascending) {
  3300. result *= -1;
  3301. }
  3302.  
  3303. return result;
  3304. });
  3305.  
  3306. ascending = !ascending;
  3307.  
  3308. arrowUp.style.display = ascending ? 'none' : 'inline-block';
  3309. arrowDown.style.display = ascending ? 'inline-block' : 'none';
  3310.  
  3311. table.querySelector('tbody').innerHTML = '';
  3312. rows.forEach(row => table.querySelector('tbody').appendChild(row));
  3313. });
  3314. }
  3315. });
  3316. }
  3317. })();
  3318.  
  3319.  
  3320.  
  3321.  
  3322.  
  3323. //// compteur de créatures
  3324. (function() {
  3325. 'use strict';
  3326.  
  3327. function updateRowCount() {
  3328. var table = document.getElementById("TCREATURES");
  3329. var rowCount = table.getElementsByTagName("tr").length - 1;
  3330. $('a[name="CREATURES"]').next().html("Créatures (" + rowCount + " visibles)");
  3331. }
  3332.  
  3333. var observer = new MutationObserver(updateRowCount);
  3334. var target = document.querySelector("#TCREATURES tbody");
  3335. var config = { childList: true, subtree: true };
  3336. observer.observe(target, config);
  3337.  
  3338. updateRowCount();
  3339. })();
  3340.  
  3341.  
  3342.  
  3343.  
  3344. var show2DChecked = window.localStorage.getItem('show2DChecked');
  3345. var displayLieuxChecked = window.localStorage.getItem('displayLieuxChecked');
  3346. var displayPlantesChecked = window.localStorage.getItem('displayPlantesChecked');
  3347. var displayCdmNeeded = window.localStorage.getItem('displayCdmNeededChecked');
  3348. var displayCuisine = window.localStorage.getItem('displayCuisineChecked');
  3349. var displayMiniMobs = window.localStorage.getItem('displayMiniMobs');
  3350. var displayTrees = window.localStorage.getItem('displayTreesChecked');
  3351. var displayFullWidth = window.localStorage.getItem('displayFullWidthChecked');
  3352. var vue2DBuilt = false;
  3353. var extendedLieuxBuilt = false;
  3354. var extendedPlantesBuilt = false;
  3355. var R;
  3356.  
  3357.  
  3358.  
  3359. function showHideVue2d() {
  3360. if($('#ckbDisplay2D').is(":checked")) {
  3361. window.localStorage.setItem('show2DChecked', 1);
  3362. if (!vue2DBuilt) build2DView();
  3363. $("#vue2D").show();
  3364. $("#filterDiv").show();
  3365. } else {
  3366. window.localStorage.setItem('show2DChecked', 0);
  3367. $("#vue2D").hide();
  3368. $("#filterDiv").hide();
  3369. }
  3370. }
  3371.  
  3372.  
  3373. function showHideExtendedLieux() {
  3374. if($('#ckbDisplayLieux').is(":checked")) {
  3375. window.localStorage.setItem('displayLieuxChecked', 1);
  3376. if (!extendedLieuxBuilt) buildExtendedLieux();
  3377. $(".extendedLieu").show();
  3378. } else {
  3379. window.localStorage.setItem('displayLieuxChecked', 0);
  3380. $(".extendedLieu").hide();
  3381. }
  3382. }
  3383.  
  3384.  
  3385. function showHideExtendedPlantes() {
  3386. if($('#ckbDisplayPlantes').is(":checked")) {
  3387. window.localStorage.setItem('displayPlantesChecked', 1);
  3388. if (!extendedPlantesBuilt) buildExtendedPlantes();
  3389. $(".extendedPlante").show();
  3390. } else {
  3391. window.localStorage.setItem('displayPlantesChecked', 0);
  3392. $(".extendedPlante").hide();
  3393. }
  3394. }
  3395.  
  3396.  
  3397. function refreshCdmNeeded() {
  3398. $("#loader").show();
  3399. var urlCdMNeeded = "https://gobzilla.incaworld.fr/mobs/cdm/5";
  3400. $.getJSON( urlCdMNeeded, function( data ) {
  3401. if (data != undefined) {
  3402. window.localStorage.setItem('cdmNeeded', data.monstres);
  3403. window.localStorage.setItem('cdmNeededUpdate', new Date());
  3404. }
  3405. $("#loader").hide();
  3406. });
  3407. }
  3408.  
  3409. function showHideCdmNeeded() {
  3410. if($('#ckbDisplayCdmNeeded').is(":checked")) {
  3411. window.localStorage.setItem('displayCdmNeededChecked', 1);
  3412. var cdmNeededUpdate = new Date(window.localStorage.getItem('cdmNeededUpdate'));
  3413. var delta = (new Date() - cdmNeededUpdate)/1000/60/60/24;
  3414. if (delta > 5) {
  3415. refreshCdmNeeded();
  3416. }
  3417. var cdmNeeded = window.localStorage.getItem('cdmNeeded');
  3418. $.each(cdmNeeded.split(","), function(index, value) {
  3419. $('#TCREATURES td:contains("' + value + '")').closest('tr').find('td:eq(5)').text("CdM manquante !");
  3420. });
  3421. } else {
  3422. window.localStorage.setItem('displayCdmNeededChecked', 0);
  3423. $(".cdmNeeded").removeClass("cdmNeeded");
  3424. $('#TCREATURES td:contains("CdM manquante !")').text("");
  3425. }
  3426. }
  3427.  
  3428. function refreshCuisine() {
  3429. $("#loader").show();
  3430. var urlCuisine = "https://gobzilla.incaworld.fr/mobs/insecte";
  3431. $.getJSON( urlCuisine, function( data ) {
  3432. if (data != undefined) {
  3433. window.localStorage.setItem('cuisine', data.monstres);
  3434. window.localStorage.setItem('cuisineUpdate', new Date());
  3435. }
  3436. $("#loader").hide();
  3437. });
  3438. }
  3439.  
  3440. function showHideCuisine() {
  3441. if($('#ckbDisplayCuisine').is(":checked")) {
  3442. window.localStorage.setItem('displayCuisineChecked', 1);
  3443. var cuisineUpdate = new Date(window.localStorage.getItem('cuisineUpdate'));
  3444. var delta = (new Date() - cuisineUpdate)/1000/60/60/24;
  3445. if (delta > 30) {
  3446. refreshCuisine();
  3447. }
  3448. var cuisine = window.localStorage.getItem('cuisine');
  3449. $.each(cuisine.split(","), function(index, value) {
  3450. $('#TCREATURES td:contains("' + value + '")').parent().addClass("cuisine");
  3451. });
  3452. } else {
  3453. window.localStorage.setItem('displayCuisineChecked', 0);
  3454. $(".cuisine").removeClass("cuisine");
  3455. }
  3456. }
  3457.  
  3458. function showHideMiniMobs() {
  3459. if ($('#ckbDisplayMiniMobs').is(":checked")) {
  3460. window.localStorage.setItem('displayMiniMobs', 1);
  3461. // Suppression des mobs trop nombreux
  3462. $.each(monstreAMasquer, function(index, value) {
  3463. $('#TCREATURES > center > table > tbody > tr > td:contains("' + value + '")').each(function() {
  3464. var chiffre = parseInt($(this).parent().find('td:first').text());
  3465. if (chiffre < 2) {
  3466. $(this).parent().show();
  3467. } else {
  3468. $(this).parent().hide();
  3469. }
  3470. });
  3471. });
  3472. } else {
  3473. window.localStorage.setItem('displayMiniMobs', 0);
  3474. // Affichage de tous les mobs
  3475. $.each(monstreAMasquer, function(index, value) {
  3476. $('#TCREATURES > center > table > tbody > tr > td:contains("' + value + '")').parent().show();
  3477. });
  3478. }
  3479. }
  3480.  
  3481. function showHideTrees() {
  3482. if($('#ckbDisplayTrees').is(":checked")) {
  3483. window.localStorage.setItem('displayTreesChecked', 1);
  3484. // Suppression des arbres
  3485. $.each(ArbresAMasquer, function(index, value) {
  3486. $('#TLIEUX > center > table > tbody > tr > td:contains("' + value + '")').parent().hide();
  3487. });
  3488. } else {
  3489. window.localStorage.setItem('displayTreesChecked', 0);
  3490. $.each(ArbresAMasquer, function(index, value) {
  3491. $('#TLIEUX > center > table > tbody > tr > td:contains("' + value + '")').parent().show();
  3492. });
  3493. }
  3494. }
  3495.  
  3496. function showVueFullWidth() {
  3497. if($('#ckbDisplayFullWidth').is(":checked")) {
  3498. window.localStorage.setItem('displayFullWidthChecked', 1);
  3499. // Vue en pleine largeur
  3500. } else {
  3501. window.localStorage.setItem('displayFullWidthChecked', 0);
  3502. // Vue normale
  3503. }
  3504. }
  3505.  
  3506.  
  3507.  
  3508. function refreshListes() {
  3509. refreshCuisine();
  3510. showHideCuisine();
  3511. refreshCdmNeeded();
  3512. showHideCdmNeeded();
  3513. }
  3514.  
  3515. // Après chargement de la page, lancement des enhancements
  3516. $( document ).ready(function() {
  3517.  
  3518. // Full width
  3519. if (displayFullWidth == 1) {
  3520. $('#ckbDisplayFullWidth').prop( "checked", displayFullWidth );
  3521. }
  3522. showVueFullWidth();
  3523.  
  3524. // Mini mobs
  3525. if (displayMiniMobs == 1) {
  3526. $('#ckbDisplayMiniMobs').prop( "checked", displayMiniMobs );
  3527. }
  3528. showHideMiniMobs();
  3529.  
  3530. // showhide trees
  3531. if (displayTrees == 1) {
  3532. $('#ckbDisplayTrees').prop( "checked", displayTrees );
  3533. }
  3534. showHideTrees();
  3535.  
  3536.  
  3537.  
  3538. // Liste des lieux étendue
  3539. if (displayLieuxChecked == 1) {
  3540. $('#ckbDisplayLieux').prop( "checked", displayLieuxChecked );
  3541. }
  3542. showHideExtendedLieux();
  3543.  
  3544.  
  3545. //Liste des plantes étendue
  3546. if (displayPlantesChecked == 1) {
  3547. $('#ckbDisplayPlantes').prop( "checked", displayPlantesChecked );
  3548. }
  3549. showHideExtendedPlantes();
  3550.  
  3551. // Vue 2D
  3552. if (show2DChecked == 1) {
  3553. $('#ckbDisplay2D').prop( "checked", show2DChecked );
  3554. }
  3555. showHideVue2d();
  3556.  
  3557.  
  3558. // CdM manquantes
  3559. if (displayCdmNeeded == 1) {
  3560. $('#ckbDisplayCdmNeeded').prop( "checked", displayCdmNeeded );
  3561. }
  3562. showHideCdmNeeded();
  3563.  
  3564. // A cuisiner
  3565. if (displayCuisine == 1) {
  3566. $('#ckbDisplayCuisine').prop( "checked", displayCuisine );
  3567. }
  3568. showHideCuisine();
  3569.  
  3570. $('#btnRefresh').click(function(evt) {
  3571. evt.preventDefault();
  3572. $("#btnRefresh").val("...");
  3573. refreshListes();
  3574. $("#btnRefresh").val("Done !");
  3575. });
  3576.  
  3577. });
  3578.  
  3579. var cells = {};
  3580. var niveau = 0;
  3581. var _X=0, _Y=0, _N=0;
  3582.  
  3583. var div = $("<div id=\"vue2D\"></div>");
  3584. div.insertBefore($("form[action*='newMail.php']"));
  3585.  
  3586.  
  3587. //=======================================================================
  3588. // Filters
  3589. //=======================================================================
  3590. var prediv = $("<div id=\"preFilter\"></div>");
  3591. prediv.css({
  3592. 'background-color': 'gainsboro', // Couleur de fond sombre
  3593. 'border': '2px solid black', // Bordure noire
  3594. 'padding': '10px', // Espacement intérieur
  3595. 'margin': '10px' // Marge extérieure
  3596. });
  3597.  
  3598.  
  3599. var select = document.createElement('select');
  3600. select.id = 'lvlherbo';
  3601. select.innerHTML = `
  3602. <option value="1.5">A</option>
  3603. <option value="2">C</option>
  3604. <option value="2.5">M</option>
  3605. <option value="3">GM</option>`;
  3606. prediv.append(select);
  3607. prediv.append("</br>");
  3608. prediv.insertBefore(div);
  3609. prediv.append($('<label />', { 'for': 'ckbDisplay2D', text: 'Vue 2D', title: 'affiche une vue 2d des éléments qui vous entoure' }));
  3610. prediv.append($("<input type=\"checkbox\" id=\"ckbDisplay2D\" title=\"affiche une vue 2d des éléments qui vous entoure\" name=\"ckbDisplay2D\" class=\"ckbFilter\" >"));
  3611. prediv.append($('<label />', { 'for': 'ckbDisplayLieux', text: ' Lieux étendus', title: 'affiche tous les lieux déja connus hors de votre vue' }));
  3612. prediv.append($("<input type=\"checkbox\" id=\"ckbDisplayLieux\" title=\"affiche tous les lieux déja connus hors de votre vue\" name=\"ckbDisplayLieux\" class=\"ckbFilter\" >"));
  3613. prediv.append($('<label />', { 'for': 'ckbDisplayPlantes', text: ' Plantes étendues', title: 'affiche toutes les plantes déja connues hors de votre vue, selectionner votre niveau herboriste, il sera enregistré' }));
  3614. prediv.append($("<input type=\"checkbox\" id=\"ckbDisplayPlantes\" title=\"affiche toutes les plantes déja connues hors de votre vue\" name=\"ckbDisplayPlantes\" class=\"ckbFilter\" >"));
  3615. prediv.append($('<label />', { 'for': 'ckbDisplayCdmNeeded', text: ' CdM manquantes', title: 'permet de savoir quel monstres sont manquants dans la base de données des CdM' }));
  3616. prediv.append($("<input type=\"checkbox\" id=\"ckbDisplayCdmNeeded\" title=\"permet de savoir quel monstres sont manquants dans la base de données des CdM\" name=\"ckbDisplayCdmNeeded\" class=\"ckbFilter\" >"));
  3617. prediv.append($('<label />', { 'for': 'ckbDisplayCuisine', text: ' Mobs à cuisiner', title: 'met en surbrillance les monstres les + efficaces pour la cuisine' }));
  3618. prediv.append($("<input type=\"checkbox\" id=\"ckbDisplayCuisine\" title=\"met en surbrillance les monstres les + efficaces pour la cuisine\" name=\"ckbDisplayCuisine\" class=\"ckbFilter\" >"));
  3619. prediv.append("</br>");
  3620. prediv.append($('<label />', { 'for': 'ckbDisplayMiniMobs', text: ' Assainir la vue', title: 'Enlever de la vue (sauf a moins de 2 cases) tous les petits monstres qui poluent la vue' }));
  3621. prediv.append($("<input type=\"checkbox\" id=\"ckbDisplayMiniMobs\" title=\"masquer les tout petits monstres (lémures, larbins ..)\" name=\"ckbDisplayMiniMobs\" class=\"ckbFilter\" >"));
  3622. prediv.append($('<label />', { 'for': 'ckbDisplayTrees', text: ' Masquer Arbres.', title: 'masque les arbres' }));
  3623. prediv.append($("<input type=\"checkbox\" id=\"ckbDisplayTrees\" title=\"masque les arbres\" name=\"ckbDisplayTrees\" class=\"ckbFilter\" >"));
  3624. prediv.append($('<label />', { 'for': 'ckbDisplayFullWidth', text: ' Vue pleine largeur', title: 'pour les grandes vue. Permet d élargir la vue 2d pour une meilleure visualisation' }));
  3625. prediv.append($("<input type=\"checkbox\" id=\"ckbDisplayFullWidth\" title=\"pour les grandes vue. Permet d'élargir la vue 2d pour une meilleure visualisation\" name=\"ckbDisplayFullWidth\" class=\"ckbFilter\" >"));
  3626. prediv.append("</br>");
  3627. prediv.append($('<label />', { 'for': 'monsterLevelMin', text: 'Filtrer Lvl ', title: 'Filtrer les monstres par niveau' }));
  3628. var levelInputMin = $("<input type='number' id='monsterLevelMin' placeholder='Min' min='0' max='100' style='width: 60px;'>");
  3629. prediv.append(levelInputMin);
  3630. var levelInputMax = $("<input type='number' id='monsterLevelMax' placeholder='Max' min='0' max='100' style='width: 60px;'>");
  3631. prediv.append(levelInputMax);
  3632. var filterButton = $("<button id='applyFilter'>Filtrer</button>");
  3633. prediv.append(filterButton);
  3634. prediv.append("</br>");
  3635. prediv.append("</br>");
  3636. prediv.append($("<input type=\"button\" id=\"btnRefresh\" name=\"btnRefresh\" value=\"Rafraîchir les listes\">"));
  3637. prediv.append("</br>");
  3638. prediv.append($('<label />', { 'for': 'ckbFetchCSV', text: ' Vue DeathMetal', title: 'profitez de la vue de DeathMetal. Attention, utiliser avec parcimonie !' }));
  3639. prediv.append($("<input type=\"checkbox\" id=\"ckbFetchCSV\" title=\"cliquez pour faire apparaitre la vue ici. Pour l'enlever, décocher et rafraichir la page. Attention, NE PAS ABUSER (max 1 fois par jour)\" name=\"ckbFetchCSV\" class=\"ckbFilter\" >"));
  3640.  
  3641.  
  3642. // filtres de la vue 2d
  3643. var filterDiv = $("<div id=\"filterDiv\"></div>");
  3644. filterDiv.insertBefore(div);
  3645. filterDiv.append($('<label />', { 'for': 'ckbNiveau', text: 'Même niveau' }));
  3646. filterDiv.append($("<input type=\"checkbox\" id=\"ckbNiveau\" name=\"ckbNiveau\" class=\"ckbFilter\" >"));
  3647. filterDiv.append($('<label />', { 'for': 'ckbObject', text: 'Trésor' }));
  3648. filterDiv.append($("<input type=\"checkbox\" id=\"ckbObject\" name=\"ckbObject\" class=\"ckbFilter\" checked=\"checked\" >"));
  3649. filterDiv.append($('<label />', { 'for': 'ckbMonster', text: 'Monstre' }));
  3650. filterDiv.append($("<input type=\"checkbox\" id=\"ckbMonster\" name=\"ckbMonster\" class=\"ckbFilter\" checked=\"checked\" >"));
  3651. filterDiv.append($('<label />', { 'for': 'ckbPlant', text: 'Plante' }));
  3652. filterDiv.append($("<input type=\"checkbox\" id=\"ckbplants\" name=\"ckbplants\" class=\"ckbFilter\" checked=\"checked\" >"));
  3653. filterDiv.append($('<label />', { 'for': 'ckbPlace', text: 'Lieu' }));
  3654. filterDiv.append($("<input type=\"checkbox\" id=\"ckbPlace\" name=\"ckbPlace\" class=\"ckbFilter\" checked=\"checked\" >"));
  3655. filterDiv.append($('<label />', { 'for': 'ckbBigMonsters', text: 'Gros monstres', title: 'afficher que les monstres sup à 40' }));
  3656. filterDiv.append($("<input type=\"checkbox\" id=\"ckbBigMonsters\" name=\"ckbBigMonsters\" class=\"ckbFilter\" >"));
  3657.  
  3658.  
  3659. //=======================================================================
  3660. // Filtre Herbo
  3661. //=======================================================================
  3662.  
  3663. // Cache initialement le niveau herbo
  3664. select.style.display = 'none';
  3665.  
  3666. // Fonction pour contrôler la visibilité du niveau herbo
  3667. function toggleLvlHerboVisibility() {
  3668.  
  3669. if ($('#ckbDisplayPlantes').is(':checked')) {
  3670. select.style.display = 'block';
  3671. $('#lvlherbo').css('display', 'inline-block');
  3672. } else {
  3673. select.style.display = 'none';
  3674. $('#lvlherbo').css('display', 'none');
  3675. }
  3676. }
  3677.  
  3678. $('#ckbDisplayPlantes').change(function() {
  3679. toggleLvlHerboVisibility();
  3680. });
  3681.  
  3682. toggleLvlHerboVisibility();
  3683.  
  3684.  
  3685.  
  3686. //=======================================================================
  3687. // Fonction pour filtrer les monstres dans le tableau et la vue 2D
  3688. //=======================================================================
  3689. function applyMonsterFilter(minLevel, maxLevel) {
  3690. // Filtrer dans le tableau seulement si minLevel et maxLevel sont spécifiés
  3691. if (!isNaN(minLevel) && !isNaN(maxLevel)) {
  3692. $("#TCREATURES > center > table > tbody > tr").each(function() {
  3693. var tdLevel = $(this).find('td').eq(3);
  3694. var lvl = parseInt(tdLevel.text(), 10);
  3695. if (!isNaN(lvl)) {
  3696. if (lvl >= minLevel && lvl <= maxLevel) {
  3697. $(this).show();
  3698. } else {
  3699. $(this).hide();
  3700. }
  3701. }
  3702. });
  3703. } else {
  3704. // Si minLevel ou maxLevel n'est pas spécifié, afficher tous les éléments
  3705. showHideMiniMobs();
  3706. }
  3707.  
  3708. // Sauvegarder les valeurs dans le localStorage
  3709. localStorage.setItem('monsterLevelMin', minLevel);
  3710. localStorage.setItem('monsterLevelMax', maxLevel);
  3711. }
  3712.  
  3713. // Charger les valeurs depuis le localStorage et appliquer le filtre au chargement de la page
  3714. $(document).ready(function() {
  3715. var savedMinLevel = localStorage.getItem('monsterLevelMin');
  3716. var savedMaxLevel = localStorage.getItem('monsterLevelMax');
  3717.  
  3718. if (savedMinLevel !== null && savedMaxLevel !== null) {
  3719. levelInputMin.val(savedMinLevel);
  3720. levelInputMax.val(savedMaxLevel);
  3721. applyMonsterFilter(parseInt(savedMinLevel, 10), parseInt(savedMaxLevel, 10));
  3722. }
  3723.  
  3724. });
  3725.  
  3726. // Gestion du clic sur le bouton de filtrage
  3727. filterButton.on('click', function() {
  3728. var minLevel = parseInt(levelInputMin.val(), 10);
  3729. var maxLevel = parseInt(levelInputMax.val(), 10);
  3730. applyMonsterFilter(minLevel, maxLevel);
  3731. });
  3732.  
  3733.  
  3734. //=======================================================================
  3735. /// masquer via une petite fleche tout ce beau monde
  3736. //=======================================================================
  3737.  
  3738. var isPreFilterVisible = localStorage.getItem('isPreFilterVisible') === 'true'; // Lire l'état depuis localStorage
  3739. // Créez un div contenant la flèche pour afficher/masquer preFilter
  3740. var toggleDiv = $("<div id=\"togglePreFilter\" style=\"cursor: pointer; font-size: 10px; color: black;\">▼ Ouvrir les Filtres</div>");
  3741. // Ajoutez le div avant prediv
  3742. toggleDiv.insertBefore(prediv);
  3743. // Fonction pour mettre à jour l'état et le texte du div
  3744. function updateToggleDiv() {
  3745. if (isPreFilterVisible) {
  3746. prediv.show(); // Afficher preFilter
  3747. toggleDiv.html('▼ Masquer les filtres'); // Affiche la flèche vers le bas (▼)
  3748. } else {
  3749. prediv.hide(); // Masquer preFilter
  3750. toggleDiv.html('&#9658; Ouvrir les filtres'); // Affiche la flèche de droite (→)
  3751. }
  3752. }
  3753.  
  3754. // Définissez un gestionnaire d'événements pour le div
  3755. toggleDiv.on('click', function() {
  3756. isPreFilterVisible = !isPreFilterVisible; // Inverse l'état
  3757. updateToggleDiv();
  3758. // Sauvegarde l'état dans localStorage
  3759. localStorage.setItem('isPreFilterVisible', isPreFilterVisible);
  3760. });
  3761.  
  3762. // Assurez-vous que preFilter est initialement visible
  3763. updateToggleDiv();
  3764.  
  3765.  
  3766.  
  3767. //=======================================================================
  3768. // Construction de la liste étendue des lieux sur la base d'une API externe
  3769. //=======================================================================
  3770. function buildExtendedLieux() {
  3771. var reflieux = new Array();
  3772. $("#TLIEUX > table > tbody > tr").each( function(){
  3773. reflieux.push($(this).find('td').eq(1).text());
  3774. });
  3775.  
  3776. var url = "https://gobzilla.incaworld.fr/lieux/"+_X+"/"+_Y+"/"+_N;
  3777. $.getJSON( url, function( data ) {
  3778. // alert(JSON.stringify(data));
  3779. $.each( data, function( key, val ) {
  3780. if (( reflieux.indexOf(val["id"]) == -1 ) && (val["id"] !== -1))
  3781. {
  3782. var row = "<tr bgcolor=\"#E0E0E0\" class=\"extendedLieu\"><td>" + val["distance"] ;
  3783. row += "</td><td>" + val["id"] ;
  3784. row += "</td><td>" + val["nom"] ;
  3785. row += "</td><td>" + val["type"] ;
  3786. row += "</td><td>" + val["x"] ;
  3787. row += "</td><td>" + val["y"] ;
  3788. row += "</td><td>" + val["z"] ;
  3789. row += "</td></tr>";
  3790. $(row).insertAfter("#TLIEUX table tr:last");
  3791. }
  3792. });
  3793. });
  3794.  
  3795. extendedLieuxBuilt = true;
  3796. }
  3797.  
  3798.  
  3799. //=======================================================================
  3800. // Construction de la liste étendue des plantes sur la base d'une API externe
  3801. //=======================================================================
  3802. var text = $("ul:contains('Ma vue peut porter')").text();
  3803. var matches = text.match(/Ma vue peut porter à (\d+) cases horizontalement et (\d+) verticalement/);
  3804.  
  3805. if (matches) {
  3806. var perh = matches[1]; // PER max (X Y)
  3807. var perv = matches[2]; // PER max (N)
  3808. var herbomax = perh * 1.5;
  3809. var herbomin = +perh +1;
  3810.  
  3811. // Récupérez la liste déroulante
  3812. var lvlherbo = $('#lvlherbo');
  3813.  
  3814. // Ajoutez un gestionnaire d'événements pour écouter les changements de la liste déroulante
  3815. lvlherbo.on('change', function() {
  3816. var xfactor = parseFloat(lvlherbo.val()); // Obtenez la valeur sélectionnée en tant que nombre
  3817. var herbomax = perh * xfactor;
  3818. var herbomin = +perh + 1;
  3819. window.localStorage.setItem('xfactor', xfactor);
  3820. window.localStorage.setItem('herbomax', herbomax);
  3821. console.log("Nouvelle valeur de herbomax : " + herbomax);
  3822. console.log("Nouvelle valeur de herbomin : " + herbomin);
  3823. });
  3824.  
  3825. // Lorsque la page est chargée, vérifiez s'il y a des valeurs précédemment enregistrées et utilisez-les si elles existent
  3826. var storedXFactor = window.localStorage.getItem('xfactor');
  3827. var storedHerboMax = window.localStorage.getItem('herbomax');
  3828.  
  3829. if (storedXFactor) {
  3830. lvlherbo.val(storedXFactor); // Mettez à jour la liste déroulante avec la valeur précédemment enregistrée
  3831. }
  3832.  
  3833. if (storedHerboMax) {
  3834. // Utilisez la valeur précédemment enregistrée pour herbomax
  3835. herbomax = parseFloat(storedHerboMax);
  3836. console.log("Utilisation de la valeur précédemment enregistrée pour herbomax : " + herbomax);
  3837. }
  3838.  
  3839. console.log("portée herboriser: " + herbomax);
  3840. console.log("limite mini d'herboriser: " + herbomin);
  3841. } else {
  3842. console.log("Aucune correspondance trouvée.");
  3843. }
  3844.  
  3845. function buildExtendedPlantes() {
  3846. var refplantes = new Array();
  3847. $("#TPLANTS> table > tbody > tr").each(function() {
  3848. refplantes.push($(this).find('td').eq(1).text());
  3849. });
  3850.  
  3851. var url = "https://gobzilla.incaworld.fr/plantes";
  3852. $.ajaxSetup({
  3853. async: false
  3854. });
  3855. $.getJSON(url, function(data) {
  3856. // alert(JSON.stringify(data));
  3857. $.each(data, function(key, val) {
  3858. var dist = Math.max(
  3859. Math.abs(val["x"] - _X),
  3860. Math.abs(val["y"] - _Y),
  3861. Math.abs(val["z"] - _N)
  3862. );
  3863.  
  3864. if (refplantes.indexOf(val["ID"]) == -1 && val["ID"] !== -1) {
  3865. var bgColor =
  3866. dist >= herbomin && dist <= herbomax
  3867. ? 'background-color: #93d278;'
  3868. : 'background-color: #E0E0E0;';
  3869. var row =
  3870. "<tr style='" +
  3871. bgColor +
  3872. "' class='extendedPlante'><td>" +
  3873. dist;
  3874. row += "</td><td>" + val["id"];
  3875. row += "</td><td>" + val["nom"] + " (" + val["espece"] + ")";
  3876. row += "</td><td>" + val["x"];
  3877. row += "</td><td>" + val["y"];
  3878. row += "</td><td>" + val["z"];
  3879. row += "</td></tr>";
  3880. $(row).insertAfter("#TPLANTS table tr:last");
  3881. }
  3882. });
  3883. });
  3884. $.ajaxSetup({
  3885. async: true
  3886. });
  3887. extendedPlantesBuilt = true;
  3888. }
  3889.  
  3890.  
  3891. //=====================================================================================================
  3892. // Fonction pour récupérer la vue de deathmétal depuis les scripts publics http://ie.gobland.fr
  3893. //=====================================================================================================
  3894.  
  3895.  
  3896. function fetchCSV(url) {
  3897. return fetch(url)
  3898. .then(response => response.text())
  3899. .then(csvData => parseCSV(csvData));
  3900. }
  3901.  
  3902. // Fonction pour convertir les données CSV en tableau
  3903. function parseCSV(csvData) {
  3904. // Convertir les données CSV en tableau
  3905. const rows = csvData.split('\n').slice(1); // Ignorer la première ligne d'en-têtes
  3906. const table = rows.map(row => row.split(','));
  3907.  
  3908. // Créer le tableau HTML avec les en-têtes spécifiés
  3909. const tableElement = document.createElement('table');
  3910. const headerRow = document.createElement('tr');
  3911.  
  3912. // En-têtes spécifiés
  3913. const headers = ['Catégorie' , 'Dist.', 'Id', 'Nom', 'Niveau', 'Type' , 'Clan', 'X', 'Y', 'N', 'Z'];
  3914.  
  3915. // Ajouter les en-têtes au tableau
  3916. headers.forEach(headerText => {
  3917. const th = document.createElement('th');
  3918. th.textContent = headerText;
  3919. headerRow.appendChild(th);
  3920. });
  3921.  
  3922. // Ajouter la ligne d'en-tête au tableau
  3923. tableElement.appendChild(headerRow);
  3924.  
  3925. // Ajouter les données CSV au tableau
  3926. table.forEach(row => {
  3927. const tr = document.createElement('tr');
  3928. row.forEach(cell => {
  3929. const td = document.createElement('td');
  3930. // Nettoyer les guillemets autour des mots
  3931. const cleanedCell = cell.replace(/"/g, '');
  3932. td.textContent = cleanedCell;
  3933. tr.appendChild(td);
  3934. });
  3935. tableElement.appendChild(tr);
  3936. });
  3937.  
  3938. // Trouver l'élément cible pour insérer le tableau
  3939. const targetElement = document.evaluate(
  3940. "/html/body/div[3]/div/table/tbody/tr[2]/td[2]/center[3]/table/tbody",
  3941. document,
  3942. null,
  3943. XPathResult.FIRST_ORDERED_NODE_TYPE,
  3944. null
  3945. ).singleNodeValue;
  3946.  
  3947.  
  3948. // Modifier le texte de l'élément cible
  3949. if (targetElement) {
  3950. targetElement.textContent = "Vue Death";
  3951. targetElement.style.fontSize = '24px'; // Larger font size
  3952. targetElement.style.fontWeight = 'bold'; // Bold style
  3953. targetElement.setAttribute("onclick", "javascript:retract('VUEDEATH');return false;");
  3954. } else {
  3955. console.error('Élément cible non trouvé.');
  3956. }
  3957.  
  3958. // Insérer le tableau en dessous de l'élément cible
  3959. if (targetElement) {
  3960. targetElement.parentNode.parentNode.appendChild(tableElement);
  3961. } else {
  3962. console.error('Élément cible non trouvé.');
  3963. }
  3964. }
  3965.  
  3966. // Fonction pour activer ou désactiver fetchCSV en fonction de l'état de la case à cocher
  3967. function toggleFetchCSV() {
  3968. const tableElement = document.querySelector('#TPLANTS');
  3969.  
  3970. if ($('#ckbFetchCSV').is(":checked")) {
  3971. fetchCSV(csvURL);
  3972. // Afficher le tableau s'il existe
  3973. if (tableElement) {
  3974. tableElement.style.display = 'block';
  3975. }
  3976. } else {
  3977. // Actions à effectuer lors de la désactivation de la récupération des données CSV
  3978. // Cacher le tableau s'il existe et arrêter la récupération
  3979. if (tableElement) {
  3980. tableElement.style.display = 'none';
  3981. }
  3982. // Ajoutez ici d'autres actions pour arrêter la récupération des données CSV si nécessaire
  3983. }
  3984. }
  3985.  
  3986. // Récupération de la case à cocher par son ID
  3987. const ckbFetchCSV = document.getElementById('ckbFetchCSV');
  3988.  
  3989. // Écouteur d'événement pour détecter le changement d'état de la case à cocher
  3990. ckbFetchCSV.addEventListener('change', toggleFetchCSV);
  3991.  
  3992. // Appeler toggleFetchCSV au chargement de la page pour initialiser le comportement
  3993. toggleFetchCSV();
  3994.  
  3995. // URL du CSV à récupérer
  3996. const csvURL = 'http://ie.gobland.fr/IE_Vue.php?id=330&passwd=30fae3bb4bf976a5cd29628102d42fd2&sep=,';
  3997.  
  3998. // Appeler la fonction fetchCSV avec l'URL
  3999. //fetchCSV(csvURL);
  4000.  
  4001.  
  4002.  
  4003.  
  4004. //=======================================================================
  4005. // VUE 2D. Piqué à Stéphane Beauquis (Extention Chrome)
  4006. // Grab the data for Vue2D
  4007. //=======================================================================
  4008.  
  4009.  
  4010.  
  4011. var _terre="", _PX=0, _PY=0;
  4012.  
  4013. // Get the name and num of the actual goblin
  4014. var nom = $('#identite').attr("nom");
  4015. var num = $('#identite').attr("num");
  4016.  
  4017. // Get the actual position and view size
  4018. $('li').each(function(){
  4019. // cache jquery var
  4020. var current = $(this);
  4021.  
  4022. var matches = current.text().match(/Ma position actuelle est : X = ([\-0-9]+), Y = ([\-0-9]+), N = ([\-0-9]+)([^\-]+)/);
  4023. if (matches) {
  4024. _X = parseInt(matches[1]);
  4025. _Y = parseInt(matches[2]);
  4026. _N = parseInt(matches[3]);
  4027. niveau = _N;
  4028. _terre = matches[4];
  4029. }
  4030.  
  4031. matches = current.text().match(/L'affichage est limité à (\d+) cases horizontalement et (\d+) verticalement/);
  4032. if (matches) {
  4033. _PX = (parseInt(matches[1])>50)?50:parseInt(matches[1]);
  4034. _PY = (parseInt(matches[2])>20)?20:parseInt(matches[2]);
  4035. }
  4036. });
  4037.  
  4038. if (displayFullWidth == 1) {
  4039. var width = 1800, height = 1800, leftgutter = 20, bottomgutter = 30, coordOffset = 1790;
  4040. var tailleTxt = "16px sans-serif";
  4041. $("#content").css("width" , "2000px");
  4042. $("html > body > div").css("left" , "1800x");
  4043. } else {
  4044. var width = 630, height = 650, leftgutter = 30, bottomgutter = 20, coordOffset = 1190;
  4045. var tailleTxt = "12px sans-serif";
  4046. }
  4047.  
  4048. var offset = 40,
  4049. nbCase = _PX * 2 + 1,
  4050. carre = Math.floor((width-offset-5) / nbCase),
  4051. txt = {"font": '10px Fontin-Sans, Arial', stroke: "none", fill: "#000"};
  4052.  
  4053. var alllieux = {};
  4054.  
  4055. // Compute grid limits
  4056. var xmin = _X - _PX,
  4057. ymin = _Y - _PX,
  4058. ymax = _Y + _PX,
  4059. Dx = xmin * -1,
  4060. Dy = ymin * -1;
  4061.  
  4062. // Initialisation de tooltipOpen comme un objet
  4063. var tooltipOpen = {};
  4064.  
  4065. // Fonction pour attacher les gestionnaires d'événements des tooltips
  4066. function attachTooltipEvents(st, key) {
  4067. if (st[0]) {
  4068. st[0].style.cursor = "pointer";
  4069. var isClicked = false;
  4070.  
  4071. // Gestion du clic
  4072. st[0].onclick = function (e) {
  4073. e.stopPropagation(); // Évite la propagation de l'événement aux parents
  4074. if (tooltipOpen[key]) {
  4075. closeTooltip(key);
  4076. } else {
  4077. openTooltip(key);
  4078. isClicked = true;
  4079. }
  4080. };
  4081.  
  4082. // Gestion du double-clic
  4083. st[0].ondblclick = function (e) {
  4084. e.stopPropagation();
  4085. if (isClicked) {
  4086. closeTooltip(key);
  4087. isClicked = false;
  4088. }
  4089. };
  4090.  
  4091. // Gestion du survol
  4092. st[0].onmouseover = function () {
  4093. if (!tooltipOpen[key] && !isClicked) {
  4094. closeTooltips(); // Fermer toutes les tooltips ouvertes
  4095. openTooltip(key);
  4096. }
  4097. };
  4098.  
  4099. st[0].onmouseout = function (e) {
  4100. var target = e.relatedTarget || e.toElement;
  4101. if (!isClicked && (!target || target !== st[0])) {
  4102. closeTooltip(key);
  4103. }
  4104. };
  4105.  
  4106. // Gestion du clic droit
  4107. st[0].oncontextmenu = function (e) {
  4108. e.preventDefault(); // Empêche l'ouverture du menu contextuel par défaut
  4109.  
  4110. // Copie du contenu de la tooltip dans le presse-papiers
  4111. if (tooltipOpen[key]) {
  4112. var tooltipContent = compute_text(key);
  4113.  
  4114. // Méthode alternative pour copier le texte
  4115. var tempInput = document.createElement('textarea');
  4116. tempInput.style.position = 'absolute';
  4117. tempInput.style.left = '-9999px';
  4118. tempInput.value = tooltipContent;
  4119. document.body.appendChild(tempInput);
  4120. tempInput.select();
  4121. try {
  4122. var successful = document.execCommand('copy');
  4123. var msg = successful ? 'copié dans le presse-papiers' : 'Échec de la copie du contenu de la tooltip';
  4124. alert(msg);
  4125. } catch (err) {
  4126. console.error('Erreur lors de la copie du texte : ', err);
  4127. }
  4128. document.body.removeChild(tempInput);
  4129. } else {
  4130. alert('Aucune tooltip ouverte pour copier le contenu');
  4131. }
  4132. };
  4133. }
  4134. }
  4135.  
  4136. function initializeTooltips() {
  4137. for (var key in alllieux) {
  4138. (function (st, key) {
  4139. attachTooltipEvents(st, key);
  4140. })(alllieux[key], key);
  4141. }
  4142. }
  4143.  
  4144.  
  4145. function openTooltip(key) {
  4146. if (key in alllieux && key in cells) { // Vérification importante
  4147. var st = alllieux[key];
  4148. if (st && st[0]) {
  4149. var x = cells[key].x;
  4150. var y = cells[key].y;
  4151.  
  4152. var tic = "";
  4153. tic += (y >= (Math.floor(nbCase / 2)) * carre) ? "bottom" : "top";
  4154. tic += (x > (Math.floor(nbCase / 2)) * carre) ? "left" : "right";
  4155.  
  4156. var s = compute_text(key);
  4157. draw_tooltip(st[0], 1, s, x, y, carre, tic);
  4158.  
  4159. tooltipOpen[key] = true; // Utilisez tooltipOpen si nécessaire
  4160. }
  4161. }
  4162. }
  4163.  
  4164. function closeTooltip(key) {
  4165. var st = alllieux[key];
  4166. if (st[0] && tooltipOpen[key]) {
  4167. draw_tooltip(st[0], 0);
  4168. tooltipOpen[key] = false;
  4169. }
  4170. }
  4171.  
  4172. function closeTooltips() {
  4173. for (var k in tooltipOpen) {
  4174. if (tooltipOpen[k]) {
  4175. closeTooltip(k);
  4176. }
  4177. }
  4178. }
  4179.  
  4180. // Gestion des changements de filtre
  4181. $("input.ckbFilter").change(function () {
  4182. showVueFullWidth();
  4183. showHideMiniMobs();
  4184. showHideTrees();
  4185. showHideVue2d();
  4186. showHideExtendedLieux();
  4187. showHideExtendedPlantes();
  4188. showHideCdmNeeded();
  4189. showHideCuisine();
  4190.  
  4191. var showBigMonsters = $('input[name=ckbBigMonsters]').is(':checked');
  4192.  
  4193. for (var key in cells) {
  4194. var x = cells[key].x;
  4195. var y = cells[key].y;
  4196.  
  4197. var mapping = "i" + getMapping(key, showBigMonsters) + ".src";
  4198.  
  4199. if (alllieux[key]) {
  4200. alllieux[key].remove();
  4201.  
  4202. // Supprimer de cells si la cellule est vide après filtrage
  4203. var mapping = getMapping(key, showBigMonsters); // Recalculer mapping après suppression
  4204. if (mapping === "0000") { // Adaptez "0000" si nécessaire
  4205. delete cells[key];
  4206. }
  4207. }
  4208.  
  4209. if (mapping in images) { // Vérifier si l'image existe
  4210. alllieux[key] = R.image(images[mapping], x, y, carre - 1, carre - 1);
  4211.  
  4212. // Attacher les gestionnaires d'événements pour les tooltips
  4213. (function (st, key) {
  4214. st[0].onload = function () {
  4215. attachTooltipEvents(st, key);
  4216. };
  4217. })(alllieux[key], key);
  4218. }
  4219.  
  4220.  
  4221. }
  4222. });
  4223.  
  4224. // Appeler initializeTooltips lors du chargement initial de la page
  4225. $(document).ready(function() {
  4226. initializeTooltips();
  4227. });
  4228.  
  4229.  
  4230.  
  4231.  
  4232. // Images
  4233. //ancienne adresse $("<img src=\"http://images.gobland.fr/addons/GGVue2D/0001.jpg\" id=\"i0001\" style=\"display:none;\" />").insertBefore(div);
  4234.  
  4235. $("<img src=\"https://i.ibb.co/Dz9gDV3/0001.png\" id=\"i0001\" style=\"display:none;\" />").insertBefore(div);
  4236. $("<img src=\"https://i.ibb.co/8P46Rjy/0010.png\" id=\"i0010\" style=\"display:none;\" />").insertBefore(div);
  4237. $("<img src=\"https://i.ibb.co/QcGCGDb/0011.png\" id=\"i0011\" style=\"display:none;\" />").insertBefore(div);
  4238. $("<img src=\"https://i.ibb.co/KwzFZvN/0100.png\" id=\"i0100\" style=\"display:none;\" />").insertBefore(div);
  4239. $("<img src=\"https://i.ibb.co/XZjcdh7/0101.png\" id=\"i0101\" style=\"display:none;\" />").insertBefore(div);
  4240. $("<img src=\"https://i.ibb.co/S56vt5R/0110.png\" id=\"i0110\" style=\"display:none;\" />").insertBefore(div);
  4241. $("<img src=\"https://i.ibb.co/s1Jtrnk/0111.png\" id=\"i0111\" style=\"display:none;\" />").insertBefore(div);
  4242. $("<img src=\"https://i.ibb.co/N3WcT1f/1000.png\" id=\"i1000\" style=\"display:none;\" />").insertBefore(div);
  4243. $("<img src=\"https://i.ibb.co/PNvwHwZ/1001.png\" id=\"i1001\" style=\"display:none;\" />").insertBefore(div);
  4244. $("<img src=\"https://i.ibb.co/vwcwq8y/1010.png\" id=\"i1010\" style=\"display:none;\" />").insertBefore(div);
  4245. $("<img src=\"https://i.ibb.co/n6L9kYJ/1011.png\" id=\"i1011\" style=\"display:none;\" />").insertBefore(div);
  4246. $("<img src=\"https://i.ibb.co/yFrybj2/1100.png\" id=\"i1100\" style=\"display:none;\" />").insertBefore(div);
  4247. $("<img src=\"https://i.ibb.co/44QQsYw/1101.png\" id=\"i1101\" style=\"display:none;\" />").insertBefore(div);
  4248. $("<img src=\"https://i.ibb.co/58Y158g/1110.png\" id=\"i1110\" style=\"display:none;\" />").insertBefore(div);
  4249. $("<img src=\"https://i.ibb.co/wzsbGdL/1111.png\" id=\"i1111\" style=\"display:none;\" />").insertBefore(div);
  4250. $("<img src=\"https://i.ibb.co/hRDDnZM/1200.png\" id=\"i1200\" style=\"display:none;\" />").insertBefore(div);
  4251. $("<img src=\"https://i.ibb.co/gdm3cNW/1201.png\" id=\"i1201\" style=\"display:none;\" />").insertBefore(div);
  4252. $("<img src=\"https://i.ibb.co/zrwHfBK/1210.png\" id=\"i1210\" style=\"display:none;\" />").insertBefore(div);
  4253. $("<img src=\"https://i.ibb.co/fC7GWvd/1211.png\" id=\"i1211\" style=\"display:none;\" />").insertBefore(div);
  4254. $("<img src=\"https://i.ibb.co/LxnJvjS/0200.png\" id=\"i0200\" style=\"display:none;\" />").insertBefore(div);
  4255. $("<img src=\"https://i.ibb.co/WWDrSHy/0201.png\" id=\"i0201\" style=\"display:none;\" />").insertBefore(div);
  4256. $("<img src=\"https://i.ibb.co/T4FnVMk/0210.png\" id=\"i0210\" style=\"display:none;\" />").insertBefore(div);
  4257. $("<img src=\"https://i.ibb.co/wgHgjjC/0211.png\" id=\"i0211\" style=\"display:none;\" />").insertBefore(div);
  4258. $("<img src=\"https://i.ibb.co/9ZKxpfP/1300.png\" id=\"i1300\" style=\"display:none;\" />").insertBefore(div);
  4259. $("<img src=\"https://i.ibb.co/C6KwVnJ/1301.png\" id=\"i1301\" style=\"display:none;\" />").insertBefore(div);
  4260. $("<img src=\"https://i.ibb.co/NFZVP34/1310.png\" id=\"i1310\" style=\"display:none;\" />").insertBefore(div);
  4261. $("<img src=\"https://i.ibb.co/Sd2KRDg/0300.png\" id=\"i0300\" style=\"display:none;\" />").insertBefore(div);
  4262. $("<img src=\"https://i.ibb.co/yhmsDKs/0301.png\" id=\"i0301\" style=\"display:none;\" />").insertBefore(div);
  4263. $("<img src=\"https://i.ibb.co/r5P0BPV/0310.png\" id=\"i0310\" style=\"display:none;\" />").insertBefore(div);
  4264. $("<img src=\"https://i.ibb.co/3Wnk7zT/0311.png\" id=\"i0311\" style=\"display:none;\" />").insertBefore(div);
  4265. $("<img src=\"https://i.ibb.co/61rWLLL/0400.png\" id=\"i0400\" style=\"display:none;\" />").insertBefore(div);
  4266. $("<img src=\"https://i.ibb.co/vxCmWFw/0401.png\" id=\"i0401\" style=\"display:none;\" />").insertBefore(div);
  4267. $("<img src=\"https://i.ibb.co/tczccQC/0410.png\" id=\"i0410\" style=\"display:none;\" />").insertBefore(div);
  4268. $("<img src=\"https://i.ibb.co/mGq9y8f/0411.png\" id=\"i0411\" style=\"display:none;\" />").insertBefore(div);
  4269. $("<img src=\"https://i.ibb.co/FnxBk2g/1410.png\" id=\"i1410\" style=\"display:none;\" />").insertBefore(div);
  4270. $("<img src=\"https://i.ibb.co/ZXZQxht/1411.png\" id=\"i1411\" style=\"display:none;\" />").insertBefore(div);
  4271. $("<img src=\"https://i.ibb.co/kSrPcdd/1401.png\" id=\"i1401\" style=\"display:none;\" />").insertBefore(div);
  4272. $("<img src=\"https://i.ibb.co/T8y0bM2/1400.png\" id=\"i1400\" style=\"display:none;\" />").insertBefore(div);
  4273. $("<img src=\"https://i.ibb.co/FnxBk2g/1410.png\" id=\"i1410\" style=\"display:none;\" />").insertBefore(div);
  4274. $("<img src=\"https://i.ibb.co/tJ8jHpq/0500.png\" id=\"i0500\" style=\"display:none;\" />").insertBefore(div);
  4275. $("<img src=\"https://i.ibb.co/WFWVSF5/0501.png\" id=\"i0501\" style=\"display:none;\" />").insertBefore(div);
  4276. $("<img src=\"https://i.ibb.co/JtSNYrd/0510.png\" id=\"i0510\" style=\"display:none;\" />").insertBefore(div);
  4277. $("<img src=\"https://i.ibb.co/gdKT4Ph/0511.png\" id=\"i0511\" style=\"display:none;\" />").insertBefore(div);
  4278. $("<img src=\"https://i.ibb.co/FX99SN7/1500.png\" id=\"i1500\" style=\"display:none;\" />").insertBefore(div);
  4279. $("<img src=\"https://i.ibb.co/KWSLbzc/1501.png\" id=\"i1501\" style=\"display:none;\" />").insertBefore(div);
  4280. $("<img src=\"https://i.ibb.co/9212GsW/1510.png\" id=\"i1510\" style=\"display:none;\" />").insertBefore(div);
  4281. $("<img src=\"https://i.ibb.co/qx85SyM/1511.png\" id=\"i1511\" style=\"display:none;\" />").insertBefore(div);
  4282. $("<img src=\"https://i.ibb.co/0qyL5mX/0600.png\" id=\"i0600\" style=\"display:none;\" />").insertBefore(div);
  4283.  
  4284. $("<img src=\"https://i.ibb.co/f9gzMtm/0601.png\" id=\"i0601\" style=\"display:none;\" />").insertBefore(div);
  4285. $("<img src=\"https://i.ibb.co/FYjyxXh/0610.png\" id=\"i0610\" style=\"display:none;\" />").insertBefore(div);
  4286. $("<img src=\"https://i.ibb.co/jv47Q2W/0611.png\" id=\"i0611\" style=\"display:none;\" />").insertBefore(div);
  4287. $("<img src=\"https://i.ibb.co/R7Dwjxy/1600.png\" id=\"i1600\" style=\"display:none;\" />").insertBefore(div);
  4288. $("<img src=\"https://i.ibb.co/Dpksj9V/1601.png\" id=\"i1601\" style=\"display:none;\" />").insertBefore(div);
  4289. $("<img src=\"https://i.ibb.co/mhcfSqt/1610.png\" id=\"i1610\" style=\"display:none;\" />").insertBefore(div);
  4290. $("<img src=\"https://i.ibb.co/d0rb5QW/1611.png\" id=\"i1611\" style=\"display:none;\" />").insertBefore(div);
  4291.  
  4292. $("<img src=\"https://i.ibb.co/SXbmrNws/1701.png\" id=\"i1701\" style=\"display:none;\" />").insertBefore(div);
  4293. $("<img src=\"https://i.ibb.co/5XtTZS5V/0710.png\" id=\"i1710\" style=\"display:none;\" />").insertBefore(div);
  4294. $("<img src=\"https://i.ibb.co/N6c76tnC/1711.png\" id=\"i1711\" style=\"display:none;\" />").insertBefore(div);
  4295. $("<img src=\"https://i.ibb.co/GQ0BvM0g/0700.png\" id=\"i0700\" style=\"display:none;\" />").insertBefore(div);
  4296. $("<img src=\"https://i.ibb.co/5g3Xr5Q8/0701.png\" id=\"i0701\" style=\"display:none;\" />").insertBefore(div);
  4297. $("<img src=\"https://i.ibb.co/kspdj1kv/0711.png\" id=\"i0711\" style=\"display:none;\" />").insertBefore(div);
  4298. $("<img src=\"https://i.ibb.co/4Zn39Jq5/1700.png\" id=\"i1700\" style=\"display:none;\" />").insertBefore(div);
  4299. $("<img src=\"https://i.ibb.co/5XtTZS5V/0710.png\" id=\"i0710\" style=\"display:none;\" />").insertBefore(div);
  4300.  
  4301.  
  4302.  
  4303.  
  4304.  
  4305.  
  4306.  
  4307.  
  4308.  
  4309.  
  4310. var images = {
  4311.  
  4312. "0001": i0001.src,
  4313. "0010": i0010.src,
  4314. "0011": i0011.src,
  4315. "0100": i0100.src,
  4316. "0101": i0101.src,
  4317. "0110": i0110.src,
  4318. "0111": i0111.src,
  4319. "1000": i1000.src,
  4320. "1001": i1001.src,
  4321. "1010": i1010.src,
  4322. "1011": i1011.src,
  4323. "1100": i1100.src,
  4324. "1101": i1101.src,
  4325. "1110": i1110.src,
  4326. "1111": i1111.src,
  4327. "1200": i1200.src,
  4328. "1201": i1201.src,
  4329. "1210": i1210.src,
  4330. "1211": i1211.src,
  4331. "0200": i0200.src,
  4332. "0201": i0201.src,
  4333. "0210": i0210.src,
  4334. "0211": i0211.src,
  4335. "1300": i1300.src,
  4336. "1301": i1301.src,
  4337. "1310": i1310.src,
  4338. "0300": i0300.src,
  4339. "0301": i0301.src,
  4340. "0310": i0310.src,
  4341. "0311": i0311.src,
  4342. "0400": i0400.src,
  4343. "0401": i0401.src,
  4344. "0410": i0410.src,
  4345. "0411": i0411.src,
  4346. "1400": i1400.src,
  4347. "1401": i1401.src,
  4348. "1410": i1410.src,
  4349. "1411": i1411.src,
  4350. "0500": i0500.src,
  4351. "0501": i0501.src,
  4352. "0510": i0510.src,
  4353. "0511": i0511.src,
  4354. "1500": i1500.src,
  4355. "1501": i1501.src,
  4356. "1510": i1510.src,
  4357. "1511": i1511.src,
  4358. "0600": i0600.src,
  4359. "0601": i0601.src,
  4360. "0610": i0610.src,
  4361. "0611": i0611.src,
  4362. "1600": i1600.src,
  4363. "1601": i1601.src,
  4364. "1610": i1610.src,
  4365. "1611": i1611.src,
  4366. "1700": i1700.src,
  4367. "1701": i1701.src,
  4368. "1710": i1710.src,
  4369. "1711": i1711.src,
  4370. "0700": i0700.src,
  4371. "0701": i0701.src,
  4372. "0710": i0701.src,
  4373. "0711": i0711.src
  4374. };
  4375.  
  4376. //initialisation de la vue2d
  4377. //=============================================================
  4378. // D r a w
  4379. //=============================================================
  4380. function build2DView() {
  4381. Raphael.fn.drawGrid = function (x, y, w, h, wv, hv, color) {
  4382. color = color || "#000";
  4383. var path = ["M", Math.round(x) + .5, Math.round(y) + .5, "L", Math.round(x + w) + .5, Math.round(y) + .5, Math.round(x + w) + .5, Math.round(y + h) + .5, Math.round(x) + .5, Math.round(y + h) + .5, Math.round(x) + .5, Math.round(y) + .5],
  4384. rowHeight = h / hv,
  4385. columnWidth = w / wv;
  4386. for (var i = 1; i < hv; i++) {
  4387. path = path.concat(["M", Math.round(x) + .5, Math.round(y + i * rowHeight) + .5, "H", Math.round(x + w) + .5]);
  4388. }
  4389. for (i = 1; i < wv; i++) {
  4390. path = path.concat(["M", Math.round(x + i * columnWidth) + .5, Math.round(y) + .5, "V", Math.round(y + h) + .5]);
  4391. }
  4392. return this.path(path.join(",")).attr({stroke: color});
  4393. };
  4394.  
  4395.  
  4396.  
  4397. R = Raphael("vue2D", width, height);
  4398.  
  4399. // Draw the grid
  4400. R.drawGrid(offset, offset, nbCase*carre, nbCase*carre, nbCase, nbCase, "#000");
  4401.  
  4402. // Draw legend for X-axis and Y-axis
  4403. for( var i = 0 ; i < nbCase ; i++ ) {
  4404. // X coordinates top/bottom
  4405. R.text( Math.round(offset+(i+.5)*carre), 10, (xmin+i).toString() ).attr(txt);
  4406. R.text( Math.round(offset+(i+.5)*carre), coordOffset, (xmin+i).toString() ).attr(txt);
  4407.  
  4408. // Y coordinates
  4409. R.text( 10, Math.round(offset+(i+.5)*carre), (ymax-i).toString() ).attr(txt);
  4410. }
  4411.  
  4412. // Add to the list the current Goblin
  4413. x = _PX * carre + offset + 1;
  4414. y = _PX * carre + offset + 1;
  4415. var key = (x + Dx) + Math.abs(y + Dy) * nbCase + 1;
  4416. cells[key] = { x: x, y: y, realx: _X, realy: _Y };
  4417. cells[key][_N] = {
  4418. gob: [nom + " (" + num + ")\n"],
  4419. monster: [], violetMonster: [], redMonster: [], orangeMonster: [], yellowMonster: [],
  4420. place: [], object: [], plant: [], mechanicalCreature: []
  4421. };
  4422.  
  4423. var creatures = $('#TCREATURES').find("table");
  4424. $("tbody tr", creatures).each(function (index, tr) {
  4425. var lines = $('td', tr).map(function (index, td) {
  4426. return $(td).text();
  4427. });
  4428.  
  4429. if (typeof lines[0] != "undefined") {
  4430. x = (_PX + parseInt(lines[6]) - _X) * carre + offset + 1;
  4431. y = (_PX - parseInt(lines[7]) + _Y) * carre + offset + 1;
  4432. var key = (x + Dx) + Math.abs(y + Dy) * nbCase + 1;
  4433.  
  4434. var lvl = lines[8].toString();
  4435.  
  4436.  
  4437. if (!(key in cells)) {
  4438. cells[key] = { x: x, y: y, realx: lines[6], realy: lines[7] };
  4439. cells[key][lvl] = {
  4440. gob: [], monster: [], violetMonster: [], redMonster: [], orangeMonster: [],
  4441. yellowMonster: [], place: [], object: [], plant: [], mechanicalCreature: []
  4442. };
  4443. }
  4444. if (!(lvl in cells[key])) {
  4445. cells[key][lvl] = {
  4446. gob: [], monster: [], violetMonster: [], redMonster: [], orangeMonster: [],
  4447. yellowMonster: [], place: [], object: [], plant: [], mechanicalCreature: []
  4448. };
  4449. }
  4450.  
  4451. if (lines[4] === "Mentalo" || lines[4] === "Nodef" || lines[4] === "Musculeux" ||
  4452. lines[4] === "Vis Yonnair" || lines[4] === "Trad Scion" || lines[4] === "Zozo Giste") {
  4453. cells[key][lvl]["gob"].push(lines[2] + ' - ' + lines[3]);
  4454. } else if (lines[4] === "Créature mécanique" || lines[4] === "Squelette" || lines[4] === "Pierreux" || lines[4] === "Esprit-rôdeur" || lines[4] === "Pierreux") {
  4455. console.log("suivant found!", lines[2]);
  4456. cells[key][lvl]["mechanicalCreature"].push(lines[2] + ' - ' + lines[3]);
  4457. } else if (parseInt(lines[3]) >= 50) {
  4458. cells[key][lvl]["violetMonster"].push(lines[2] + ' - ' + lines[3]);
  4459. } else if (parseInt(lines[3]) >= 40) {
  4460. cells[key][lvl]["redMonster"].push(lines[2] + ' - ' + lines[3]);
  4461. } else if (parseInt(lines[3]) >= 30) {
  4462. cells[key][lvl]["orangeMonster"].push(lines[2] + ' - ' + lines[3]);
  4463. } else if (parseInt(lines[3]) >= 25) {
  4464. cells[key][lvl]["yellowMonster"].push(lines[2] + ' - ' + lines[3]);
  4465. } else {
  4466. cells[key][lvl]["monster"].push(lines[2] + ' - ' + lines[3]);
  4467. }
  4468. }
  4469. });
  4470.  
  4471. var lieux = $('#TLIEUX').find("table");
  4472. $("tbody tr", lieux).each(function (index, tr) {
  4473. var lines = $('td', tr).map(function (index, td) {
  4474. return $(td).text();
  4475. });
  4476.  
  4477. if (typeof lines[0] != "undefined") {
  4478. x = (_PX + parseInt(lines[4]) - _X) * carre + offset + 1;
  4479. y = (_PX - parseInt(lines[5]) + _Y) * carre + offset + 1;
  4480. var key = (x + Dx) + Math.abs(y + Dy) * nbCase + 1;
  4481.  
  4482. var lvl = lines[6].toString();
  4483.  
  4484.  
  4485.  
  4486. if (!(key in cells)) {
  4487. cells[key] = { x: x, y: y, realx: lines[4], realy: lines[5] };
  4488. cells[key][lvl] = {
  4489. gob: [], monster: [], violetMonster: [], redMonster: [], orangeMonster: [],
  4490. yellowMonster: [], place: [], object: [], plant: [], mechanicalCreature: []
  4491. };
  4492. }
  4493. if (!(lvl in cells[key])) {
  4494. cells[key][lvl] = {
  4495. gob: [], monster: [], violetMonster: [], redMonster: [], orangeMonster: [],
  4496. yellowMonster: [], place: [], object: [], plant: [], mechanicalCreature: []
  4497. };
  4498. }
  4499.  
  4500. cells[key][lvl]["place"].push(lines[2]);
  4501. }
  4502. });
  4503.  
  4504. var tresors = $('#TOBJETS').find("table");
  4505. $("tbody tr", tresors).each(function (index, tr) {
  4506. var lines = $('td', tr).map(function (index, td) {
  4507. return $(td).text();
  4508. });
  4509.  
  4510. if (typeof lines[0] != "undefined") {
  4511. x = (_PX + parseInt(lines[3]) - _X) * carre + offset + 1;
  4512. y = (_PX - parseInt(lines[4]) + _Y) * carre + offset + 1;
  4513. var key = (x + Dx) + Math.abs(y + Dy) * nbCase + 1;
  4514.  
  4515. var lvl = lines[5].toString();
  4516.  
  4517.  
  4518. if (!(key in cells)) {
  4519. cells[key] = { x: x, y: y, realx: lines[3], realy: lines[4] };
  4520. cells[key][lvl] = {
  4521. gob: [], monster: [], violetMonster: [], redMonster: [], orangeMonster: [],
  4522. yellowMonster: [], place: [], object: [], plant: [], mechanicalCreature: []
  4523. };
  4524. }
  4525. if (!(lvl in cells[key])) {
  4526. cells[key][lvl] = {
  4527. gob: [], monster: [], violetMonster: [], redMonster: [], orangeMonster: [],
  4528. yellowMonster: [], place: [], object: [], plant: [], mechanicalCreature: []
  4529. };
  4530. }
  4531.  
  4532. cells[key][lvl]["object"].push(lines[2]);
  4533. }
  4534. });
  4535.  
  4536. var plantes = $('#TPLANTS').find("table");
  4537. $("tbody tr", plantes).each(function (index, tr) {
  4538. var lines = $('td', tr).map(function (index, td) {
  4539. return $(td).text();
  4540. });
  4541.  
  4542. if (typeof lines[0] != "undefined") {
  4543. x = (_PX + parseInt(lines[3]) - _X) * carre + offset + 1;
  4544. y = (_PX - parseInt(lines[4]) + _Y) * carre + offset + 1;
  4545. var key = (x + Dx) + Math.abs(y + Dy) * nbCase + 1;
  4546.  
  4547. var lvl = lines[5].toString();
  4548.  
  4549.  
  4550. if (!(key in cells)) {
  4551. cells[key] = { x: x, y: y, realx: lines[3], realy: lines[4] };
  4552. cells[key][lvl] = {
  4553. gob: [], monster: [], violetMonster: [], redMonster: [], orangeMonster: [],
  4554. yellowMonster: [], place: [], object: [], plant: [], mechanicalCreature: []
  4555. };
  4556. }
  4557. if (!(lvl in cells[key])) {
  4558. cells[key][lvl] = {
  4559. gob: [], monster: [], violetMonster: [], redMonster: [], orangeMonster: [],
  4560. yellowMonster: [], place: [], object: [], plant: [], mechanicalCreature: []
  4561. };
  4562. }
  4563.  
  4564. cells[key][lvl]["plant"].push(lines[2]);
  4565. }
  4566. });
  4567.  
  4568. alllieux = {};
  4569.  
  4570.  
  4571. for (var key in cells) {
  4572. x = cells[key].x;
  4573. y = cells[key].y;
  4574. mapping = getMapping(key);
  4575.  
  4576. if (mapping in images) {
  4577. alllieux[key] = R.image(images[mapping], x, y, carre - 1, carre - 1);
  4578. (function (st, key) {
  4579. attachTooltipEvents(st, key);
  4580. })(alllieux[key], key);
  4581.  
  4582. } else {
  4583. console.error("Image not found for mapping:", mapping);
  4584. }
  4585. }
  4586.  
  4587. vue2DBuilt = true;
  4588.  
  4589. }
  4590.  
  4591.  
  4592. //getmapping
  4593. function getMapping(k, showBigMonsters) {
  4594. var result = "";
  4595. var cptGob = 0, cptMob = 0, cptPlace = 0, cptObj = 0, cptVioletMobs = 0, cptRedMobs = 0, cptorandedMobs = 0, cptyellowedMobs = 0, cptplants = 0, cptMech = 0;
  4596.  
  4597.  
  4598. if ($('input[name=ckbNiveau]').is(':checked')) {
  4599. if (niveau in cells[k]) {
  4600. cptGob += cells[k][niveau]["gob"].length;
  4601. cptMob += cells[k][niveau]["monster"].length;
  4602. cptRedMobs += cells[k][niveau]["redMonster"].length;
  4603. cptVioletMobs += cells[k][niveau]["violetMonster"].length;
  4604. cptPlace += cells[k][niveau]["place"].length;
  4605. cptObj += cells[k][niveau]["object"].length;
  4606. cptplants += cells[k][niveau]["plant"].length;
  4607. cptorandedMobs += cells[k][niveau]["orangeMonster"].length;
  4608. cptyellowedMobs += cells[k][niveau]["yellowMonster"].length;
  4609. cptMech += cells[k][niveau]["mechanicalCreature"].length; // Créatures mécaniques
  4610. }
  4611. } else {
  4612. for (var lvl in cells[k]) {
  4613. if ((lvl != "x") && (lvl != "y") && (lvl != "realx") && (lvl != "realy")) {
  4614. cptGob += cells[k][lvl]["gob"].length;
  4615. cptMob += cells[k][lvl]["monster"].length;
  4616. cptRedMobs += cells[k][lvl]["redMonster"].length;
  4617. cptVioletMobs += cells[k][lvl]["violetMonster"].length;
  4618. cptPlace += cells[k][lvl]["place"].length;
  4619. cptObj += cells[k][lvl]["object"].length;
  4620. cptplants += cells[k][lvl]["plant"].length;
  4621. cptorandedMobs += cells[k][lvl]["orangeMonster"].length;
  4622. cptyellowedMobs += cells[k][lvl]["yellowMonster"].length;
  4623. cptMech += cells[k][lvl]["mechanicalCreature"].length; // Créatures mécaniques
  4624. }
  4625. }
  4626. }
  4627.  
  4628. result += (cptGob > 0) ? "1" : "0";
  4629.  
  4630. // Priorité aux créatures mécaniques
  4631. if ((cptMech > 0) && ($('input[name=ckbMonster]').is(':checked'))) {
  4632. result += "7";
  4633. } else if ((cptplants > 0) && ($('input[name=ckbplants]').is(':checked'))) {
  4634. result += "3";
  4635. } else if (showBigMonsters && $('input[name=ckbMonster]').is(':checked')) { // Simplifié pour gros monstres
  4636. result += (cptRedMobs > 0) ? "2" : ((cptVioletMobs > 0) ? "6" : "0");
  4637. } else if ((cptRedMobs > 0) && ($('input[name=ckbMonster]').is(':checked'))) {
  4638. result += "2";
  4639. } else if ((cptVioletMobs > 0) && ($('input[name=ckbMonster]').is(':checked'))) {
  4640. result += "6";
  4641. } else if ((cptorandedMobs > 0) && ($('input[name=ckbMonster]').is(':checked'))) {
  4642. result += "4";
  4643. } else if ((cptyellowedMobs > 0) && ($('input[name=ckbMonster]').is(':checked'))) {
  4644. result += "5";
  4645. } else if ((cptMob > 0) && ($('input[name=ckbMonster]').is(':checked'))) {
  4646. result += "1";
  4647. } else {
  4648. result += "0";
  4649. }
  4650.  
  4651.  
  4652.  
  4653. result += (($('input[name=ckbObject]').is(':checked')) && (cptObj > 0)) ? "1" : "0";
  4654. result += (($('input[name=ckbPlace]').is(':checked')) && (cptPlace > 0)) ? "1" : "0";
  4655.  
  4656. return result;
  4657. }
  4658. //=======================================================================================
  4659. // Compute the global text that must be display in the popup.
  4660. //=======================================================================================
  4661. function compute_text(k) {
  4662. var result = "X=" + cells[k].realx + ", Y=" + cells[k].realy + "\n";
  4663. var n = [];
  4664.  
  4665. if ($('input[name=ckbNiveau]').is(':checked')) {
  4666. if (niveau in cells[k]) {
  4667. n.push(niveau);
  4668. }
  4669. } else {
  4670. for (var lvl in cells[k]) {
  4671. if ((lvl != "x") && (lvl != "y") &&
  4672. (lvl != "realx") && (lvl != "realy")) {
  4673. n.push(lvl);
  4674. }
  4675. }
  4676. }
  4677.  
  4678. var data = "";
  4679. for (var i = 0; i < n.length; i++) {
  4680. var k2 = n[i];
  4681.  
  4682. if (k2 in cells[k]) { // <-- Vérification importante
  4683. data += getString(cells[k][k2]["gob"]);
  4684. data += getString(cells[k][k2]["monster"], true);
  4685. data += getString(cells[k][k2]["violetMonster"], true);
  4686. data += getString(cells[k][k2]["redMonster"], true);
  4687. data += getString(cells[k][k2]["orangeMonster"], true);
  4688. data += getString(cells[k][k2]["yellowMonster"], true);
  4689. data += getString(cells[k][k2]["place"]);
  4690. data += getString(cells[k][k2]["plant"]);
  4691. data += getString(cells[k][k2]["mechanicalCreature"]); // <-- mechanicalCreature ici
  4692.  
  4693. if ($('input[name=ckbObject]').is(':checked')) {
  4694. data += getString(cells[k][k2]["object"], true);
  4695. }
  4696.  
  4697. if (data != "") {
  4698. result += " \nNiveau: " + k2 + "\n" + data;
  4699. data = "";
  4700. }
  4701. } // Fin de la condition if (k2 in cells[k])
  4702. }
  4703. return result;
  4704. }
  4705.  
  4706. function getString(arr, pre) {
  4707. if (typeof arr === 'undefined' || !arr ) return "";
  4708. var res = "";
  4709. if (arr.length > 0)
  4710. {
  4711. for (var j=0;j<arr.length;j++)
  4712. {
  4713. res += ((pre)?" - ":"") + arr[j] + "\n";
  4714. }
  4715. }
  4716. return res;
  4717. }
  4718.  
  4719. //=======================================================================================
  4720. // Process the data array and generate the string to display in the popup
  4721. // If compressed = true, the number of items are counted to be displayed as N x items
  4722. //=======================================================================================
  4723. function getString(data,compressed) {
  4724. if(typeof(compressed)==='undefined') compressed = false;
  4725. var result = "";
  4726.  
  4727. if (compressed)
  4728. {
  4729. var tmp = {};
  4730. for( var i=0; i < data.length; i++ )
  4731. {
  4732. n = data[i];
  4733. if (!(n in tmp))
  4734. {
  4735. tmp[n] = 0;
  4736. }
  4737. tmp[n] = tmp[n] + 1;
  4738. }
  4739.  
  4740. for( var k in tmp )
  4741. {
  4742. result += "\t" + tmp[k] + " x " + k + "\n";
  4743. }
  4744. }
  4745. else
  4746. {
  4747. for( var i=0; i < data.length; i++ )
  4748. {
  4749. result += "\t" + data[i] + "\n";
  4750. }
  4751. }
  4752. return result;
  4753. }
  4754.  
  4755.  
  4756.  
  4757. function draw_tooltip(object, show, text, x, y, carre, from) {
  4758. if(show == 0) {
  4759. popup.remove();
  4760. popup_txt.remove();
  4761. transparent_txt.remove();
  4762. return;
  4763. }
  4764.  
  4765.  
  4766. // Center X on middle of the cell.
  4767. x += Math.floor(carre/2);
  4768.  
  4769. //draw text somewhere to get its dimensions and make it transparent
  4770. transparent_txt = R.text(10,10, text).attr({fill: "transparent",font: tailleTxt});
  4771.  
  4772. //get text dimensions to obtain tooltip dimensions
  4773. var txt_box = transparent_txt.getBBox();
  4774.  
  4775.  
  4776. if (from=="topright") {
  4777. // Move to bottom of the cell
  4778. y += carre;
  4779.  
  4780. // Compute position
  4781. Xtext = x+5;
  4782. Ytext = y+Math.floor(txt_box.height/2)+5;
  4783.  
  4784. //draw text
  4785. popup_txt = R.text(Xtext, Ytext, text).attr({fill: "black",font: tailleTxt,'text-anchor': 'start'});
  4786.  
  4787. var bb = popup_txt.getBBox();
  4788.  
  4789. // Compute path for tooltip box
  4790. pathText = // 'M'ove to the 'dent' in the bubble
  4791. "M" + (x) + " " + (y) +
  4792. // 'v'ertically draw a line 5 pixels more than the height of the text
  4793. "v" + (bb.height+5) +
  4794. // 'h'orizontally draw a line 10 more than the text's width
  4795. "h" + (bb.width+10) +
  4796. // 'v'ertically draw a line to the bottom of the text
  4797. "v" + -bb.height +
  4798. // 'h'orizontally draw a line so we're 5 pixels from the left side
  4799. "h" + -(bb.width+5) +
  4800. // 'Z' closes the figure
  4801. "Z";
  4802. } else if (from=="topleft") {
  4803. // Move to bottom of the cell
  4804. y += carre;
  4805.  
  4806. // Compute position
  4807. Xtext = x-(txt_box.width+5);
  4808. Ytext = y+Math.floor(txt_box.height/2)+5;
  4809.  
  4810. //draw text
  4811. popup_txt = R.text(Xtext, Ytext, text).attr({fill: "black",font: tailleTxt,'text-anchor': 'start'});
  4812.  
  4813. var bb = popup_txt.getBBox();
  4814.  
  4815. // Compute path for tooltip box
  4816. pathText = // 'M'ove to the 'dent' in the bubble
  4817. "M" + (x) + " " + (y) +
  4818. // 'v'ertically draw a line 5 pixels more than the height of the text
  4819. "v" + (bb.height+5) +
  4820. // 'h'orizontally draw a line 10 more than the text's width
  4821. "h" + -(bb.width+10) +
  4822. // 'v'ertically draw a line to the bottom of the text
  4823. "v" + -bb.height +
  4824. // 'h'orizontally draw a line so we're 5 pixels from the left side
  4825. "h" + (bb.width+5) +
  4826. // 'Z' closes the figure
  4827. "Z";
  4828. } else if (from=="bottomleft") {
  4829. // Compute position
  4830. Xtext = x-(txt_box.width+5);
  4831. Ytext = y-Math.floor(txt_box.height/2)-6;
  4832.  
  4833. //draw text
  4834. popup_txt = R.text(Xtext, Ytext, text).attr({fill: "black",font: tailleTxt,'text-anchor': 'start'});
  4835.  
  4836. var bb = popup_txt.getBBox();
  4837.  
  4838. // Compute path for tooltip box
  4839. pathText = // 'M'ove to the 'dent' in the bubble
  4840. "M" + (x) + " " + (y) +
  4841. // 'v'ertically draw a line 5 pixels more than the height of the text
  4842. "v" + -(bb.height+5) +
  4843. // 'h'orizontally draw a line 10 more than the text's width
  4844. "h" + -(bb.width+10) +
  4845. // 'v'ertically draw a line to the bottom of the text
  4846. "v" + bb.height +
  4847. // 'h'orizontally draw a line so we're 5 pixels from the left side
  4848. "h" + (bb.width+5) +
  4849. // 'Z' closes the figure
  4850. "Z";
  4851. } else // bottom right
  4852. {
  4853. // Compute position
  4854. Xtext = x+5;
  4855. Ytext = y-Math.floor(txt_box.height/2)-6;
  4856.  
  4857. //draw text
  4858. popup_txt = R.text(Xtext, Ytext, text).attr({fill: "black",font: tailleTxt,'text-anchor': 'start'});
  4859.  
  4860. var bb = popup_txt.getBBox();
  4861.  
  4862. // Compute path for tooltip box
  4863. pathText = // 'M'ove to the 'dent' in the bubble
  4864. "M" + (x) + " " + (y) +
  4865. // 'v'ertically draw a line 5 pixels more than the height of the text
  4866. "v" + -(bb.height+5) +
  4867. // 'h'orizontally draw a line 10 more than the text's width
  4868. "h" + (bb.width+10) +
  4869. // 'v'ertically draw a line to the bottom of the text
  4870. "v" + bb.height +
  4871. // 'h'orizontally draw a line so we're 5 pixels from the left side
  4872. "h" + -(bb.width+5) +
  4873. // 'Z' closes the figure
  4874. "Z";
  4875. }
  4876.  
  4877. //draw path for tooltip box
  4878. popup = R.path( pathText ).attr( {fill: "yellow"} );
  4879.  
  4880. //finally put the text in front
  4881. popup_txt.toFront();
  4882.  
  4883. }
  4884.  
  4885. };
  4886.  
  4887.  
  4888. //----------------------
  4889. ///FIN DE LA VUE 2D
  4890. //----------------------
  4891.  
  4892.  
  4893. //==========================================================================================================================================================================================================================
  4894. // Traitements spécifiques à la page PROFIL
  4895. //==========================================================================================================================================================================================================================
  4896. if ($(location).attr('href').match(/^http:\/\/(.*\.)?gobland\.fr\/ProfilPerso\.php$/i)) {
  4897.  
  4898. var skills = {};
  4899.  
  4900.  
  4901.  
  4902. //fait apparaitre comp et tech et dons en couleurs dans MonProfil
  4903. $('td:contains("Connaissance des Monstres")').parent().css("background-color","cefeda");
  4904. $('td:contains("Identification des Trésors")').parent().css("background-color","fec8f1");
  4905. $('td:contains("Limier")').parent().css("background-color","f9ffbc");
  4906. $('td:contains("Dur")').parent().css("background-color","f9ffbc");
  4907.  
  4908. //fait apparaitre "Grand Maître" en Gras dans Mon Profil
  4909. $('td:contains("(Grand Maître)")').css("font-weight", "bold");
  4910.  
  4911. $( document ).ready(function() {
  4912. displayNextLevel();
  4913. buildSkillsStats();
  4914. buildSkillsMagie();
  4915. addToolTipsTalents();
  4916.  
  4917. // Met en rouge le malus de concentration
  4918. if (skills.CON < -1) {
  4919. $('td:contains("Bonus de concentration")').css("color","red", "font-weight", "bold");
  4920. } else {
  4921. $('td:contains("Bonus de concentration")').css("color","green" , "font-weight", "bold");
  4922. }
  4923. });
  4924.  
  4925.  
  4926.  
  4927.  
  4928. /// INFO BULLES TALENTS (au survol de la souris sur une comp ou tech, fait le calcul si c'est possible)
  4929.  
  4930. function addToolTipsTalents() {
  4931.  
  4932. $('a:contains("Symphonie Intestinale")').prop('title',
  4933. 'Apprenti...........ATT/ESQ/PER -' + Math.floor((skills.PV/30)) + "\n" +
  4934. 'Compagnon...ATT/ESQ/PER -' + Math.floor((skills.PV/25)) + "\n" +
  4935. 'Maître...............ATT/ESQ/PER -' + Math.floor((skills.PV/20)) + "\n" +
  4936. 'Grand Maître..ATT/ESQ/PER -' + Math.floor((skills.PV/15))) ;
  4937.  
  4938. $('a:contains("Afflux Sanguin")').prop('title',
  4939. 'Apprenti ' + Math.floor((skills.PVMax/30) ) + 'D3' + ' (' + Math.floor((skills.PVMax/30) )*2 + ')' + "\n" +
  4940. 'Compagnon ' + Math.floor((skills.PVMax/25) ) + 'D3' + ' (' + Math.floor((skills.PVMax/25) )*2 + ')' + "\n" +
  4941. 'Maître ' + Math.floor((skills.PVMax/20) ) + 'D3' + ' (' + Math.floor((skills.PVMax/20) )*2 + ')' + "\n" +
  4942. 'Grand Maître ' + Math.floor((skills.PVMax/15) )+ 'D3' + ' (' + Math.floor((skills.PVMax/15) )*2 + ')') ;
  4943.  
  4944. $('a:contains("Appel des Ombres")').prop('title',
  4945. 'Apprenti......' + ' MT +' + (skills.MTP/2)+ ' | ' + ' RT +0 ' + ' | ' + ' MP +0 ' + ' | ' + ' RT -' + (skills.RPP/2) + "\n" +
  4946. 'Compagnon......' + ' MT +' + (skills.MTP)+ ' | ' + ' RT +0 '+ ' | ' + ' MP +0 '+ ' | ' + ' RP -' + (skills.RPP) + "\n" +
  4947. 'Maître......' + ' MT +' + (skills.MTP)+ ' | ' + ' RT +' + (skills.RTP/2) + ' | ' + ' MP -' +(skills.MPP/2) + ' | ' + ' RP -' + (skills.RPP) + "\n" +
  4948. 'Grand Maître......' + ' MT +' + (skills.MTP)+ ' | ' + ' RT +' + (skills.RTP)+ ' | ' + ' MP -' +(skills.MPP)+ ' | ' + ' RP -' + (skills.RPP));
  4949.  
  4950. $('a:contains("Appel de la Nature")').prop('title',
  4951. 'Apprenti......' + ' MS +' + (skills.MSP/2)+ ' | ' + ' RS +0 ' + ' | ' + ' MC +0 ' + ' | ' + ' RC -' + (skills.RCP/2) + "\n" +
  4952. 'Compagnon......' + ' MS +' + (skills.MSP)+ ' | ' + ' RS +0 '+ ' | ' + ' MC +0 '+ ' | ' + ' RC -' + (skills.RCP) + "\n" +
  4953. 'Maître......' + ' MS +' + (skills.MSP)+ ' | ' + ' RS +' + (skills.RSP/2) + ' | ' + ' MC -' +(skills.MCP/2) + ' | ' + ' RC -' + (skills.RCP) + "\n" +
  4954. 'Grand Maître......' + ' MS +' + (skills.MSP)+ ' | ' + ' RS +' + (skills.RSP)+ ' | ' + ' MC -' +(skills.MCP)+ ' | ' + ' RC -' + (skills.RCP));
  4955.  
  4956. $('a:contains("Alchimie")').prop('title',
  4957. 'ATT ' + Math.floor(skills.ATT ) + 'D6' + skills.ATTP + ' (' + Math.floor(((+skills.ATT) )*3.5 + +skills.ATTP) + ')' + "\n" +
  4958. '......DEG......' + "\n" +
  4959. 'Apprenti...... ' + Math.floor(skills.ATT ) + 'D6' + skills.ATTP + ' (' + Math.floor(((+skills.ATT) )*3.5 + +skills.ATTP) + ')' + "\n" +
  4960. 'Compagnon...... ' + Math.floor((skills.PV/25) ) + 'D3' + ' (' + Math.floor((skills.PV/25) )*3.5 + ')' + "\n" +
  4961. 'Maître...... ' + Math.floor((skills.PV/20) ) + 'D3' + ' (' + Math.floor((skills.PV/20) )*3.5 + ')' + "\n" +
  4962. 'Grand Maître...... ' + Math.floor((skills.PV/15) )+ 'D3' + ' (' + Math.floor((skills.PV/15) )*3.5 + ')') ;
  4963.  
  4964. $('a:contains("Renforcement magique")').prop('title',
  4965. 'Apprenti......' + ' MM +' + (skills.MMP/2)+ ' | ' + ' RM +0 ' + ' | ' + ' MR +0 ' + ' | ' + ' RR -' + (skills.RCP/2) + "\n" +
  4966. 'Compagnon......' + ' MM +' + (skills.MMP)+ ' | ' + ' RM +0 '+ ' | ' + ' MR +0 '+ ' | ' + ' RR -' + (skills.RCP) + "\n" +
  4967. 'Maître......' + ' MM +' + (skills.MMP)+ ' | ' + ' RM +' + (skills.RMP/2) + ' | ' + ' MR -' +(skills.MRP/2) + ' | ' + ' RR -' + (skills.RRP) + "\n" +
  4968. 'Grand Maître......' + ' MM +' + (skills.MMP)+ ' | ' + ' RM +' + (skills.RMP)+ ' | ' + ' MR -' +(skills.MRP)+ ' | ' + ' RR -' + (skills.RRP));
  4969.  
  4970. $('a:contains("Connaissance des Monstres")').prop('title', 'portée : ' + (Math.floor((+skills.PER)+(+skills.PERM)+(+skills.PERP))));
  4971.  
  4972. $('a:contains("Projectile")').prop('title',
  4973. 'ATT ' + Math.floor(((skills.PER/2 + skills.ATT/2)) - Math.max(0,(2/4-0))) + 'D6 +' + Math.floor(skills.PERM/2 + skills.ATTM/2 ) + '---> ' +
  4974. (Math.floor((((skills.PER/2 + skills.ATT/2)) - Math.max(0,2/4-0)))*3.5 + Math.floor(skills.PERM/2 + skills.ATTM/2 )) + "\n" +
  4975. 'DEG ' + Math.floor((skills.PER/2 + skills.ATT/2)) + 'D3 +' + (skills.ATTM/2 + skills.PERM/2 ) + '---> ' +
  4976. ((Math.floor((skills.PER/2 + skills.ATT/2)))*2 + Math.floor(skills.PERM/2 + skills.ATTM/2 )) + ' (' +
  4977. ((((Math.floor((skills.PER/2 + skills.ATT/2)))*2 + Math.floor(skills.PERM/2 + skills.ATTM/2 ))) + ((((Math.floor((skills.PER/2 + skills.ATT/2)))*2 + Math.floor(skills.PERM/2 + skills.ATTM/2 )))/2)) + ')' + "\n" +
  4978. 'Divisé par 2 si résisté' + "\n" + 'Portée : ' + getRange(skills.PER + skills.PERP + skills.PERM)
  4979. );
  4980. //calcul de la portée du PO
  4981. function getRange() {
  4982. const totalPerception = +skills.PER + +skills.PERP + +skills.PERM;
  4983. window.localStorage.setItem('totalPerception', totalPerception);
  4984.  
  4985. if (totalPerception >= 1 && totalPerception <= 4) {
  4986. return '1 case';
  4987. } else if (totalPerception >= 5 && totalPerception <= 9) {
  4988. return '2 cases';
  4989. } else if (totalPerception >= 10 && totalPerception <= 15) {
  4990. return '3 cases';
  4991. } else if (totalPerception >= 16 && totalPerception <= 22) {
  4992. return '4 cases';
  4993. } else if (totalPerception >= 23 && totalPerception <= 30) {
  4994. return '5 cases';
  4995. } else if (totalPerception >= 31 && totalPerception <= 39) {
  4996. return '6 cases';
  4997. } else if (totalPerception >= 40 && totalPerception <= 50) {
  4998. return '7 cases';
  4999. } else if (totalPerception >= 51 && totalPerception <= 62) {
  5000. return '8 cases';
  5001. } else if (totalPerception >= 62 && totalPerception <= 74) {
  5002. return '9 cases';
  5003. } else {
  5004. return 'Out of Range';
  5005. }
  5006. } ;
  5007.  
  5008. $('a:contains("Baratin")').prop('title',
  5009. 'Apprenti......' + Math.floor((1)+((skills.PER)/5 + (skills.REG)/5))+'D6' + ' (' + Math.floor(1+((skills.PER)/5 + (skills.REG)/5)*3.5) + ')' + "\n" +
  5010. 'Compagnon......' + Math.floor((1)+((skills.PER)/4 + (skills.REG)/4)) +'D6' + ' (' + Math.floor(1+((skills.PER)/4 + (skills.REG)/4)*3.5) + ')' + "\n" +
  5011. 'Maître ......' + Math.floor((1)+((skills.PER)/3 + (skills.REG)/3))+'D6' + ' (' + Math.floor(1+((skills.PER)/3 + (skills.REG)/3)*3.5) + ')' + "\n" +
  5012. 'Grand Maître ......' + Math.floor((1)+((skills.PER)/2 + (skills.REG)/2))+'D6' + ' (' + Math.floor(1+((skills.PER)/2 + (skills.REG)/2)*3.5) + ')');
  5013.  
  5014. $('a:contains("Chirurgie")').prop('title',
  5015. 'Apprenti...... ' + Math.floor((3/2)*skills.REG) + 'D3'+ ' (' + Math.floor((3/2)*skills.REG) *2 + ')' + "\n" +
  5016. 'Compagnon...... ' + Math.floor((4/2)*skills.REG) + 'D3' + ' (' + Math.floor((4/2)*skills.REG) *2 + ')' + "\n" +
  5017. 'Maître...... ' + Math.floor((5/2)*skills.REG) + 'D3' + ' (' + Math.floor((5/2)*skills.REG) *2 + ')' + "\n" +
  5018. 'Grand Maître...... ' + Math.floor((6/2)*skills.REG) + 'D3' + ' (' + Math.floor((6/2)*skills.REG) *2 + ')');
  5019.  
  5020. $('a:contains("Soins")').prop('title',
  5021. 'Apprenti...... ' + '+' + Math.floor(+skills.REG*1 + +skills.REGM) + ' PV' + "\n" +
  5022. 'Compagnon...... ' + '+' + Math.floor(+skills.REG*2 + +skills.REGM) + ' PV' +"\n" +
  5023. 'Maître...... ' + '+' + Math.floor(+skills.REG*3 + +skills.REGM) + ' PV' + "\n" +
  5024. 'Grand Maître...... ' + '+' + Math.floor(+skills.REG*4 + +skills.REGM) + ' PV');
  5025.  
  5026. $('a:contains("Téléportation")').prop('title',
  5027. 'Apprenti...... ' + 'Portée horizontale : ' + ((Math.floor(Math.sqrt(19+8*skills.MM*1/5+3))-7)/2 + 20 + + skills.PER + +skills.PERM ) + ' Portée verticale : ' +((Math.floor(((Math.sqrt(19+8*skills.MM*1/5+3))-7)/2/3+3))) + "\n" +
  5028. 'Compagnon...... ' + 'Portée horizontale : ' + ((Math.floor(Math.sqrt(19+8*skills.MM*1.1/5+3))-7)/2 + 20 + + skills.PER + +skills.PERM ) + ' Portée verticale : ' +((Math.floor(((Math.sqrt(19+8*skills.MM*1.1/5+3))-7)/2/3+3))) + "\n" +
  5029. 'Maître...... ' + 'Portée horizontale : ' + ((Math.floor(Math.sqrt(19+8*skills.MM*1.2/5+3))-7)/2 + 20 + + skills.PER + +skills.PERM ) + ' Portée verticale : ' +((Math.floor(((Math.sqrt(19+8*skills.MM*1.2/5+3))-7)/2/3+3))) + "\n" +
  5030. 'Grand Maître...... ' + 'Portée horizontale : ' + ((Math.floor(Math.sqrt(19+8*skills.MM*1.3/5+3))-7)/2 + 20 + + skills.PER + +skills.PERM ) + ' Portée verticale : ' +((Math.floor(((Math.sqrt(19+8*skills.MM*1.3/5+3))-7)/2/3+3))));
  5031.  
  5032. $('a:contains("Double Dague")').prop('title',
  5033. 'Grand Maître : 1ere attaque : ' + skills.ATT+ 'D6'+ '+' + skills.ATTP*1+ '+' + +skills.ATTM +
  5034. '2eme attaque : ' + Math.floor(skills.ATT-+skills.ATT*0.25) + 'D6'+ '+' + Math.floor(skills.ATTP*1*0.25)+ '+' + Math.floor(skills.ATTM*0.25) +
  5035. '3eme attaque : ' + Math.floor(skills.ATT-+skills.ATT*0.5) + 'D6'+ '+' + Math.floor(skills.ATTP*1*0.5)+ '+' + Math.floor(skills.ATTM*0.5) +
  5036. '4eme attaque : ' + Math.floor(skills.ATT-+skills.ATT*0.75) + 'D6'+ '+' + Math.floor(skills.ATTP*1*0.75)+ '+' + Math.floor(skills.ATTM*0.75) +
  5037. 'Dégâts : ' + skills.DEG + 'D3'+ '+' + Math.floor(skills.DEGP*1.5)+ '+' + Math.floor(skills.DEGM)) ;
  5038.  
  5039. $('a:contains("Flairer le gibier")').prop('title',
  5040. 'Apprenti...... ' + 'Portée : ' + 1.5*(+skills.PER+(+skills.PERP)) + "\n" +
  5041. 'Compagnon......' + 'Portée : '+ 2*(+skills.PER+(+skills.PERP)) + "\n" +
  5042. 'Maître...... ' + 'Portée : ' + 2.5*(+skills.PER+(+skills.PERP)) + "\n" +
  5043. 'Grand Maître...... ' + 'Portée : ' + 3*(+skills.PER+(+skills.PERP)) + "\n" );
  5044.  
  5045. $('a:contains("Jet de Pierres")').prop('title',
  5046. 'Apprenti...... ' + 'Portée : 1' + "\n" +
  5047. 'Compagnon......' + 'Portée : 2' + "\n" +
  5048. 'Maître...... ' + 'Portée : 3' + "\n" +
  5049. 'Grand Maître...... ' + 'Portée : 4' );
  5050.  
  5051. $('a:contains("Attaque Défensive")').prop('title',
  5052. 'Apprenti.............. ' + 'ESQ +' + Math.floor(Math.max(skills.ESQ/3,1)) + " | ATT -1\n" +
  5053. 'Compagnon....... ' + 'ESQ +' + Math.floor(Math.max(skills.ESQ/2.5,2)) + " | ATT -1\n" +
  5054. 'Maître................... ' + 'ESQ +' + Math.floor(Math.max(skills.ESQ/2,3)) + " | ATT -1\n" +
  5055. 'Grand Maître..... ' + 'ESQ +' + Math.floor(Math.max(skills.ESQ/1.5,4)) + " | ATT -1");
  5056.  
  5057. $('a:contains("Forme spectrale")').prop('title',
  5058. 'Apprenti...... ' + 'ESQ +3 ARMM +1' + '.... total ARMM après conversion : ' + (Math.floor(skills.ARMP*0.15)+(+skills.ARMM)+1) + "\n" +
  5059. 'Compagnon......' + 'ESQ +4 ARMM +2' + '.... total ARMM après conversion : ' + (Math.floor(skills.ARMP*0.20)+(+skills.ARMM)+2) + "\n" +
  5060. 'Maître...... ' + 'ESQ +5 ARMM +3' + '.... total ARMM après conversion : ' + (Math.floor(skills.ARMP*0.25)+(+skills.ARMM)+3) + "\n" +
  5061. 'Grand Maître...... ' + 'ESQ +6 ARMM +4' + '.... total ARMM après conversion : ' + (Math.floor(skills.ARMP*0.30)+(+skills.ARMM)+4));
  5062.  
  5063. $('a:contains("Herboriser")').prop('title',
  5064. 'Apprenti...... ' + 'Portée : ' + 1.5*(+skills.PER+(+skills.PERP+(+skills.PERM))) + " (Fleur,Baie) " + "\n" +
  5065. 'Compagnon......' + 'Portée : '+ 2*(+skills.PER+(+skills.PERP)+(+skills.PERM)) + ' (Fleur,Baie, Plante grasse, Champignon)' + "\n" +
  5066. 'Maître...... ' + 'Portée : ' + 2.5*(+skills.PER+(+skills.PERP)+(+skills.PERM)) + ' (Fleur,Baie, Plante grasse, Champignon, Mousse)' + "\n" +
  5067. 'Grand Maître...... ' + 'Portée : ' + 3*(+skills.PER+(+skills.PERP)+(+skills.PERM)) + ' (tout)');
  5068.  
  5069. $('a:contains("Rafale")').prop('title',
  5070. 'FULL' + "\n" +
  5071. 'Apprenti...... ' + 'DEG ' + skills.DEG + 'D3' + skills.DEGM + ' (pas de malus de REG)' + "\n" +
  5072. 'Compagnon......' + 'DEG ' + skills.DEG + 'D3' + skills.DEGM + ' (Malus REG : ' + (Math.floor(skills.DEG/2)) + 'D3' + ')' + "\n" +
  5073. 'Maître...... ' + 'DEG ' + skills.DEG + 'D3' + skills.DEGM + ' (Malus REG : ' + (Math.floor(skills.DEG)) + 'D3' + ')' + "\n" +
  5074. 'Grand Maître...... ' + 'DEG ' + skills.DEG + 'D3' + skills.DEGM + ' (Malus REG : ' + (Math.floor(skills.DEG*2)) + 'D3' + ')' + "\n" +
  5075. 'RES' + "\n" +
  5076. 'Apprenti...... ' + 'DEG ' + (Math.floor(skills.DEG*0.3)) + 'D3' + skills.DEGM + ' (pas de malus de REG)' + "\n" +
  5077. 'Compagnon......' + 'DEG ' + (Math.floor(skills.DEG*0.4)) + 'D3' + skills.DEGM + ' (pas de malus de REG)' + "\n" +
  5078. 'Maître...... ' + 'DEG ' + (Math.floor(skills.DEG*0.5)) + 'D3' + skills.DEGM + ' (Malus REG : ' + (Math.floor(skills.DEG/2)) + 'D3' + ')' + "\n" +
  5079. 'Grand Maître...... ' + 'DEG ' + (Math.floor(skills.DEG*0.6)) + 'D3' + skills.DEGM + ' (Malus REG : ' + (Math.floor(skills.DEG) + 'D3' + ')')) ;
  5080.  
  5081.  
  5082. // DONS
  5083. $('a:contains("Dans")').prop('title', 'ATTM + ' + skills.danslmil);
  5084. $('a:contains("Limier")').prop('title', 'PERM + ' + skills.limier);
  5085. $('a:contains("Chef")').prop('title', 'Bonus Cuisine : + ' + 5*skills.grandchef);
  5086. $('a:contains("Dur à cuir")').prop('title', '+ ' + skills.duracuir*5 + ' PV');
  5087. };
  5088.  
  5089. function displayNextLevel() {
  5090. // Sélection de la cellule contenant l'expérience
  5091. var gobExperience = $('th:contains("Expérience")').parent().closest('tr');
  5092. var tdExp = $('td:first', gobExperience);
  5093. var sExp = tdExp.html();
  5094.  
  5095. // Récupération des informations à partir du texte
  5096. var regexExp = /Niveau......: (\d+) \((\d+) PI \| Niveau (\d+) : (\d+)/;
  5097. var matchExp = sExp.match(regexExp);
  5098.  
  5099. if (matchExp) {
  5100. var niveau = matchExp[1]; // Récupération du niveau
  5101. var nbPIActuels = matchExp[2]; // Récupération du nombre de PI actuels
  5102. var nextlevel = matchExp[3]; // Récupération du niveau suivant
  5103. var nextPI = matchExp[4]; // Récupération du nombre de PI
  5104. var nbTrain = Math.ceil((nextPI - nbPIActuels) / (2 * nextlevel)); // Calcul du nombre d'entraînements restants
  5105. window.localStorage.setItem('niveau', niveau);
  5106. window.localStorage.setItem('nbPIActuels', nbPIActuels);
  5107. window.localStorage.setItem('nextlevel', nextlevel);
  5108. window.localStorage.setItem('nextPI', nextPI);
  5109. var pExp = sExp.indexOf(")");
  5110. var sTrain = (nbTrain > 1) ? " entraînements" : " entraînement";
  5111. // Modification du contenu de la cellule avec les nouvelles informations
  5112. tdExp.html(sExp.substr(0, pExp + 1) + " ---> Il te reste " + nbTrain + sTrain + sExp.substr(pExp + 1));
  5113.  
  5114.  
  5115. }
  5116.  
  5117.  
  5118. var regexPX = /PX..........: (\d+)/; // Expression régulière pour récupérer PX
  5119. var regexPXPerso = /PX Personnels......: (\d+)/
  5120. var regexPI = /PI..........: (\d+)/
  5121. var matchPx = sExp.match(regexPX);
  5122. var matchPXPerso = sExp.match(regexPXPerso);
  5123. var matchPI = sExp.match(regexPI);
  5124.  
  5125. if (matchPx) {
  5126. var PX = matchPx[1];
  5127. window.localStorage.setItem('PX', PX);
  5128. }
  5129. if (matchPXPerso) {
  5130. var PXperso = matchPXPerso[1];
  5131. window.localStorage.setItem('PXperso', PXperso);
  5132. }
  5133. if (matchPI) {
  5134. var PI = matchPI[1];
  5135. window.localStorage.setItem('PI', PI);
  5136. }
  5137.  
  5138.  
  5139. }
  5140.  
  5141. // Recherche du texte "Date de création" dans toute la page
  5142. var searchText = "Date de création";
  5143. var elementsContainingText = [...document.querySelectorAll('body, body *')].filter(element => element.textContent.includes(searchText));
  5144.  
  5145. // Recherche de l'élément contenant le texte spécifique
  5146. var dateCreationElement;
  5147. elementsContainingText.forEach(function(element) {
  5148. if (element.textContent.includes(searchText)) {
  5149. dateCreationElement = element;
  5150. }
  5151. });
  5152.  
  5153. // Sélection de l'élément contenant le texte
  5154. var textElement = document.querySelector('.gfmm > table:nth-child(1) > tbody:nth-child(1) > tr:nth-child(1) > td:nth-child(2)');
  5155.  
  5156. if (textElement) {
  5157. var textLines = textElement.textContent.trim().split('\n');
  5158. var dateCreationLine = textLines.find(line => line.includes('Date de création'));
  5159.  
  5160. if (dateCreationLine) {
  5161. var dateCreation = dateCreationLine.match(/\d{4}-\d{2}-\d{2}/);
  5162.  
  5163. if (dateCreation) {
  5164. console.log("Date de création:", dateCreation[0]);
  5165. var DateCrea = dateCreation[0];
  5166. window.localStorage.setItem('DateCrea',DateCrea);
  5167. // Utilisez dateCreation[0] comme nécessaire ici
  5168. } else {
  5169. console.log("Date de création non trouvée dans la dernière ligne.");
  5170.  
  5171. }
  5172. } else {
  5173. console.log("Ligne contenant la date de création non trouvée.");
  5174. }
  5175. } else {
  5176. console.log("Élément contenant le texte non trouvé.");
  5177. }
  5178.  
  5179. // Sélecteur pour cibler l'élément spécifique
  5180. var selector = '.gfmm > table:nth-child(1) > tbody:nth-child(1) > tr:nth-child(1) > td:nth-child(2)';
  5181.  
  5182. // Récupération de l'élément correspondant au sélecteur
  5183. var dateCreationElement = document.querySelector(selector);
  5184.  
  5185. if (dateCreationElement) {
  5186. var dateCreation = dateCreationElement.textContent.trim();
  5187. console.log("Date de création:", dateCreation);
  5188. // Utilisez dateCreation comme nécessaire ici
  5189. } else {
  5190. console.log("Élément contenant la date de création non trouvé.");
  5191. }
  5192. function buildSkillsStats() {
  5193. // Recup position et PER
  5194. var gobPosition = $('th:contains("Position")').parent().closest('tr').text();
  5195. var pos = gobPosition.match(/X = ([-]*\d+) \| Y = ([-]*\d+) \| N = ([-]*\d+)/);
  5196.  
  5197. skills.X = pos[1];
  5198. skills.Y = pos[2];
  5199. skills.N = pos[3];
  5200. var XYN = pos[1] + ', '+ pos[2] +', ' + pos[3] ;
  5201. window.localStorage.setItem('XYN', XYN);
  5202.  
  5203.  
  5204. var per = gobPosition.match(/Perception......: (\d+)/);
  5205. skills.PER = per[1];
  5206. var perp = gobPosition.match(/Cases (\W(\d+))/);
  5207. skills.PERP = perp[1];
  5208. var perm = gobPosition.match(/Cases (\W(\d+))(\W(\d+))/);
  5209. skills.PERM = perm[3];
  5210.  
  5211. var permax = +skills.PER + +skills.PERP + +skills.PERM
  5212. window.localStorage.setItem('permax', permax);
  5213.  
  5214. // Recup de la concentration (pour la modif css plus haut)
  5215. var concentration = $('th:contains("Affinités")').parent().closest('tr').text();
  5216. var conc = concentration.match(/Bonus de concentration : (\-\d+|\d+)/);
  5217. skills.CON = conc[1];
  5218.  
  5219.  
  5220. // Recup de la dla
  5221. var gobdla = $('th:contains("Echéance du Tour")').parent().closest('tr').text();
  5222. var dla = gobdla.match(/(\d+)-(\d+)-(\d+)/);
  5223. skills.DLA = dla[1];
  5224.  
  5225.  
  5226. // Recup PV, PVMax et REG
  5227. var gobSante = $('th:contains("Santé")').parent().closest('tr');
  5228. var tdSante = $('td:first', gobSante);
  5229. res = tdSante.html().split(/<BR>/i); //gobSante.match(/: (\d+)([^:]+): (\d+)([^:]+): (\d+)/);
  5230. skills.PV = res[0].match(/: (\d+)/)[1];
  5231. skills.PVMax = res[1].match(/: (\d+)/)[1];
  5232.  
  5233.  
  5234. var regensgob = $('td:contains("Régénération")').parent().closest('tr').text();
  5235. var reg = regensgob.match(/Régénération..: (\d+)/);
  5236. skills.REG = reg[1];
  5237. var regp = regensgob.match(/D3(\W(\d+))/);
  5238. skills.REGP = regp[1];
  5239. var regm = regensgob.match(/D3(\W(\d+))(\W(\d+))/);
  5240. skills.REGM = regm[3];
  5241.  
  5242. /// recup DEG
  5243. var degatsgob = $('div:contains("Dégâts")').parent().closest('tr').text();
  5244. var deg = degatsgob.match(/: (\d+)/);
  5245. skills.DEG = deg[1];
  5246. var degp = degatsgob.match(/D3(\W(\d+))/);
  5247. skills.DEGP = degp[1];
  5248. var degm = degatsgob.match(/D3(\W(\d+))(\W(\d+))/);
  5249. skills.DEGM = degm[3];
  5250.  
  5251. /// recup ARM
  5252. var armuresgob = $('div:contains("Armure")').parent().closest('tr').text();
  5253. var armp = armuresgob.match(/Armure.....: (\d+)/);
  5254. skills.ARMP = armp[1];
  5255. var armm = armuresgob.match(/Armure.....: (\d+)(\W)(\d+)/);
  5256. skills.ARMM = armm[3];
  5257.  
  5258. /// recup ATT
  5259. var attaquesgob = $('td:contains("Attaque")').parent().closest('tr').text();
  5260. var att = attaquesgob.match(/Attaque.....: (\d+)/);
  5261. skills.ATT = att[1];
  5262. var attp = attaquesgob.match(/Attaque.....: (\d+)D6(\W(\d+))/);
  5263. skills.ATTP = attp[2];
  5264. var attm = attaquesgob.match(/Attaque.....: (\d+)D6(\W(\d+))(\W(\d+))/);
  5265. skills.ATTM = attm[4];
  5266.  
  5267. /// recup ESQ
  5268. var esquivesgob = $('td:contains("Esquive")').parent().closest('tr').text();
  5269. var esq = esquivesgob.match(/Esquive....: (\d+)/);
  5270. skills.ESQ = esq[1];
  5271. var esqp = esquivesgob.match(/Esquive....: (\d+)D6(\W(\d+))(\W)(\d+)/);
  5272. skills.ESQP = esqp[2];
  5273. var esqm = esquivesgob.match(/Esquive....: (\d+)D6(\W)(\d+)(\W(\d+))/);
  5274. skills.ESQM = esqm[4];
  5275. };
  5276.  
  5277. function getDon(don) {
  5278. try {
  5279. return $('td:contains("' + don + '")').next('td').text().match(/(\d) (\W) (\d)/)[1];
  5280. } catch (err) {
  5281. return null;
  5282. }
  5283. };
  5284.  
  5285. function buildSkillsMagie() {
  5286. //recup dons
  5287. skills.danslmil = getDon("Dans");
  5288. skills.limier = getDon("Limier");
  5289. skills.grandchef = getDon("Grand Chef");
  5290. skills.duracuir = getDon("Dur à cuir");
  5291.  
  5292. ///recup Magies (a finir)
  5293. skills.RM = $('td.invisible:contains("(RM)")').next('td').text().match(/= ([-]*\d+)/)[1];
  5294. skills.RMP = $('td.invisible:contains("(RM)")').next('td').text().match(/(\d+)(\W(\d+))/)[1];
  5295. skills.RMM = $('td.invisible:contains("(RM)")').next('td').text().match(/(\d+)(\W(\d+))/)[2];
  5296.  
  5297. skills.MM = $('td.invisible:contains("(MM)")').next('td').text().match(/= ([-]*\d+)/)[1];
  5298. skills.MMP = $('td.invisible:contains("(MM)")').next('td').text().match(/(\d+)(\W(\d+))/)[1];
  5299. skills.MMM = $('td.invisible:contains("(MM)")').next('td').text().match(/(\d+)(\W(\d+))/)[2];
  5300.  
  5301. skills.RS = $('td.invisible:contains("(RS)")').next('td').text().match(/= ([-]*\d+)/)[1];
  5302. skills.RSP = $('td.invisible:contains("(RS)")').next('td').text().match(/(\d+)(\W(\d+))/)[1];
  5303. skills.RSM = $('td.invisible:contains("(RS)")').next('td').text().match(/(\d+)(\W(\d+))/)[2];
  5304.  
  5305. skills.MS = $('td.invisible:contains("(MS)")').next('td').text().match(/= ([-]*\d+)/)[1];
  5306. skills.MSP = $('td.invisible:contains("(MS)")').next('td').text().match(/(\d+)(\W(\d+))/)[1];
  5307. skills.MSM = $('td.invisible:contains("(MS)")').next('td').text().match(/(\d+)(\W(\d+))/)[2];
  5308.  
  5309. skills.RT = $('td.invisible:contains("(RT)")').next('td').text().match(/= ([-]*\d+)/)[1];
  5310. skills.RTP = $('td.invisible:contains("(RT)")').next('td').text().match(/(\d+)(\W(\d+))/)[1];
  5311. skills.RTM = $('td.invisible:contains("(RT)")').next('td').text().match(/(\d+)(\W(\d+))/)[2];
  5312.  
  5313. skills.MT = $('td.invisible:contains("(MT)")').next('td').text().match(/= ([-]*\d+)/)[1];
  5314. skills.MTP = $('td.invisible:contains("(MT)")').next('td').text().match(/(\d+)(\W(\d+))/)[1];
  5315. skills.MTM = $('td.invisible:contains("(MT)")').next('td').text().match(/(\d+)(\W(\d+))/)[2];
  5316.  
  5317. skills.RC = $('td.invisible:contains("(RC)")').next('td').text().match(/= ([-]*\d+)/)[1];
  5318. skills.RCP = $('td.invisible:contains("(RC)")').next('td').text().match(/(\d+)(\W(\d+))/)[1];
  5319. skills.RCM = $('td.invisible:contains("(RC)")').next('td').text().match(/(\d+)(\W(\d+))/)[2];
  5320.  
  5321. skills.MC = $('td.invisible:contains("(RT)")').next('td').text().match(/= ([-]*\d+)/)[1];
  5322. skills.MCP = $('td.invisible:contains("(RT)")').next('td').text().match(/(\d+)(\W(\d+))/)[1];
  5323. skills.MCM = $('td.invisible:contains("(RT)")').next('td').text().match(/(\d+)(\W(\d+))/)[2];
  5324.  
  5325. skills.RP = $('td.invisible:contains("(RP)")').next('td').text().match(/= ([-]*\d+)/)[1];
  5326. skills.RPP = $('td.invisible:contains("(RP)")').next('td').text().match(/(\d+)(\W(\d+))/)[1];
  5327. skills.RPM = $('td.invisible:contains("(RP)")').next('td').text().match(/(\d+)(\W(\d+))/)[2];
  5328.  
  5329. skills.MP = $('td.invisible:contains("(MP)")').next('td').text().match(/= ([-]*\d+)/)[1];
  5330. skills.MPP = $('td.invisible:contains("(MP)")').next('td').text().match(/(\d+)(\W(\d+))/)[1];
  5331. skills.MPM = $('td.invisible:contains("(MP)")').next('td').text().match(/(\d+)(\W(\d+))/)[2];
  5332.  
  5333. skills.RR = $('td.invisible:contains("(RR)")').next('td').text().match(/= ([-]*\d+)/)[1];
  5334. skills.RRP = $('td.invisible:contains("(RR)")').next('td').text().match(/(\d+)(\W(\d+))/)[1];
  5335. skills.RRM = $('td.invisible:contains("(RR)")').next('td').text().match(/(\d+)(\W(\d+))/)[2];
  5336. //manque MR
  5337. };
  5338.  
  5339.  
  5340.  
  5341. ///fonction pour récup les ordres des Suivants et les afficher directement dans la section Suivant dans Profil.
  5342.  
  5343. function httpGet(url) {
  5344. return new Promise((resolve, reject) => {
  5345. const xhr = new XMLHttpRequest();
  5346. xhr.open("GET", url);
  5347. xhr.onload = () => {
  5348. if (xhr.status === 200) {
  5349. resolve(xhr.responseText);
  5350. } else {
  5351. reject(xhr.statusText);
  5352. }
  5353. };
  5354. xhr.onerror = () => reject(xhr.statusText);
  5355. xhr.send();
  5356. });
  5357. }
  5358.  
  5359.  
  5360.  
  5361. // Fonction pour récupérer les valeurs stockées dans le localStorage
  5362. function getFollowersNumbers() {
  5363. return localStorage.getItem('followersnumbers');
  5364. }
  5365.  
  5366. function fetchFollowersInfo() {
  5367. const followersNumbers = getFollowersNumbers();
  5368.  
  5369. if (followersNumbers) {
  5370. const baseUrl = 'http://games.gobland.fr/fo_orders.php?IdFO=';
  5371. const numbersArray = JSON.parse(followersNumbers); // Parse le tableau JSON des numéros
  5372.  
  5373. const followersNames = localStorage.getItem('followersnames') || '';
  5374. const namesArray = JSON.parse(followersNames); // Parse le tableau JSON des noms
  5375.  
  5376. const followersData = [];
  5377.  
  5378. numbersArray.forEach((number, index) => {
  5379. const sanitizedNumber = number.replace(/['"\[\]]/g, '');
  5380. const url = baseUrl + sanitizedNumber;
  5381.  
  5382. httpGet(url)
  5383. .then(responseText => {
  5384. const parser = new DOMParser();
  5385. const htmlDoc = parser.parseFromString(responseText, "text/html");
  5386. const xpath = "//html/body/div[3]/div/table/tbody/tr[2]/td[2]/form/table/tbody/tr[4]/td";
  5387. const element = htmlDoc.evaluate(xpath, htmlDoc, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
  5388.  
  5389. if (element) {
  5390. const texte = element.textContent.trim();
  5391. followersData.push({ number: sanitizedNumber, name: namesArray[index], movements: texte });
  5392. } else {
  5393. console.log("Élément non trouvé sur la page", url);
  5394. }
  5395.  
  5396. if (index === numbersArray.length - 1) {
  5397. displayFollowersInfo(followersData);
  5398. }
  5399. })
  5400. .catch(error => {
  5401. console.error("Erreur lors de la récupération de la page", url, ":", error);
  5402.  
  5403. if (index === numbersArray.length - 1) {
  5404. displayFollowersInfo(followersData);
  5405. }
  5406. });
  5407. });
  5408. } else {
  5409. console.log("Pas de numéro de suivants. Visitez (une seule fois) votre page suivant pour récupérer les infos.");
  5410. }
  5411. }
  5412.  
  5413. function displayFollowersInfo(followersData) {
  5414. const insertionPoint = document.querySelector(".gfmm > table:nth-child(1) > tbody:nth-child(1) > tr:nth-child(9) > td:nth-child(2)");
  5415.  
  5416. if (insertionPoint) {
  5417. followersData.forEach(follower => {
  5418. const movements = follower.movements.split(';').filter(Boolean);
  5419. const suivantName = follower.name || '';
  5420.  
  5421. movements.forEach(movement => {
  5422. const formattedMovement = movement.trim();
  5423. const isStop = formattedMovement === 'stop()';
  5424.  
  5425. const span = document.createElement('span');
  5426. span.innerHTML = `<b>${suivantName}</b> - <i>${formattedMovement}</i>`;
  5427.  
  5428. span.querySelector('b').style.fontWeight = 'bold';
  5429. span.querySelector('i').style.fontStyle = 'italic';
  5430.  
  5431. if (isStop) {
  5432. span.style.color = 'red';
  5433. }
  5434.  
  5435. insertionPoint.appendChild(span);
  5436. insertionPoint.appendChild(document.createElement('br'));
  5437. });
  5438. });
  5439. } else {
  5440. console.log('prix spécialité', specialtyPrices);
  5441. }
  5442. }
  5443.  
  5444. fetchFollowersInfo();
  5445. }
  5446.  
  5447.  
  5448.  
  5449. /// Affichage des carats
  5450.  
  5451. const regMinerai = /^(\D*)(\d+)(\D*)$/
  5452. const qualites = {
  5453. 'Médiocre': 2,
  5454. 'Moyenne': 2.75,
  5455. 'Normale': 3.5,
  5456. 'Bonne': 4.25,
  5457. 'Exceptionnelle': 5
  5458. };
  5459.  
  5460. $( document ).ready(function() {
  5461. $('a:contains("taille")').each(function() {
  5462. arr = this.text.match(regMinerai);
  5463. carats = arr[2] * qualites[arr[3].split(' ')[3]];
  5464. this.text = arr[0] + ' [Carats = ' + carats + ']'
  5465. })
  5466. });
  5467.  
  5468.  
  5469.  
  5470. /// Décocher par défaut la case activer sa DLA sur la page de Log-In piqué a Seishin
  5471.  
  5472. (function() {
  5473. 'use strict';
  5474.  
  5475. $('input[type=checkbox][name=aDLA]').prop( "checked", false);
  5476. })();
  5477.  
  5478.  
  5479. // Décocher par défaut le vestaire piqué a Seishin
  5480.  
  5481. (function() {
  5482. 'use strict';
  5483.  
  5484. $('input[type=checkbox][name=VESTIAIRE]').prop( "checked", false );
  5485. })();
  5486.  
  5487.  
  5488.  
  5489.  
  5490. ///fonction RemplaceText () pour remplacer le texte et ajouter des icones dans Gobland (inspiré par Lordslair))
  5491.  
  5492. if ($(location).attr('href').match(/http:\/\/(.*\.)?gobland\.fr\/Vue\.php/i)) {
  5493.  
  5494. const words = {
  5495.  
  5496.  
  5497. // icones monstres
  5498. 'Abishaii Multicolore' : 'Abishaii Multicolore 👁️👁️ 💉',
  5499. 'Abishaii Blanc' : 'Abishaii Blanc 👁️ 💉',
  5500. 'Abishaii Bleu' : 'Abishaii Bleu 👁️ 💉',
  5501. 'Abishaii Noir' : 'Abishaii Noir 👁️ 💉',
  5502. 'Abishaii Rouge' : 'Abishaii Rouge 👁️ 💉',
  5503. 'Abishaii Vert' : 'Abishaii Vert 👁️ 💉',
  5504. 'Ankheg': 'Ankheg 🙈',
  5505. 'Ame-en-peine' : 'Ame-en-peine 👁️',
  5506. 'Amibe Géante' : 'Amibe Géante 🙈 🚨',
  5507. 'Anaconda des Catacombes' : 'Anaconda des Catacombes 🙈',
  5508. 'Araignée Géante' : 'Araignée Géante 🙈' ,
  5509. 'Arbre à gobelins' : 'Arbre à gobelins 🙈',
  5510. 'Automate' : 'Automate 👁️👁️',
  5511. 'Barghest' : 'Barghest 👁️👁️',
  5512. 'Babélien' : 'Babélien 🙈',
  5513. 'Basilic' : 'Basilic 🙈 🚨',
  5514. 'Béhir' : 'Béhir 👁️ 🚨',
  5515. 'Boggart' : 'Boggart 🙈',
  5516. 'Bondin' : 'Bondin 🙈 ',
  5517. 'Brontoscorpion' : 'Brontoscorpion 🙈',
  5518. 'Bulette' : 'Bulette 👁️',
  5519. 'Cattis' : 'Cattis 👁️👁️' ,
  5520. 'Caillouteux' : 'Caillouteux 🙈',
  5521. 'Cerbère' : 'Cerbère 👁️👁️👁️ 💉💉',
  5522. 'Centaure' : 'Centaure 🙈' ,
  5523. 'Chauve-souris Géante' : 'Chauve-souris Géante 🙈',
  5524. 'Chimère' : 'Chimère 👁️👁️ 🚨' ,
  5525. 'Cockatrice' : 'Cockatrice 🙈 🚨',
  5526. 'Colosse de pierre' : 'Colosse de pierre 👁️👁️👁️',
  5527. 'Crapaud démoniaque' : 'Crapaud démoniaque 👁️',
  5528. 'Crapaud Géant' : 'Crapaud Géant 🙈',
  5529. 'Croquemitaine' : 'Croquemitaine 🙈',
  5530. 'Cyclope' : 'Cyclope 🙈',
  5531. 'Danseur de Mort' : 'Danseur de Mort 👁️',
  5532. 'Diablotin' : 'Diablotin 👁️',
  5533. 'Dao' : 'Dao 👁️👁️',
  5534. 'Dumb' : 'Dumb 🙈',
  5535. 'Djinn' : 'Djinn 👁️👁️',
  5536. 'Dragon' : 'Dragon 🔥',
  5537. 'Dryade' : 'Dryade 👁️👁️👁️',
  5538. 'Effrit' : 'Effrit 🔥 ',
  5539. 'Elémentaire de Terre' : 'Elémentaire de Terre 👁️ 🔥',
  5540. "Elémentaire d'Eau" : "Elémentaire d'Eau 👁️ 🔥",
  5541. 'Elémentaire de Feu' : 'Elémentaire de Feu 👁️ 🔥',
  5542. 'Elfe' : 'Elfe 🙈',
  5543. 'Ent' : 'Ent 👁️👁️',
  5544. 'Erinyes' : 'Erinyes 👁️ 🚨',
  5545. 'Escargot' : 'Escargot 🙈',
  5546. 'Ettercap' : 'Ettercap 🙈',
  5547. 'Ettin' : 'Ettin 🙈',
  5548. 'Eusmilus' : 'Eusmilus 🙈',
  5549. 'Fantôme' : 'Fantôme 🙈',
  5550. 'Feu follet' : 'Feu follet 🙈 🔥',
  5551. 'Fongoïde' : 'Fongoïde 🙈',
  5552. 'Furgolin' : 'Furgolin 🙈',
  5553. 'Fungus Géant' : 'Fungus Géant 👁️',
  5554. 'Fungus Violet' : 'Fungus Violet 👁️👁️',
  5555. 'Galopin' : 'Galopin 🙈',
  5556. 'Géant des Collines' : 'Géant des Collines 🙈',
  5557. 'Géant du Feu' : 'Géant du Feu 🙈',
  5558. 'Géant des Nuages' : 'Géant des Nuages 👁️',
  5559. 'Géant des Tempêtes' : 'Géant des Tempêtes 👁️',
  5560. 'Géant du Froid' : 'Géant du Froid 👁️',
  5561. 'Géant de Pierre' : 'Géant de Pierre 👁️',
  5562. 'Gnoll' : 'Gnoll 🙈',
  5563. 'Gnome de pierre' : 'Gnome de pierre 👁️',
  5564. 'Gelée ocre' : 'Gelée ocre 🙈 🚨',
  5565. 'Glouton' : 'Glouton 🙈',
  5566. 'Glouton Sanguinaire' : 'Glouton Sanguinaire 🙈',
  5567. 'Gnome Artificier' : 'Gnome Artificier 🙈',
  5568. 'Goblours' : 'Goblours 🙈',
  5569. 'Golem de Fer' : 'Golem de Fer 🙈',
  5570. 'Golem de Pierre' : 'Golem de Pierre 🙈',
  5571. 'Gorille démoniaque' : 'Gorille démoniaque 🙈 🚨',
  5572. 'Gorgone' : 'Gorgone 👁️ 🚨',
  5573. 'Goule' : 'Goule 👁️',
  5574. 'Gremlins' : 'Gremlins 🙈',
  5575. 'Grouilleux' : 'Grouilleux 🙈',
  5576. 'Griffon' : 'Griffon 👁️',
  5577. 'Guêpe géante' : 'Guêpe géante 👁️ 💉',
  5578. 'Harpie' : 'Harpie 🙈',
  5579. 'Hellrot' : 'Hellrot 👁️👁️',
  5580. 'Homme-Lézard' : 'Homme-Lézard 🙈',
  5581. 'Homothérium' : 'Homothérium 👁️',
  5582. 'Horreur chasseresse' : 'Horreur chasseresse 👁️👁️',
  5583. 'Hippopotame furieux' : 'Hippopotame furieux 🙈',
  5584. 'Hippogriffe' : 'Hippogriffe 👁️',
  5585. 'Halfelin' : 'Halfelin 🙈',
  5586. 'Hurleur' : 'Hurleur 🙈 🚨',
  5587. 'Incube' : 'Incube 👁️',
  5588. 'Illithid' : 'Illithid 👁️👁️👁️',
  5589. 'Kappa' : 'Kappa 🙈',
  5590. 'Kobold' : 'Kobold 🙈',
  5591. 'Lacodon' : 'Lacodon 🙈 🚨',
  5592. 'Lapin Sanguinaire' : 'Lapin Sanguinaire 🙈',
  5593. 'Larbin démoniaque' : 'Larbin démoniaque 👁️',
  5594. 'Légion-en-peine' : 'Légion-en-peine 👁️👁️ 😵',
  5595. 'Lémure' : 'Lémure 👁️',
  5596. 'Lézard Géant' : 'Lézard Géant 🙈',
  5597. 'Licorne' : 'Licorne 🙈 🚨',
  5598. 'Limace Géante' : ' Limace Géante 🙈 🚨',
  5599. 'Loup-garou' : 'Loup-garou 🙈',
  5600. 'Lutin' : 'Lutin 🙈 💉',
  5601. 'Macrauchenia' : 'Macrauchenia 🙈' ,
  5602. 'Mante religieuse géante' : 'Mante religieuse géante 🙈 🚨',
  5603. 'Manticore' : 'Manticore 🙈',
  5604. 'Marid' : 'Marid 👁️👁️',
  5605. 'Marmotte' : 'Marmotte 🙈' ,
  5606. 'Méduse' : 'Méduse 🙈 🚨',
  5607. 'Meganeura' : 'Meganeura 🙈',
  5608. 'Megantereon' : 'Megantereon 🙈',
  5609. 'Méphite Aérien' : 'Méphite Aérien 🙈 🔥',
  5610. 'Méphite de Feu' : 'Méphite de Feu 🙈 🔥',
  5611. 'Méphite Aqueux' : 'Méphite Aqueux 🙈 🔥' ,
  5612. 'Méphite de Glace' : 'Méphite de Glace 🙈 🔥',
  5613. 'Méphite de Verre' : 'Méphite de Verre 🙈 🔥',
  5614. 'Méphite Magmatique' : 'Méphite Magmatique 🙈 🔥',
  5615. 'Méphite Sulfureux' : 'Méphite Sulfureux 🙈 🔥',
  5616. 'Mille-pattes géant' : 'Mille-pattes géant 👁️ ',
  5617. 'Mimique' : 'Mimique 🙈 🚨',
  5618. 'Minotaure' : 'Minotaure 🙈',
  5619. 'Molosse Satanique' : 'Molosse Satanique 👁️ 🔥',
  5620. 'Momie' : 'Momie 👁️ ',
  5621. 'Monstre Rouilleur' : 'Monstre Rouilleur 🙈',
  5622. 'Naga' : 'Naga 🙈 ',
  5623. 'Nécrophage' : 'Nécrophage 🙈 💉',
  5624. "Nuage d'insectes" : "Nuage d'insectes 🙈",
  5625. 'Nuée de Vermines' : 'Nuée de Vermines 🙈',
  5626. 'Ombre' : 'Ombre 👁️',
  5627. 'Ondine' : 'Ondine 👁️ 🔥',
  5628. 'Oni' : 'Oni 👁️👁️ 😵 🚨',
  5629. 'Oiseau-Tonnerre' : 'Oiseau-Tonnerre 🙈',
  5630. 'Onyx' : 'Onyx 🙈',
  5631. 'Orque Noir' : 'Orque Noir 🙈',
  5632. 'Otyugh' : 'Otyugh 🙈',
  5633. 'Ours hibou' : 'Ours hibou 👁️ ',
  5634. 'Ours des Montagnes' : 'Ours des Montagnes 🙈',
  5635. 'Orque': 'Orque 🙈',
  5636. 'Plante Carnivore' : 'Plante Carnivore 👁️',
  5637. 'Pégase' : 'Pégase 🙈',
  5638. 'Pseudo-Dragon' : 'Pseudo-Dragon 🙈',
  5639. 'Rakshah' : 'Rakshah 👁️👁️',
  5640. 'Rat-garou' : 'Rat-garou 🙈',
  5641. 'Rat Géant' : 'Rat Géant 🙈',
  5642. 'Rocketeux' : 'Rocketeux 🙈',
  5643. 'Sagouin' : 'Sagouin 🙈',
  5644. 'Scarabée Géant' : 'Scarabée Géant 🙈 💉',
  5645. 'Shai' : 'Shai 👁️👁️ 🔥',
  5646. 'Sphinx' : 'Sphinx 👁️👁️',
  5647. 'Slaad' : 'Slaad 🙈',
  5648. 'Salamandre' : 'Salamandre 👁️ 🔥',
  5649. 'Strige': 'Strige 🙈',
  5650. 'Squelette' : 'Squelette 👁️',
  5651. 'Spectre' : 'Spectre 👁️',
  5652. 'Sprigan' : 'Sprigan 🙈',
  5653. 'Sylphide' : 'Sylphide 👁️ 🔥',
  5654. 'Taureau démoniaque' : 'Taureau démoniaque 👁️👁️ 🚨',
  5655. 'Tertre errant' : 'Tertre errant 👁️ 🚨',
  5656. 'Thri-kreen' : 'Thri-kreen 🙈',
  5657. 'Tigre à Dents de Sabre' : 'Tigre à Dents de Sabre 🙈',
  5658. 'Tigre-garou' : 'Tigre-garou 🙈',
  5659. 'Titan' : 'Titan 🙈',
  5660. 'Tortue Carnivore' : 'Tortue Carnivore 🙈',
  5661. 'Tutoki': 'Tutoki 🙈 🚨',
  5662. 'Troglodyte' : 'Troglodyte 👁️',
  5663. 'Troll' : 'Troll 👁️',
  5664. 'Vampire \\b' : 'Vampire 👁️👁️ 😵',
  5665. 'Vampire Archaïque' : 'Vampire Archaïque 👁️👁️ 😵',
  5666. 'Viverne' : 'Viverne 🙈 💉💉',
  5667. 'Ver Géant Carnivore' : 'Ver Géant Carnivore 🙈',
  5668. 'Worg' : 'Worg 🙈',
  5669. 'Yéti' : 'Yéti 🙈 🚨',
  5670. 'Zombi' : 'Zombi 👁️',
  5671.  
  5672. };
  5673.  
  5674.  
  5675. const tagsWhitelist = ['PRE', 'BLOCKQUOTE', 'CODE', 'INPUT', 'BUTTON', 'TEXTAREA'];
  5676.  
  5677. function prepareRegex(string) {
  5678. return string.replace(/(\({2}|([\[\]\^\&\$\.\?\/\\\+\{\}])|\)$)/g, '\\$1');
  5679. }
  5680.  
  5681.  
  5682.  
  5683.  
  5684. function getTooltipText(icon) {
  5685. switch (icon) {
  5686.  
  5687.  
  5688. case 'Ankheg 🙈':
  5689. case 'Amibe Géante 🙈':
  5690. case 'Anaconda des Catacombes 🙈':
  5691. case 'Araignée Géante 🙈' :
  5692. case 'Arbre à gobelins 🙈':
  5693. case 'Babélien 🙈':
  5694. case 'Basilic 🙈':
  5695. case 'Boggart 🙈':
  5696. case 'Bondin 🙈':
  5697. case 'Caillouteux 🙈':
  5698. case 'Centaure 🙈' :
  5699. case 'Chauve-souris Géante 🙈':
  5700. case 'Cockatrice 🙈':
  5701. case 'Crapaud Géant 🙈':
  5702. case 'Croquemitaine 🙈':
  5703. case 'Cyclope 🙈':
  5704. case 'Dumb 🙈':
  5705. case 'Elfe 🙈':
  5706. case 'Escargot 🙈':
  5707. case 'Ettin 🙈':
  5708. case 'Eusmilus 🙈':
  5709. case 'Fantôme 🙈':
  5710. case 'Fongoïde 🙈':
  5711. case 'Furgolin 🙈':
  5712. case 'Galopin 🙈':
  5713. case 'Géant des Collines 🙈':
  5714. case 'Géant du Feu 🙈' :
  5715. case 'Gnoll 🙈':
  5716. case 'Gelée ocre 🙈':
  5717. case 'Glouton 🙈':
  5718. case 'Glouton Sanguinaire 🙈':
  5719. case 'Gnome Artificier ':
  5720. case 'Goblours 🙈':
  5721. case 'Golem de Fer 🙈':
  5722. case 'Golem de Pierre 🙈':
  5723. case 'Gorille démoniaque 🙈':
  5724. case 'Gremlins 🙈':
  5725. case 'Grouilleux 🙈':
  5726. case 'Harpie 🙈':
  5727. case 'Homme-Lézard 🙈':
  5728. case 'Hippopotame furieux 🙈':
  5729. case 'Halfelin 🙈':
  5730. case 'Hurleur 🙈':
  5731. case 'Kappa 🙈':
  5732. case 'Kobold 🙈':
  5733. case 'Lacodon 🙈':
  5734. case 'Lapin Sanguinaire 🙈':
  5735. case 'Lézard Géant 🙈':
  5736. case 'Licorne 🙈':
  5737. case 'Limace Géante 🙈':
  5738. case 'Loup-garou 🙈':
  5739. case 'Macrauchenia 🙈':
  5740. case 'Mante religieuse géante 🙈':
  5741. case 'Manticore 🙈':
  5742. case 'Marmotte 🙈':
  5743. case 'Méduse 🙈':
  5744. case 'Meganeura 🙈':
  5745. case 'Megantereon 🙈':
  5746. case 'Mimique 🙈':
  5747. case 'Minotaure 🙈':
  5748. case 'Monstre Rouilleur 🙈':
  5749. case 'Naga 🙈':
  5750. case "Nuage d'insectes 🙈":
  5751. case 'Nuée de Vermines 🙈':
  5752. case 'Oiseau-Tonnerre 🙈':
  5753. case 'Onyx 🙈':
  5754. case 'Orque Noir 🙈':
  5755. case 'Otyugh 🙈':
  5756. case 'Ours des Montagnes 🙈':
  5757. case 'Orque 🙈':
  5758. case 'Pégase 🙈':
  5759. case 'Pseudo-Dragon 🙈':
  5760. case 'Rat-garou 🙈':
  5761. case 'Rat Géant 🙈':
  5762. case 'Rocketeux 🙈':
  5763. case 'Sagouin 🙈':
  5764. case 'Slaad 🙈':
  5765. case 'Sprigan 🙈':
  5766. case 'Strige 🙈':
  5767. case 'Thri-kreen 🙈':
  5768. case 'Tigre à Dents de Sabre 🙈':
  5769. case 'Tigre-garou 🙈':
  5770. case 'Titan 🙈':
  5771. case 'Tortue Carnivore 🙈':
  5772. case 'Tutoki 🙈':
  5773. case 'Ver Géant Carnivore 🙈':
  5774. case 'Worg 🙈':
  5775. case 'Yéti 🙈':
  5776.  
  5777. return "Ne voit pas le caché";
  5778.  
  5779.  
  5780. case 'Ame-en-peine 👁️':
  5781. case 'Béhir 👁️':
  5782. case 'Bulette 👁️':
  5783. case 'Crapaud démoniaque 👁️':
  5784. case 'Danseur de Mort 👁️':
  5785. case 'Diablotin 👁️':
  5786. case 'Erinyes 👁️':
  5787. case 'Fungus Géant 👁️':
  5788. case 'Géant des Nuages 👁️':
  5789. case 'Géant des Tempêtes 👁️':
  5790. case 'Géant du Froid 👁️':
  5791. case 'Géant de Pierre 👁️':
  5792. case 'Gnome de pierre 👁️':
  5793. case 'Gorgone 👁️':
  5794. case 'Goule 👁️':
  5795. case 'Griffon 👁️':
  5796. case 'Homothérium 👁️':
  5797. case 'Hippogriffe 👁️':
  5798. case 'Incube 👁️':
  5799. case 'Larbin démoniaque 👁️':
  5800. case 'Lémure 👁️':
  5801. case 'Mille-pattes géant 👁️':
  5802. case 'Momie 👁️':
  5803. case 'Ombre 👁️':
  5804. case 'Ours hibou 👁️':
  5805. case 'Plante Carnivore 👁️':
  5806. case 'Squelette 👁️':
  5807. case 'Spectre 👁️':
  5808. case 'Tertre errant 👁️':
  5809. case 'Troglodyte 👁️':
  5810. case 'Troll 👁️':
  5811. case 'Zombi 👁️':
  5812.  
  5813. return "Voit très partiellement le caché";
  5814.  
  5815.  
  5816. case 'Automate 👁️👁️':
  5817. case 'Barghest 👁️👁️':
  5818. case 'Cattis 👁️👁️':
  5819. case 'Chimère 👁️👁️':
  5820. case 'Dao 👁️👁️':
  5821. case 'Djinn 👁️👁️':
  5822. case 'Ent 👁️👁️':
  5823. case 'Hellrot 👁️👁️':
  5824. case 'Horreur chasseresse 👁️👁️':
  5825. case 'Marid 👁️👁️':
  5826. case 'Rakshah 👁️👁️':
  5827. case 'Sphinx 👁️👁️':
  5828. case 'Taureau démoniaque 👁️👁️':
  5829. case 'Fungus Violet 👁️👁️':
  5830.  
  5831. return "Voit partiellement le caché";
  5832.  
  5833.  
  5834. case 'Colosse de pierre 👁️👁️👁️':
  5835. case 'Dryade 👁️👁️👁️':
  5836. case 'Illithid 👁️👁️👁️':
  5837.  
  5838. return "Voit completement le caché";
  5839.  
  5840. case 'Oni 👁️👁️ 😵':
  5841. case 'Légion-en-peine 👁️👁️ 😵':
  5842. case 'Vampire 👁️👁️ 😵':
  5843. case 'Vampire Archaïque 👁️👁️ 😵':
  5844.  
  5845. return "Voit partiellement le caché et Drain d'énergie";
  5846.  
  5847. case 'Dragon 🔥':
  5848. case 'Effrit 🔥 ':
  5849.  
  5850. return "Dégats de zone";
  5851.  
  5852.  
  5853. case 'Abishaii Blanc 👁️ 💉':
  5854. case 'Abishaii Bleu 👁️ 💉':
  5855. case 'Abishaii Noir 👁️ 💉':
  5856. case 'Abishaii Rouge 👁️ 💉':
  5857. case 'Abishaii Vert 👁️ 💉':
  5858. case 'Guêpe géante 👁️ 💉':
  5859.  
  5860. return "Voit très partiellement le caché et venin";
  5861.  
  5862. case 'Lutin 🙈 💉':
  5863. case 'Scarabée Géant 🙈 💉':
  5864. case 'Nécrophage 🙈 💉':
  5865.  
  5866. return "Ne voit pas le caché et venin";
  5867.  
  5868. case 'Méphite Aérien 🙈 🔥':
  5869. case 'Méphite de Feu 🙈 🔥':
  5870. case 'Méphite Aqueux 🙈 🔥' :
  5871. case 'Méphite de Glace 🙈 🔥':
  5872. case 'Méphite de Verre 🙈 🔥':
  5873. case 'Méphite Magmatique 🙈 🔥':
  5874. case 'Méphite Sulfureux 🙈 🔥':
  5875.  
  5876. return "Ne voit pas le caché et dégats de zone";
  5877. case 'Elémentaire de Terre 👁️ 🔥':
  5878. case 'Molosse Satanique 👁️ 🔥':
  5879. case 'Ondine 👁️ 🔥':
  5880. case 'Salamandre 👁️ 🔥':
  5881. case 'Sylphide 👁️ 🔥':
  5882. case 'Elémentaire de Terre 👁️ 🔥':
  5883. case "Elémentaire d'Eau 👁️ 🔥":
  5884. case 'Elémentaire de Feu 👁️ 🔥':
  5885.  
  5886. return "Voit très partiellement le caché et dégats de zone";
  5887.  
  5888. case 'Shai 👁️👁️ 🔥':
  5889. return "Voit partiellement le caché et dégats de zone";
  5890. case 'Viverne 🙈 💉💉':
  5891. return "Ne voit pas le caché et venin virulent";
  5892. case 'Feu follet 🙈 🔥':
  5893. return "Ne voit pas le caché et dégats de zone et venin virulent";
  5894. case 'Cerbère 👁️👁️👁️ 💉💉':
  5895. return "Voit completement le caché et venin virulent";
  5896. case 'Abishaii Multicolore 👁️👁️ 💉':
  5897. return "Voit partiellement le caché et venin";
  5898.  
  5899.  
  5900.  
  5901. }
  5902. }
  5903.  
  5904. $(document).ready(function() {
  5905. 'use strict';
  5906.  
  5907.  
  5908.  
  5909. var regexs = [],
  5910. replacements = [],
  5911. rIsRegexp = /^\/(.+)\/([gim]+)?$/,
  5912. word, text, texts, i, userRegexp;
  5913.  
  5914. for (word in words) {
  5915. if (typeof word === 'string' && words.hasOwnProperty(word)) {
  5916. userRegexp = word.match(rIsRegexp);
  5917.  
  5918. // Ajout des expressions régulières et des remplacements
  5919. if (userRegexp) {
  5920. regexs.push(new RegExp(userRegexp[1], 'g'));
  5921. } else {
  5922. regexs.push(new RegExp(prepareRegex(word).replace(/\\?\*/g, function(fullMatch) {
  5923. return fullMatch === '\\*' ? '*' : '[^ ]*';
  5924. }), 'g'));
  5925. }
  5926. replacements.push(words[word]);
  5927. }
  5928. }
  5929.  
  5930. // Sélecteur pour toutes les cellules de la cinquième colonne
  5931. var cells = document.querySelectorAll('#TCREATURES > center:nth-child(1) > table:nth-child(1) > tbody:nth-child(1) > tr > td:nth-child(5)');
  5932.  
  5933. // Boucle à travers toutes les cellules de la cinquième colonne
  5934. cells.forEach(function(cell) {
  5935. var cellContent = cell.textContent;
  5936. var originalContent = cell.innerHTML;
  5937.  
  5938. regexs.forEach(function(value, index) {
  5939. var replacementIcon = replacements[index];
  5940. var tooltipText = getTooltipText(replacementIcon);
  5941.  
  5942. cellContent = cellContent.replace(value, function(match) {
  5943. // Ajout du tooltip avec la signification de l'icône
  5944. return `<span title="${tooltipText}">${replacementIcon}</span>`;
  5945. });
  5946. });
  5947.  
  5948. cell.innerHTML = cellContent;
  5949.  
  5950. // Ajout de la classe 'monster-column' pour empêcher le retour à la ligne
  5951. cell.classList.add('monster-column');
  5952.  
  5953. // Ajout des styles CSS directement ici
  5954. cell.style.whiteSpace = 'nowrap';
  5955.  
  5956.  
  5957. });
  5958.  
  5959.  
  5960.  
  5961.  
  5962. // Création du bouton "Légende"
  5963. var legendButton = document.createElement('button');
  5964. legendButton.textContent = 'Légende';
  5965. legendButton.style.display = 'block';
  5966. legendButton.style.margin = 'auto';
  5967. legendButton.addEventListener('click', function(event) {
  5968. event.stopPropagation(); // Empêche la propagation de l'événement de clic
  5969. // Création de la fenêtre modale pour afficher la légende
  5970. var modal = document.createElement('div');
  5971. modal.style.position = 'fixed';
  5972. modal.style.top = '0';
  5973. modal.style.left = '0';
  5974. modal.style.width = '100%';
  5975. modal.style.height = '100%';
  5976. modal.style.backgroundColor = 'rgba(0, 0, 0, 0.5)';
  5977. modal.style.display = 'flex';
  5978. modal.style.alignItems = 'center';
  5979. modal.style.justifyContent = 'center';
  5980.  
  5981. // Contenu de la légende
  5982. var legendContent = document.createElement('div');
  5983. legendContent.style.backgroundColor = 'rgb(255,235,205)';
  5984. legendContent.style.padding = '20px';
  5985. legendContent.style.borderRadius = '5px';
  5986.  
  5987. // Ajout de chaque élément de la légende
  5988. var legendItems = {
  5989. '🥰': 'créatures amies',
  5990. '🙈': 'ne voit pas le caché',
  5991. '👁️': 'voit très partiellement le caché',
  5992. '👁️👁️': 'voit partiellement le caché',
  5993. '👁️👁️👁️': 'voit complètement le caché',
  5994. '💉': 'venin',
  5995. '🔥': 'PV-',
  5996. '😵': 'drain d\'énergie',
  5997. '🚨': 'enlève de l\'esquive'
  5998. };
  5999.  
  6000. for (var emoji in legendItems) {
  6001. var legendItem = document.createElement('div');
  6002. legendItem.textContent = `${emoji}: ${legendItems[emoji]}`;
  6003. legendContent.appendChild(legendItem);
  6004. }
  6005.  
  6006.  
  6007.  
  6008. //ajout des textes surlignés en couleur
  6009. var highlightText4 = document.createElement('div');
  6010. highlightText4.textContent = 'Gobelin';
  6011. highlightText4.style.backgroundColor = "#ccccff" ;
  6012. highlightText4.style.color = 'black';
  6013. highlightText4.style.padding = '5px';
  6014. highlightText4.style.borderRadius = '5px';
  6015. highlightText4.style.marginTop = '10px';
  6016. // Ajout du texte surligné à la légende
  6017. legendContent.appendChild(highlightText4);
  6018.  
  6019.  
  6020. // Création de l'élément pour le texte "Niveau supérieur à 35"
  6021. var highlightText = document.createElement('div');
  6022. highlightText.textContent = 'Monstre lvl supérieur à 39';
  6023. highlightText.style.backgroundColor = '#f55442';
  6024. highlightText.style.color = 'white';
  6025. highlightText.style.padding = '5px';
  6026. highlightText.style.borderRadius = '5px';
  6027. highlightText.style.marginTop = '10px';
  6028. // Ajout du texte surligné à la légende
  6029. legendContent.appendChild(highlightText);
  6030.  
  6031.  
  6032. var highlightText2 = document.createElement('div');
  6033. highlightText2.textContent = 'Monstre lvl supérieur à 29';
  6034. highlightText2.style.backgroundColor = '#f59c42';
  6035. highlightText2.style.color = 'white';
  6036. highlightText2.style.padding = '5px';
  6037. highlightText2.style.borderRadius = '5px';
  6038. highlightText2.style.marginTop = '10px';
  6039. // Ajout du texte surligné à la légende
  6040. legendContent.appendChild(highlightText2);
  6041.  
  6042.  
  6043. var highlightText3 = document.createElement('div');
  6044. highlightText3.textContent = 'Monstre lvl supérieur à 25';
  6045. highlightText3.style.backgroundColor = '#f5b342';
  6046. highlightText3.style.color = 'white';
  6047. highlightText3.style.padding = '5px';
  6048. highlightText3.style.borderRadius = '5px';
  6049. highlightText3.style.marginTop = '10px';
  6050. // Ajout du texte surligné à la légende
  6051. legendContent.appendChild(highlightText3);
  6052.  
  6053.  
  6054. var highlightText5 = document.createElement('div');
  6055. highlightText5.textContent = 'Vieilles créatures';
  6056. highlightText5.style.backgroundColor = '#c791b1';
  6057. highlightText5.style.color = 'white';
  6058. highlightText5.style.padding = '5px';
  6059. highlightText5.style.borderRadius = '5px';
  6060. highlightText5.style.marginTop = '10px';
  6061. // Ajout du texte surligné à la légende
  6062. legendContent.appendChild(highlightText5);
  6063.  
  6064. var highlightText6 = document.createElement('div');
  6065. highlightText6.textContent = 'Suivant/Créature controlé par un Gob';
  6066. highlightText6.style.backgroundColor = '#ffadde';
  6067. highlightText6.style.color = 'black';
  6068. highlightText6.style.padding = '5px';
  6069. highlightText6.style.borderRadius = '5px';
  6070. highlightText6.style.marginTop = '10px';
  6071. // Ajout du texte surligné à la légende
  6072. legendContent.appendChild(highlightText6);
  6073.  
  6074.  
  6075. // Création de l'élément pour l'espace
  6076. var space = document.createElement('div');
  6077. space.style.height = '10px'; // Vous pouvez ajuster la hauteur selon vos besoins
  6078. // Ajout de l'espace à la légende
  6079. legendContent.appendChild(space);
  6080.  
  6081.  
  6082.  
  6083. // Bouton pour fermer la fenêtre modale
  6084. var closeButton = document.createElement('button');
  6085. closeButton.textContent = 'Fermer';
  6086. closeButton.addEventListener('click', function() {
  6087. document.body.removeChild(modal);
  6088. });
  6089.  
  6090. legendContent.appendChild(closeButton);
  6091. modal.appendChild(legendContent);
  6092.  
  6093. // Ajout de la fenêtre modale à la page
  6094. document.body.appendChild(modal);
  6095. });
  6096.  
  6097. // Sélection de l'élément à côté duquel vous voulez placer le bouton "Légende"
  6098. var referenceElement = document.querySelector('html body div#content div#identite table.gf tbody tr td.gfmm h1');
  6099.  
  6100. // Création d'un conteneur pour les boutons
  6101. var buttonContainer = document.createElement('div');
  6102. buttonContainer.style.marginTop = '10px';
  6103.  
  6104. // Ajout du bouton "Légende" à ce conteneur
  6105. buttonContainer.appendChild(legendButton);
  6106.  
  6107. // Insérer le conteneur des boutons sous l'élément de référence
  6108. referenceElement.parentNode.insertBefore(buttonContainer, referenceElement.nextSibling);
  6109. });
  6110. };
  6111.  
  6112.  
  6113. if ($(location).attr('href').match(/http:\/\/(.*\.)?gobland\.fr\/Vue\.php|http:\/\/(.*\.)?gobland\.fr\/ProfilPerso\.php/i)) {
  6114.  
  6115. const words = {
  6116. // Clan et CM
  6117. '((50125|411|346|330|286|388|386|387|83|407|456|164|407|385|405|393|46237|95720|130171|46237|47717|95720|130171|53|101759|101|50127|95982|108284|100794|94082|108|121|129|141|180|48520|66516|69423|119472|32954|135982|137884|146091|141303|141548|145977|153064|153598|147777|153645|152330|155811|163670|109|122306|90657|171796|177616|176978))' : '🥰',
  6118.  
  6119. // méchants
  6120. '((50|104|151691|270|267))' : '🔴',
  6121.  
  6122.  
  6123. // Icônes équipement
  6124. 'Potion' : 'Potion 🧪',
  6125. 'Parchemin' : 'Parchemin 📜📜📜📜📜📜📜alerte📜📜📜📜📜📜📜📜📜📜',
  6126. 'CT| Canines de Trõll' : ' CT 💰',
  6127. 'Anneau' : 'Anneau 💍 ',
  6128. 'Bouclier' : 'Bouclier 🛡️',
  6129. 'Corps' : 'Corps ☠️',
  6130. 'Arme 1 Main' : 'Arme 1 main 🗡️',
  6131. 'Outil' : "Outil 🔧",
  6132. 'Nourriture' : 'Nouriture 🍔',
  6133. 'Rondin' : 'Rondin 🪵',
  6134.  
  6135. // Dans Mon Profil
  6136. 'Santé' : 'Santé ❤️',
  6137. 'Echéance du Tour' : 'Echéance du Tour⏱️',
  6138. 'Combat' : 'Combat ⚔️',
  6139. 'Affinités' : 'Affinités ✨',
  6140. 'Position' : 'Position 🧭',
  6141. 'Description' : 'Description 📜',
  6142. 'Expérience' : 'Expérience 🇽🇵',
  6143. 'Actions programmées': 'Actions programmées ⏰',
  6144.  
  6145.  
  6146. 'Empathie' : 'Empathie 🫂',
  6147. 'Sociale' : 'Sociale 🫂',
  6148. 'Flux Obscur' : 'Flux Obscur ⚫',
  6149. 'Voile Obscur' : 'Voile Obscur ⚫',
  6150. 'Magie' : 'Magie 🪄',
  6151. 'Psychique' : 'Psychique 🧠',
  6152. 'Physique' : 'Physique 💪',
  6153. 'Corporelle' : 'Corporelle💪',
  6154. 'Technologie' : 'Technologie ⚙️',
  6155.  
  6156. // Diverses icônes
  6157. 'Baguette' : 'Baguette 🪄 ',
  6158. 'Escalier' : 'Escalier 🪜 ',
  6159. //'Baie' : 'Baie 🫐',
  6160. //'Arbre' : 'Arbre 🌳',
  6161. //'Fleur' : 'Fleur 🌷',
  6162. 'Zone de ténèbres' : 'Zone de ténèbres 🌫️',
  6163. 'Porte' : 'Porte 🚪',
  6164. '':''
  6165. };
  6166.  
  6167. const tagsWhitelist = ['PRE', 'BLOCKQUOTE', 'CODE', 'INPUT', 'BUTTON', 'TEXTAREA'];
  6168.  
  6169. function prepareRegex(string) {
  6170. return string.replace(/(\({2}|([\[\]\^\&\$\.\?\/\\\+\{\}])|\)$)/g, '\\$1');
  6171. }
  6172.  
  6173. function isTagOk(tag) {
  6174. return tagsWhitelist.indexOf(tag) === -1;
  6175. }
  6176.  
  6177. function enhanceText() {
  6178. 'use strict';
  6179.  
  6180. // enclenchement des remplacements et ajouts d'icones
  6181. var regexs = [],
  6182. replacements = [],
  6183. rIsRegexp = /^\/(.+)\/([gim]+)?$/,
  6184. word, text, texts, i, userRegexp;
  6185.  
  6186. for (word in words) {
  6187. if ( typeof word === 'string' && words.hasOwnProperty(word) ) {
  6188. userRegexp = word.match(rIsRegexp);
  6189.  
  6190. // add the search/needle/query
  6191. if (userRegexp) {
  6192. regexs.push(new RegExp(userRegexp[1], 'g'));
  6193. } else {
  6194. regexs.push(
  6195. new RegExp(prepareRegex(word).replace(/\\?\*/g, function (fullMatch) {
  6196. return fullMatch === '\\*' ? '*' : '[^ ]*';
  6197. }), 'g')
  6198. );
  6199. }
  6200. replacements.push(words[word]);
  6201. }
  6202. }
  6203.  
  6204. texts = document.evaluate('//body//text()[ normalize-space(.) != "" ]', document, null, 6, null);
  6205. for (i = 0; text = texts.snapshotItem(i); i += 1) {
  6206. if ( tagsWhitelist.indexOf(text.parentNode.tagName) ) {
  6207. regexs.forEach(function (value, index) {
  6208. text.data = text.data.replace( value, replacements[index] );
  6209. });
  6210. }
  6211. }
  6212. };
  6213.  
  6214. $( document ).ready(function() {
  6215. enhanceText();
  6216. });
  6217.  
  6218. };
  6219.  
  6220.  
  6221.  
  6222.  
  6223.