您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Outils d'aide au jeu
// ==UserScript== // @name GobZilla // @namespace Gobland // @description Outils d'aide au jeu // @include http://games.gobland.fr/jeuC.html // @include http://games.gobland.fr/act.php // @include http://games.gobland.fr/Vue.php // @include http://games.gobland.fr/Menu.php // @include http://games.gobland.fr/Meute.php // @include http://games.gobland.fr/ProfilPerso.php // @include http://games.gobland.fr/SmallEquipement.php // @include http://games.gobland.fr/fo_equipement.php* // @include http://games.gobland.fr/Equipement.php // @include http://games.gobland.fr/fo_orders.php* // @include http://games.gobland.fr/amelioration.php // @include http://games.gobland.fr/Follower.php* // @include http://games.gobland.fr/Followers.php** // @include http://games.gobland.fr/Options.php // @include http://games.gobland.fr/activDLA.php // @include http://games.gobland.fr/actions.php // @include http://games.gobland.fr/playActions.php // @include http://games.gobland.fr/goodies.php* // @include http://games.gobland.fr/stock.php?* // @include http://games.gobland.fr/membresClan.php // @include http://games.gobland.fr/Quetes.php // @include http://games.gobland.fr/depot.php* // @match http://games.gobland.fr/index.php* // @match https://games.gobland.fr/index.php* // @match http://games.gobland.fr/playActions.php?todo=52 // @require https://cdnjs.cloudflare.com/ajax/libs/raphael/2.3.0/raphael.js // @require https://greasemonkey.github.io/gm4-polyfill/gm4-polyfill.js // @require https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js // @copyright Lordslair, Seishin, Glak (393) et Death Métal (330) // @author DeathMétal 330 - Glak 393 // @license https://creativecommons.org/licenses/by-sa/4.0/ // @version 2.0.5.0 // @icon https://i.ibb.co/HB9XztJ/gobzilla.jpg // ==/UserScript== // fonction herboriser (test seulement) (function() { 'use strict'; const rangMultiplicateur = { 'Apprenti': 1.5, 'Compagnon': 2, 'Maître': 2.5, 'Grand Maître': 3 }; function askPER() { let per = localStorage.getItem('per_total'); if (!per || isNaN(parseInt(per))) { per = prompt("Entrez votre PER total (PER + bonus éventuel)"); if (per !== null && !isNaN(parseInt(per))) { localStorage.setItem('per_total', per); } } return parseInt(per); } function parsePage() { const content = document.querySelector('#identite .deborde'); if (!content) return; const html = content.innerHTML; const matchCoord = html.match(/X=(-?\d+)\s+Y=(-?\d+)\s+N=(-?\d+)/); if (!matchCoord) return; const x0 = parseInt(matchCoord[1]); const y0 = parseInt(matchCoord[2]); const n0 = parseInt(matchCoord[3]); const directionMatch = html.match(/elle se trouve ([^<]+)/); if (!directionMatch) return; const directionText = directionMatch[1]; const rangMatch = html.match(/en tant que (\w+ ?\w*)/i); const rang = rangMatch ? rangMatch[1].trim() : "Apprenti"; const per = askPER(); if (!per) return; const portéeMax = Math.floor(rangMultiplicateur[rang] * per); const portéeMin = Math.floor(rangMultiplicateur['Apprenti'] * per); // portée min = apprenti const direction = { x: 0, y: 0, n: 0 }; if (directionText.includes('plus en Osten')) direction.x = 1; if (directionText.includes('plus en Western')) direction.x = -1; if (directionText.includes('plus en Nordi')) direction.y = 1; if (directionText.includes('plus en Sudi')) direction.y = -1; if (directionText.includes('plus en Haut')) direction.n = 1; if (directionText.includes('plus en Bas')) direction.n = -1; const nPortéeMin = Math.floor(portéeMin / 2); const nPortéeMax = Math.floor(portéeMax / 2); const xMin = x0 + direction.x * portéeMin; const xMax = x0 + direction.x * portéeMax; const yMin = y0 + direction.y * portéeMin; const yMax = y0 + direction.y * portéeMax; const nMin = n0 + direction.n * nPortéeMin; const nMax = n0 + direction.n * nPortéeMax; const result = ` <div style="border: 2px dashed #4caf50; padding: 8px; margin-top: 10px;"> 📍 <b>Estimation position de la plante</b><br> ➤ Direction : ${directionText}<br> ➤ Coordonnées actuelles : X=${x0}, Y=${y0}, N=${n0}<br> ➤ <b>Fourchette estimée</b> :<br> ⤷ X entre ${Math.min(xMin,xMax)} et ${Math.max(xMin,xMax)}<br> ⤷ Y entre ${Math.min(yMin,yMax)} et ${Math.max(yMin,yMax)}<br> ⤷ N entre ${Math.min(nMin,nMax)} et ${Math.max(nMin,nMax)}<br> (Portée ${rang} : ${portéeMax} cases, profondeur : ${nPortéeMax}) </div> `; content.innerHTML += result; } window.addEventListener('load', parsePage); })(); //================================================================== /// Anaglobiseur (calculateur d'évolutiuon) (page amélioration) //================================================================= if ($(location).attr('href').match(/http:\/\/(.*\.)?gobland\.fr\/amelioration\.php/i)) { // Fonction pour créer les boutons + et - function createButtons(row, currentValue, costValue, price, updateValueFunc, improvements, specialty, characteristic ) { const buttonPlus = document.createElement('button'); buttonPlus.textContent = '+'; const buttonMinus = document.createElement('button'); buttonMinus.textContent = '-'; row.appendChild(buttonMinus); row.appendChild(buttonPlus); buttonPlus.addEventListener('click', () => { const characteristicName = row.children[0].innerText.split('(')[0].trim(); if (characteristicName === 'Durée du Tour') { let upgradesDuration = parseInt(row.children[2].innerText); upgradesDuration--; row.children[2].innerText = upgradesDuration; updateDuration(row, upgradesDuration); costValue += price; row.children[3].innerText = costValue; improvements.innerText = parseInt(improvements.innerText) + 1; // Augmente Nb Améliorations row.children[2].innerText = parseInt(improvements.innerText) + 1 } else if (characteristicName === 'Points de Vie Maximum') { currentValue += 10; costValue += price; row.children[1].innerText = currentValue; row.children[3].innerText = costValue; improvements.innerText = parseInt(improvements.innerText) + 1; // Modifier cette ligne } else { currentValue = updateValueFunc(currentValue, 1); // Augmenter la valeur costValue += price; // Mettre à jour le coût improvements.innerText = parseInt(improvements.innerText) + 1; // Mettre à jour Nb Améliorations row.children[1].innerText = currentValue; // Mettre à jour la colonne "Valeur Actuelle" row.children[3].innerText = costValue; // Mettre à jour la colonne "Coût Amélioration Suivante" } updateTotalCost(); updateDisplayedValues(); calculateLevel(); adjustPricesBasedOnSpecialty(specialiteJoueur); getPriceForSpecialty(specialty, characteristic); }); buttonMinus.addEventListener('click', () => { const characteristicName = row.children[0].innerText.split('(')[0].trim(); if (characteristicName === 'Durée du Tour') { let upgradesDuration = parseInt(row.children[2].innerText); upgradesDuration++; row.children[2].innerText = upgradesDuration; updateDuration(row, upgradesDuration); costValue -= price; row.children[3].innerText = costValue; improvements.innerText = parseInt(improvements.innerText) - 1; // Augmente Nb Améliorations row.children[2].innerText = parseInt(improvements.innerText) - 1; } else if (characteristicName === 'Points de Vie Maximum') { currentValue -= 10; costValue -= price; row.children[1].innerText = currentValue; row.children[3].innerText = costValue; improvements.innerText = parseInt(improvements.innerText) -1; // Modifier cette ligne } else { currentValue = updateValueFunc(currentValue, -1); // Augmenter la valeur costValue -= price; // Mettre à jour le coût improvements.innerText = parseInt(improvements.innerText) + -1; // Mettre à jour Nb Améliorations row.children[1].innerText = currentValue; // Mettre à jour la colonne "Valeur Actuelle" row.children[3].innerText = costValue; // Mettre à jour la colonne "Coût Amélioration Suivante" } updateTotalCost(); updateDisplayedValues(); calculateLevel(); }); } // Fonction pour mettre à jour la colonne Nb Améliorations function updateImprovements(row, change) { let currentImprovements = parseInt(row.children[2].innerText); currentImprovements += change; row.children[2].innerText = currentImprovements; } // Gestion durée du tour (marche mal) // Fonction pour mettre à jour la durée du tour en heures et minutes function updateDuration(row, upgrades) { let newDurationInMinutes = 30 - (upgrades * 3); let currentDurationText = row.children[1].innerText; let currentDurationParts = currentDurationText.split(' '); let currentHours = parseInt(currentDurationParts[0]); let currentMinutes = parseInt(currentDurationParts[3]); let currentDurationInMinutes = currentHours * 60 + currentMinutes; let updatedDuration = currentDurationInMinutes + newDurationInMinutes; let updatedHours = Math.floor(updatedDuration / 60); let remainingMinutes = updatedDuration % 60; row.children[1].innerText = updatedHours + ' heures et ' + remainingMinutes + ' minutes'; } // Fonction pour mettre à jour une valeur en fonction de l'incrément/decrement function updateValue(value, change) { return value + change; } // Sélection des caractéristiques et initialisation des valeurs const characteristics = [ document.querySelectorAll('tr.pair')[1], // Durée du tour document.querySelectorAll('tr.pair')[2], // PV max document.querySelectorAll('tr.pair')[3], // Perception document.querySelectorAll('tr.pair')[4], // Attaque document.querySelectorAll('tr.pair')[5], // Esquive document.querySelectorAll('tr.pair')[6], // Dégâts document.querySelectorAll('tr.pair')[7] // Régénération ]; // Ajout d'une Ligne Total // Sélection de la ligne "Dés de Régénération (+1D3)" const regenerationRow = document.querySelectorAll('tr.pair')[7]; // Modifier le sélecteur si nécessaire // Création de la ligne "Total" const totalRow = document.createElement('tr'); // Colonne 1 (caractéristique) const totalCell1 = document.createElement('td'); totalCell1.textContent = 'Total'; totalRow.appendChild(totalCell1); // Colonne 2 (total des valeurs actuelles) const totalCell2 = document.createElement('td'); totalRow.appendChild(totalCell2); // Colonne 3 (vide pour laisser la colonne Nb Améliorations) const totalCell3 = document.createElement('td'); totalRow.appendChild(totalCell3); // Colonne 4 (total des coûts) const totalCostValue = Array.from(document.querySelectorAll('tr.pair td:nth-child(4)')) .slice(1) // Ignorer la première ligne (en-tête) .reduce((acc, cell) => acc + parseInt(cell.innerText), 0); const totalCell4 = document.createElement('td'); totalCell4.textContent = totalCostValue; totalCell4.title = "total cumulatif des PI dépensés. Basé sur prix 16 sauf regen 30 et spécilité 12"; totalRow.appendChild(totalCell4); // Insérer la ligne "Total" après la ligne "Dés de Régénération (+1D3)" regenerationRow.parentNode.insertBefore(totalRow, regenerationRow.nextSibling); //Gestion des Dons // Récupération des éléments pour chaque don const donsRows = [ document.querySelector('tr.pair:nth-child(13)'), document.querySelector('tr.pair:nth-child(14)'), document.querySelector('tr.pair:nth-child(15)'), document.querySelector('tr.pair:nth-child(16)'), document.querySelector('tr.pair:nth-child(17)') ]; // Tableau des coûts pour chaque don const donsCosts = [10, 20, 10, 10, 10]; // Tableau des améliorations pour chaque don const donsImprovements = donsRows.map(row => row ? parseImprovements(row) - 1 : /* Valeur par défaut */ 0); // Tableau des coûts totaux pour chaque don const donsTotalCosts = donsCosts.map((cost, index) => { if (donsRows[index]) { return calculateTotalCost(cost, donsImprovements[index]); } // Si le don n'est pas trouvé, attribuer une valeur par défaut (par exemple, 0) return /* Valeur par défaut */ 100; }); // Calcul du coût total de tous les dons const totalDonCostValue = donsTotalCosts.reduce((acc, curr) => acc + curr, 0); localStorage.setItem('totalDonCostValue', totalDonCostValue); // Création de la ligne "Total" pour les dons const totalDonRow = document.createElement('tr'); totalDonRow.innerHTML = '<td>Total</td><td></td><td></td><td></td>'; const totalDonCostCell = totalDonRow.querySelector('td:last-child'); totalDonCostCell.textContent = totalDonCostValue; 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)"; // Insérer la ligne "Total" après la dernière ligne de dons const lastDonRow = document.querySelector('tr.pair:last-child'); lastDonRow.parentNode.appendChild(totalDonRow); // Fonction pour extraire le coût d'un don à partir de sa ligne function parseDonCost(row) { if (row) { const costText = row.querySelector('td:nth-child(4)').innerText; return parseInt(costText); } return 0; } // Fonction pour extraire le nombre d'améliorations d'un don à partir de sa ligne function parseImprovements(row) { if (row) { const improvementsText = row.querySelector('td:nth-child(3)').innerText.split(' ')[0]; return parseInt(improvementsText); } return 0; } // Fonction pour calculer le coût total d'un don en fonction de son coût de base et du nombre d'améliorations function calculateTotalCost(baseCost, improvements) { let totalCostDon = 0; for (let i = 1; i <= improvements; i++) { totalCostDon += baseCost * i; } return totalCostDon; } function getPriceForSpecialty(specialty, characteristic) { return specialtyPrices[specialty]?.[characteristic] || defaultPrices[characteristic]; } function adjustPricesBasedOnSpecialty(specialty) { // Réinitialisation des prix par défaut defaultPrices = { 'Durée du Tour': 16, 'Points de Vie Maximum': 16, 'Perception': 16, 'Dés d\'Attaque': 16, 'Dés d\'Esquive': 16, 'Dés de Dégats': 16, 'Dés de Régénération': 30 // Ajoutez d'autres caractéristiques avec leurs prix correspondants }; // Réinitialisation des prix spécifiques à la spécialité specialtyPrices = { 'Points de Vie': { 'Points de Vie Maximum': 12 }, 'Perception': { 'Perception': 12 }, 'Attaque': { 'Dés d\'Attaque': 12 }, 'Esquive': { 'Dés d\'Esquive': 12 }, 'Dégats': { 'Dés de Dégats': 12 }, 'Régénération': { 'Dés de Régénération': 12 } }; // Mettre à jour les prix en fonction de la nouvelle spécialité Object.keys(defaultPrices).forEach(key => { const price = getPriceForSpecialty(specialty, key); defaultPrices[key] = price; console.log('const price', price); }); localStorage.setItem('specialiteJoueur', specialty); localStorage.setItem('prix par défaut', JSON.stringify(defaultPrices)); localStorage.setItem('prix spécialité', JSON.stringify(specialtyPrices)); console.log('prix spécialité', specialtyPrices); console.log('prix par défaut', defaultPrices); console.log('Spécialité enregistrée', specialty); updateTotalCost(); // Mettre à jour le coût total updateDisplayedValues(); // Mettre à jour les valeurs affichées calculateLevel(); // Mettre à jour le niveau } let specialiteJoueur = localStorage.getItem('specialiteJoueur'); if (specialiteJoueur) { adjustPricesBasedOnSpecialty(specialiteJoueur); console.log('Spécialité enregistrée :', specialiteJoueur); } else { console.log('Aucune spécialité enregistrée.'); alert('Sélectionnez une spécialité pour faire des projections sur votre gobelin!'); } console.log('Spécialité enregistrée :', specialiteJoueur); const targetElement = document.querySelector('.gfmm > table:nth-child(1) > tbody:nth-child(1) > tr:nth-child(2) > td:nth-child(1)'); console.log("Élément cible trouvé :", targetElement); const specialtySelect = document.createElement('select'); specialtySelect.id = 'specialtySelect'; 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' const defaultOption = document.createElement('option'); defaultOption.value = ''; specialtySelect.appendChild(defaultOption); const specialties = ['Points de Vie', 'Attaque', 'Esquive', 'Dégats', 'Régénération', 'Perception']; specialties.forEach(specialty => { const option = document.createElement('option'); option.value = specialty; option.textContent = specialty; specialtySelect.appendChild(option); }); if (specialiteJoueur) { specialtySelect.value = specialiteJoueur; } specialtySelect.addEventListener('change', () => { specialiteJoueur = specialtySelect.value; adjustPricesBasedOnSpecialty(specialiteJoueur); localStorage.setItem('specialiteJoueur', specialiteJoueur); // Mise à jour dans le stockage local location.reload(); location.reload(); }); targetElement.appendChild(specialtySelect); console.log("Liste déroulante insérée dans l'élément cible."); characteristics.forEach(row => { const currentValue = parseInt(row.children[1].innerText); const improvements = row.children[2]; const costValue = parseInt(row.children[3].innerText); const characteristicName = row.children[0].innerText.match(/(.*) \(.*/)[1]; const price = getPriceForSpecialty(localStorage.getItem('specialiteJoueur'), characteristicName); createButtons(row, currentValue, costValue, price, updateValue, improvements); }); function updateTotalCost() { const specialiteJoueur = localStorage.getItem('specialiteJoueur'); // Récupérer la spécialité choisie depuis le localStorage const totalCost = characteristics.reduce((acc, row) => { const characteristicName = row.children[0].innerText.split('(')[0].trim(); // Récupération du nom sans les parenthèses const improvements = parseInt(row.children[2].innerText); // Nombre d'améliorations const price = getPriceForSpecialty(specialiteJoueur, characteristicName); // Utilisation de la fonction pour récupérer le prix let cumulativeCost = 0; for (let i = 1; i <= improvements; i++) { cumulativeCost += price * i; } // Affichage du détail pour chaque ligne dans la console console.log(`Ligne: ${characteristicName} - Prix unitaire: ${price} - Améliorations: ${improvements} - Coût total: ${cumulativeCost}`); return acc + cumulativeCost; }, 0); console.log('Total:', totalCost); // Affichage du total dans la console // Enregistrement du total dans le localStorage localStorage.setItem('totalCost', totalCost); // Mise à jour de l'affichage du total dans l'interface HTML const totalCell = document.querySelector('.gfmm > table:nth-child(1) > tbody:nth-child(1) > tr:nth-child(11) > td:nth-child(4)'); totalCell.textContent = totalCost; } /// Pour calculer le niveau en fonction du total de PI function calculateLevel() { const nbPIActuels = window.localStorage.getItem('nbPIActuelsValue'); const levels = [ { requiredPI: 0, level: 1 }, { requiredPI: 10, level: 2 }, { requiredPI: 30, level: 3 }, { requiredPI: 60, level: 4 }, { requiredPI: 100, level: 5 }, { requiredPI: 150, level: 6 }, { requiredPI: 210, level: 7 }, { requiredPI: 280, level: 8 }, { requiredPI: 360, level: 9 }, { requiredPI: 450, level: 10 }, { requiredPI: 550, level: 11 }, { requiredPI: 660, level: 12 }, { requiredPI: 780, level: 13 }, { requiredPI: 910, level: 14 }, { requiredPI: 1050, level: 15 }, { requiredPI: 1200, level: 16 }, { requiredPI: 1360, level: 17 }, { requiredPI: 1530, level: 18 }, { requiredPI: 1710, level: 19 }, { requiredPI: 1900, level: 20 }, { requiredPI: 2100, level: 21 }, { requiredPI: 2310, level: 22 }, { requiredPI: 2530, level: 23 }, { requiredPI: 2760, level: 24 }, { requiredPI: 3000, level: 25 }, { requiredPI: 3250, level: 26 }, { requiredPI: 3510, level: 27 }, { requiredPI: 3780, level: 28 }, { requiredPI: 4060, level: 29 }, { requiredPI: 4350, level: 30 }, { requiredPI: 4650, level: 31 }, { requiredPI: 4960, level: 32 }, { requiredPI: 5280, level: 33 }, { requiredPI: 5610, level: 34 }, { requiredPI: 5950, level: 35 }, { requiredPI: 6300, level: 36 }, { requiredPI: 6660, level: 37 }, { requiredPI: 7030, level: 38 }, { requiredPI: 7410, level: 39 }, { requiredPI: 7800, level: 40 }, { requiredPI: 8200, level: 41 }, { requiredPI: 8610, level: 42 }, { requiredPI: 9030, level: 43 }, { requiredPI: 9460, level: 44 }, { requiredPI: 9900, level: 45 }, { requiredPI: 10350, level: 46 }, { requiredPI: 10810, level: 47 }, { requiredPI: 11280, level: 48 }, { requiredPI: 11760, level: 49 }, { requiredPI: 12250, level: 50 }, { requiredPI: 12750, level: 51 }, { requiredPI: 13260, level: 52 }, { requiredPI: 13780, level: 53 }, { requiredPI: 14310, level: 54 }, { requiredPI: 14850, level: 55 }, { requiredPI: 15400, level: 56 }, { requiredPI: 15960, level: 57 }, { requiredPI: 16530, level: 58 }, { requiredPI: 17110, level: 59 }, { requiredPI: 17700, level: 60 }, { requiredPI: 18300, level: 61 }, { requiredPI: 18910, level: 62 }, { requiredPI: 19530, level: 63 }, { requiredPI: 20170, level: 64 }, { requiredPI: 20820, level: 65 }, { requiredPI: 21480, level: 66 }, { requiredPI: 22150, level: 67 }, { requiredPI: 22830, level: 68 }, { requiredPI: 23520, level: 69 }, { requiredPI: 24220, level: 70 }, { requiredPI: 24930, level: 71 }, { requiredPI: 25650, level: 72 }, { requiredPI: 26380, level: 73 }, { requiredPI: 27120, level: 74 }, { requiredPI: 27870, level: 75 }, { requiredPI: 28630, level: 76 }, { requiredPI: 29400, level: 77 }, { requiredPI: 30180, level: 78 }, { requiredPI: 30970, level: 79 }, { requiredPI: 31770, level: 80 }, { requiredPI: 32580, level: 81 }, { requiredPI: 33400, level: 82 }, { requiredPI: 34230, level: 83 }, { requiredPI: 35070, level: 84 }, { requiredPI: 35920, level: 85 }, { requiredPI: 36780, level: 86 }, { requiredPI: 37650, level: 87 }, { requiredPI: 38530, level: 88 }, { requiredPI: 39420, level: 89 }, { requiredPI: 40320, level: 90 }, { requiredPI: 41230, level: 91 }, { requiredPI: 42150, level: 92 }, { requiredPI: 43080, level: 93 }, { requiredPI: 44020, level: 94 }, { requiredPI: 44970, level: 95 }, { requiredPI: 45930, level: 96 }, { requiredPI: 46900, level: 97 }, { requiredPI: 47880, level: 98 }, { requiredPI: 48870, level: 99 }, { requiredPI: 49870, level: 100 } ]; let currentLevel = 1; for (const { requiredPI, level } of levels) { if (nbPIActuels >= requiredPI) { currentLevel = level; } else { break; } } console.log('niveau', currentLevel); return currentLevel; } const PX = window.localStorage.getItem('PX'); const PXPerso = window.localStorage.getItem('PXPerso'); const PI = window.localStorage.getItem('PI'); console.log('PX', PX); const totalCost = window.localStorage.getItem('totalCost'); const nbPIActuels = window.localStorage.getItem('nbPIActuels'); const PIapprentissagesText = `PI investis dans les apprentissages :`; const PIapprentissagesValue = nbPIActuels - totalDonCostValue - totalCost - PI - PXPerso; localStorage.setItem('PIapprentissagesText', PIapprentissagesText); localStorage.setItem('PIapprentissagesValue', PIapprentissagesValue); function updateDisplayedValues() { // Récupérer les valeurs du local storage const niveau = window.localStorage.getItem('niveau'); const PX = window.localStorage.getItem('PX'); const PXperso = window.localStorage.getItem('PXperso'); const PI = window.localStorage.getItem('PI'); const totalCost = window.localStorage.getItem('totalCost'); const PIapprentissagesText = window.localStorage.getItem('PIapprentissagesText'); const PIapprentissagesValue = window.localStorage.getItem('PIapprentissagesValue'); // Trouver l'élément contenant le texte "Vous pouvez vous améliorer à concurrence de ...." const targetElement = document.querySelector('tr.pair:nth-child(1) > td:nth-child(1)'); // Créer des éléments pour afficher les valeurs mises à jour const niveauText = `Niveau actuel : ${niveau}`; const nbPIActuelsText = `Total PI simulés :`; const nbActualText = `Vous avez actuellement :`; const nbPIActuels = window.localStorage.getItem('nbPIActuels'); const nbPIActuelsValue = Math.floor(+totalCost + +totalDonCostValue + +PIapprentissagesValue + +PI); localStorage.setItem('nbPIActuelsValue', nbPIActuelsValue); // Calculer le niveau en fonction de nbPIActuels const currentLevel = calculateLevel(parseInt(nbPIActuelsValue)); const currentLevelText = `Niveau atteint : ${currentLevel}`; const PICompText = 'PI investis dans les caractéristiques : ' const PICompValue = totalCost; // Pour calculer le nombre de PX par jour depuis la création const diffpx = nbPIActuelsValue - nbPIActuels; console.log(diffpx); let dateCreationGobelin = localStorage.getItem('DateCrea'); let dateCrea = new Date(dateCreationGobelin); let dateActuelle = new Date(); let differenceEnMs = dateActuelle - dateCrea; let differenceEnJours = Math.floor(differenceEnMs / (1000 * 60 * 60 * 24)); if (!localStorage.getItem('xpParJourfiged')) { // Calcul de xpParJourfiged const xpParJour = nbPIActuelsValue !== 0 ? nbPIActuelsValue / differenceEnJours : 0; const xpParJourArrondi = xpParJour.toFixed(2); localStorage.setItem('xpParJourfiged', xpParJourArrondi); } const xpParJourfiged = localStorage.getItem('xpParJourfiged'); const nbdejourneeded = diffpx/xpParJourfiged; const nbdejourneededArrondi = nbdejourneeded.toFixed(2); const daytoyear = nbdejourneededArrondi/365; const daytoyearround = daytoyear.toFixed(1); const newContent = ` <div>${nbActualText + "<strong>" + nbPIActuels + " PI" + "</strong>"}</div> <div>${PIapprentissagesText + "<strong>" + +PIapprentissagesValue + "</strong>"}</div> <div>${PICompText + "<strong>" + PICompValue + "</strong>"}</div> <div>${niveauText}</div> <div>${nbPIActuelsText + "<strong>" + nbPIActuelsValue + "</strong>"}</div> <div>${currentLevelText}</div> <div>${"<strong>" + differenceEnJours + "</strong>" + " jours sont passés depuis votre naissance, vous avez gagné " + "<strong>" + xpParJourfiged + " px/jour" + "</strong>"}</div> <div>${"Pour atteindre les valeurs simulées au rythme actuel il vous faudra " + "<strong>" + nbdejourneededArrondi + " jours" + "</strong>" + " (" + "<strong>" + daytoyearround + " années" + "</strong>" + ")"}</div> `; // Création d'un nouvel élément div pour contenir le nouveau contenu const newElement = document.createElement('div'); newElement.innerHTML = newContent; // Remplacement du contenu existant par le contenu nouvellement créé targetElement.innerHTML = ''; // Vide d'abord le contenu existant targetElement.appendChild(newElement); } updateDisplayedValues(); calculateLevel(); } //============================================================================== /// calculateur des DLA (page mon profil et menu.php) //============================================================================== /// récup des variable dans mon profil if (window.location.href === 'http://games.gobland.fr/ProfilPerso.php') { // Fonction pour actualiser les variables et rafraîchir la page // Récupération de l'élément contenant les dates const dateContainer = document.querySelector('#content div#identite table.gf tbody tr:nth-child(2) td:nth-child(2)'); // Vérification si l'élément est récupéré if (dateContainer) { // Récupération de tous les éléments <span> dans dateContainer const spans = dateContainer.querySelectorAll('span.dla'); // Vérification si les éléments <span> sont trouvés if (spans.length >= 3) { const DLA1 = spans[0].nextSibling.textContent.trim(); const DLA2 = spans[1].nextSibling.textContent.trim(); const DLA3 = spans[2].nextSibling.textContent.trim(); // Stockage dans le local storage localStorage.setItem('DLA1', DLA1); localStorage.setItem('DLA2', DLA2); localStorage.setItem('DLA3', DLA3); } else { console.error('Erreur récup DLAs . Pas assez de balises <span> trouvées.'); } // Recherche de l'élément XPath spécifique const xpath = '/html/body/div[3]/div/table/tbody/tr[2]/td[2]/table/tbody/tr[2]/td/br[3]'; const xpathResult = document.evaluate(xpath, document, null, XPathResult.ANY_TYPE, null); // Récupération du nœud correspondant à l'élément XPath const node = xpathResult.iterateNext(); if (node) { // Récupération du texte suivant l'élément XPath const valeurPAText = node.nextSibling.textContent; // Expression régulière pour extraire le nombre const regex = /(\d+)/; const match = valeurPAText.match(regex); if (match && match[1]) { valeurPA = parseInt(match[1], 10); console.log('Valeur de PA:', valeurPA); localStorage.setItem('valeurPA', valeurPA); } else { console.error('Aucune correspondance trouvée pour la valeur de PA.'); } } else { console.error('Élément XPath pour la valeur de PA non trouvé.'); } } else { console.error('Conteneur de dates non trouvé.'); } // Récupération de l'heure actuelle de Paris const now = new Date(); console.log('now', now); const options = { timeZone: 'Europe/Paris', hour24: false }; const currentDateTime = now.toLocaleString('fr-FR', options); // Conversion des dates en objets Date const DLA1 = localStorage.getItem('DLA1'); const DLA2 = localStorage.getItem('DLA2'); const DLA3 = localStorage.getItem('DLA3'); const dateDLA1 = new Date(DLA1); const dateDLA2 = new Date(DLA2); const dateDLA3 = new Date(DLA3); localStorage.setItem('dateDLA1', dateDLA1); localStorage.setItem('dateDLA2', dateDLA2); localStorage.setItem('dateDLA3', dateDLA3); console.log('Date pour DLA1:', dateDLA1); console.log('Date pour DLA2:', dateDLA2); console.log('Date pour DLA3:', dateDLA3); // Calcul de la différence en millisecondes const diffDLA1 = dateDLA1 - now; const diffDLA2 = dateDLA2 - now; const diffDLA3 = dateDLA3 - now; localStorage.setItem('diffDLA1', diffDLA1); localStorage.setItem('diffDLA2', diffDLA2); localStorage.setItem('diffDLA3', diffDLA3); // Calcul de la différence en minutes const diffMinutesDLA1 = Math.round(Math.abs(diffDLA1 / (1000 * 60))); const diffMinutesDLA2 = Math.round(Math.abs(diffDLA2 / (1000 * 60))); const diffMinutesDLA3 = Math.round(Math.abs(diffDLA3 / (1000 * 60))); localStorage.setItem('diffMinutesDLA1', diffMinutesDLA1); localStorage.setItem('diffMinutesDLA2', diffMinutesDLA2); localStorage.setItem('diffMinutesDLA3', diffMinutesDLA3); console.log('Différence DLA1 en minutes:', diffMinutesDLA1, 'minutes'); console.log('Différence DLA2 en minutes:', diffMinutesDLA2, 'minutes'); console.log('Différence DLA3 en minutes:', diffMinutesDLA3, 'minutes'); // Enregistrement de l'heure de réactualisation des variables dans le localStorage const lastRefreshTime = new Date().toLocaleString('fr-FR', { timeZone: 'Europe/Paris' }); localStorage.setItem('lastRefreshTime', lastRefreshTime); } /// affichage des variables dans le menu left (j'ai galéré on doit pvr faire mieux^^) if ($(location).attr('href').match(/http:\/\/(.*\.)?gobland\.fr\/Menu\.php/i)) { // Récupération de l'élément ciblé const DLA1 = localStorage.getItem('DLA1'); const DLA2 = localStorage.getItem('DLA2'); const DLA3 = localStorage.getItem('DLA3'); const diffMinutesDLA1 = localStorage.getItem('diffMinutesDLA1'); const diffMinutesDLA2 = localStorage.getItem('diffMinutesDLA2'); const diffMinutesDLA3 = localStorage.getItem('diffMinutesDLA3'); const dateDLA1 = new Date(localStorage.getItem('dateDLA1')); const dateDLA2 = new Date(localStorage.getItem('dateDLA2')); const dateDLA3 = new Date(localStorage.getItem('dateDLA3')); const valeurPA = localStorage.getItem('valeurPA'); const now = new Date(); const targetElement = document.getElementById('dim'); let textToInsert = ''; // Obtenez le jour de la semaine (0 pour dimanche, 1 pour lundi, ... , 6 pour samedi) const dayOfWeek = now.getDay(); // Vérifiez si c'est le week-end (samedi ou dimanche) const isWeekend = dayOfWeek === 0 || dayOfWeek === 6; // Conditions pour déterminer le texte à insérer //speedXekk end if (isWeekend) { if (now > dateDLA3) { textToInsert = `<span style="color: red" title="Décalez de ${diffMinutesDLA3} minutes pour ne pas perdre votre trimul">Trimul dépassé!</span>`; } else if (now > dateDLA2) { textToInsert = `<span style="color: blue" title="Trimul dans ${diffMinutesDLA3} minutes">Cumul jouable</span>`; } else if (now > dateDLA1) { if (valeurPA === '0') { textToInsert = `<span style="color: green" title="Vous pouvez activer. Cumul dans ${diffMinutesDLA2} minutes">DLA dépassée</span>`; } else { textToInsert = `<span style="color: red" title="Décalez de ${diffMinutesDLA1} minutes pour ne pas perdre vos ${valeurPA} PA">DLA dépassée</span>`; } } else if (now < dateDLA1) { textToInsert = `<span style="color: green" title="Il vous reste ${valeurPA} PA">DLA dans ${diffMinutesDLA1} minutes</span>`; } } //pas speed week end if (!isWeekend) { if (now > dateDLA3) { textToInsert = `<span style="color: red" title="Décalez de ${diffMinutesDLA3} minutes pour ne pas perdre de DLA">DLA dépassée</span>`; } else if (now > dateDLA2) { textToInsert = `<span style="color: red" title="Décalez de ${diffMinutesDLA2} minutes pour jouer un cumul">DLA dépassée</span>`; } else if (now > dateDLA1) { if (valeurPA === '0') { textToInsert = `<span style="color: green" title="Vous pouvez activer. Cumul dans ${diffMinutesDLA2} minutes">DLA dépassée</span>`; } else { textToInsert = `<span style="color: red" title="Décalez de ${diffMinutesDLA1} minutes pour ne pas perdre vos ${valeurPA} PA">DLA dépassée</span>`; } } else if (now < dateDLA1) { textToInsert = `<span style="color: green" title="Il vous reste ${valeurPA} PA">DLA dans ${diffMinutesDLA1} minutes</span>`; } } targetElement.insertAdjacentHTML('afterend', `<br>${textToInsert}`); // Ajout du texte sur la date du dernier resfresh // Récupération de l'élément ciblé const targetElement2 = document.querySelector('.dla > span:nth-child(7)'); if (targetElement) { const lastRefreshTime = localStorage.getItem('lastRefreshTime'); if (lastRefreshTime) { const smallText = document.createElement('small'); smallText.textContent = `(${lastRefreshTime})`; smallText.style.fontSize = 'smaller'; // Réduit la taille de la police smallText.title = 'Date du dernier refresh. Pour rafraichir le calcul, allez sur votre page profil et actualisez la page' targetElement2.appendChild(document.createElement('br')); // Saut de ligne targetElement2.appendChild(smallText); // Ajout du texte entre parenthèses après le 7e span } } } //========================================================================================================================================================================================================================== ///affichage de l'icone Gobzilla avec version au survol dans le menu left //========================================================================================================================================================================================================================== (function() { 'use strict'; var iconUrl = 'https://i.ibb.co/s1MG4Dt/g-OBZILLAICON-removebg.png'; var scriptVersion = GM_info.script.version; // URL de redirection au clic sur l'icône var redirectionUrl = 'http://games.gobland.fr/goodies.php'; var icon = document.createElement('img'); icon.src = iconUrl; icon.style.position = 'absolute'; icon.style.top = '-145px'; // icon.style.left = '80px'; icon.style.zIndex = '9999'; icon.style.width = '80px'; icon.style.height = '50px'; icon.style.opacity = '0.7'; icon.title = 'Version du script: ' + scriptVersion; // Ajout du gestionnaire d'événements pour le clic sur l'icône icon.addEventListener('click', function() { window.open(redirectionUrl, '_blank', 'width=500,height=500'); // Ouvre l'URL dans une nouvelle fenêtre flottante }); // Sélectionnez l'endroit où vous souhaitez ajouter l'icône var targetElement = document.querySelector('.presentation'); // Remplacez par la classe ou l'ID de l'élément où vous voulez ajouter l'icône // Ajoutez l'icône à l'emplacement sélectionné if (targetElement) { targetElement.appendChild(icon); } })(); //========================================================================================================================================================================================================================== // 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 //========================================================================================================================================================================================================================== // Vérification si la variable a déjà été définie if (!window.localStorage.getItem('followersnumbers')) { // Sélection de l'élément contenant les informations des Suivants let followersTable = document.querySelector('td[style="text-align:left;vertical-align:top;"] table'); // Vérification si l'élément existe if (followersTable) { let followersnumbers = []; // Tableau pour stocker les numéros let followersnames = []; // Tableau pour stocker les textes restants // Récupération de tous les éléments <a> dans la table let followerLinks = followersTable.querySelectorAll('a'); // Parcours des liens pour extraire les informations followerLinks.forEach(link => { let text = link.textContent; // Récupération du texte du lien // Vérification du motif "[numéro] texte restant" let regex = /\[(\d+)\]\s(.+)/; let match = text.match(regex); if (match) { let numero = match[1]; // Numéro entre crochet let resteTexte = match[2]; // Texte restant // Stockage dans les tableaux followersnumbers.push(numero); followersnames.push(resteTexte); } }); // Enregistrement dans le stockage local localStorage.setItem('followersnumbers', JSON.stringify(followersnumbers)); localStorage.setItem('followersnames', JSON.stringify(followersnames)); } } //mise en couleur de la position de la CM dans Profil if ($(location).attr('href').match(/http:\/\/(.*\.)?gobland\.fr\/Follower\.php\?IdFO=\d+/i)) { (function() { // Sélectionne tous les éléments 'td' contenant le texte des positions const positionElements = document.querySelectorAll('td[style="text-align:left;"]'); // Parcours des éléments pour trouver celui contenant les informations de position positionElements.forEach((element) => { const text = element.textContent.trim(); if (text.startsWith('X =') && text.includes('Y =') && text.includes('N =')) { const positionInfo = text.match(/X = (-?\d+) \| Y = (-?\d+) \| N = (-?\d+)/); if (positionInfo && positionInfo.length === 4) { const posX = positionInfo[1]; const posY = positionInfo[2]; const posN = positionInfo[3]; // Créer des éléments <strong> pour mettre en gras le texte et le colorer en rouge const posXElement = document.createElement('strong'); posXElement.textContent = `X = ${posX}`; posXElement.style.color = 'red'; // Changer la couleur en rouge const posYElement = document.createElement('strong'); posYElement.textContent = `Y = ${posY}`; posYElement.style.color = 'red'; // Changer la couleur en rouge const posNElement = document.createElement('strong'); posNElement.textContent = `N = ${posN} `; posNElement.style.color = 'red'; // Changer la couleur en rouge // Créer un élément pour le reste du texte const restOfText = document.createElement('span'); restOfText.textContent = text.slice(text.indexOf('Perception')); // Remplacer le contenu de l'élément avec les éléments <strong> colorés et le reste du texte element.innerHTML = ''; element.appendChild(posXElement); element.appendChild(document.createTextNode(' | ')); element.appendChild(posYElement); element.appendChild(document.createTextNode(' | ')); element.appendChild(posNElement); element.appendChild(document.createElement('br')); element.appendChild(restOfText); } } }); })(); } if ($(location).attr('href').match(/http:\/\/(.*\.)?gobland\.fr\/fo_equipement\.php\?IdFO=\d+/i)) { // Sélection de l'élément spécifié dans la page 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'); // Vérification si des éléments sont trouvés if (elements.length > 0) { // Création d'un tableau pour stocker les contenus des éléments var contents = []; // Boucle à travers les éléments trouvés pour récupérer leur contenu elements.forEach(function(element) { var content = element.textContent.trim(); contents.push(content); }); // Stockage des contenus dans le stockage local localStorage.setItem('contenus_elements', JSON.stringify(contents)); // Affichage des contenus dans la console (pour vérification) console.log('Contenus des éléments :', contents); } else { console.log('Aucun élément correspondant trouvé.'); } } // 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 if ($(location).attr('href').match(/http:\/\/(.*\.)?gobland\.fr\/fo_orders\.php\?IdFO=\d+/i)) { window.addEventListener('load', function() { // Récupération des données de trésors depuis localStorage const tresorsData = localStorage.getItem('tresorsData'); if (!tresorsData) { const errorMessage = document.createElement('div'); errorMessage.textContent = 'Aucune donnée, allez sur votre page de vue avant'; errorMessage.style.color = 'red'; // Style facultatif pour le texte // Insérer le message d'erreur dans le corps de la page ou un élément spécifique document.body.appendChild(errorMessage); } else { const tresors = JSON.parse(tresorsData); // Création d'un élément de tableau const nouveauTableau = document.createElement('table'); nouveauTableau.style.border = '1px solid black'; // Style du tableau // Création de l'en-tête du tableau const enTete = nouveauTableau.createTHead(); const enTeteLigne = enTete.insertRow(); ['Distance', 'Réf.', 'Nom', 'X', 'Y', 'N'].forEach((enteteColonne) => { const cellule = enTeteLigne.insertCell(); cellule.textContent = enteteColonne; cellule.style.fontWeight = 'bold'; // Style pour l'en-tête cellule.style.border = '1px solid black'; // Style des cellules }); // Ajout des données de trésors dans le tableau const corps = nouveauTableau.createTBody(); tresors.forEach((tresor) => { const ligne = corps.insertRow(); ['distance', 'reference', 'nom', 'x', 'y', 'n'].forEach((colonne, index) => { const cellule = ligne.insertCell(); cellule.textContent = tresor[colonne]; cellule.style.border = '1px solid black'; // Style des cellules }); }); // Trouver l'élément spécifique où insérer le tableau des trésors 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; if (elementSpecifique) { // Insérer le tableau des trésors après l'élément spécifique elementSpecifique.insertAdjacentElement('afterend', nouveauTableau); console.log('Tableau inséré avec succès'); } else { console.log('Élément spécifique non trouvé'); } } }); window.addEventListener('load', function() { const tresorsData = localStorage.getItem('tresorsData'); if (tresorsData) { const tresors = JSON.parse(tresorsData); const selectedNumbers = []; const positions = []; let moveCommand = ''; let pickCommand = ''; // Créer un élément pour le message contextuel const tooltip = document.createElement('div'); tooltip.style.position = 'absolute'; tooltip.style.backgroundColor = '#f7f12e'; tooltip.style.border = '1px solid #d3d3d3'; tooltip.style.padding = '5px'; tooltip.style.borderRadius = '5px'; tooltip.style.boxShadow = '0px 0px 10px rgba(0,0,0,0.2)'; tooltip.style.display = 'none'; // Masquer par défaut tooltip.textContent = 'Ordre ajouté'; document.body.appendChild(tooltip); // Créer un tableau pour suivre les cellules cliquées const clickedRefCells = new Set(); // Pour les cellules de la colonne Réf. const clickedPosCells = new Set(); // Pour les cellules de position // Gérer les cellules de la colonne "Réf." const references = []; const xpathRef = '/html/body/div[3]/div/table/tbody/tr[2]/td[2]/form/table/tbody/table/tbody/tr/td[2]'; const refElements = document.evaluate(xpathRef, document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); for (let i = 0; i < refElements.snapshotLength; i++) { references.push(refElements.snapshotItem(i)); } references.forEach((reference) => { reference.style.cursor = 'crosshair'; reference.title = 'Cliquez pour ramasser'; reference.addEventListener('click', function(event) { event.preventDefault(); // Empêche les actions par défaut // Appliquer le style à la cellule cliquée this.style.border = '4px solid red'; // Bordure pour la cellule cliquée const referenceText = this.textContent.trim(); const referenceValue = parseInt(referenceText); if (!isNaN(referenceValue)) { selectedNumbers.push(referenceValue); if (selectedNumbers.length === 1) { pickCommand = `pick(OBJECT, ${selectedNumbers[0]});`; } else { const formattedNumbers = selectedNumbers.join(', '); pickCommand = `foreach(objects() as o):if(in(id(o), array(${formattedNumbers}))):pick(OBJECT, id(o));endif;endforeach;`; } updateTextarea(); } // Afficher le message contextuel à côté du curseur tooltip.style.left = `${event.pageX + 10}px`; // Position horizontale tooltip.style.top = `${event.pageY + 10}px`; // Position verticale tooltip.style.display = 'block'; // Afficher le message }); }); // Gérer les cellules de position (X, Y, N) const positionCells = []; const xpathPos = '/html/body/div[3]/div/table/tbody/tr[2]/td[2]/form/table/tbody/table/tbody/tr/td[position() >= 4]'; const posElements = document.evaluate(xpathPos, document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); for (let i = 0; i < posElements.snapshotLength; i++) { positionCells.push(posElements.snapshotItem(i)); } positionCells.forEach((positionCell) => { positionCell.style.cursor = 'crosshair'; positionCell.title = 'Cliquez pour se déplacer à cet endroit'; positionCell.addEventListener('click', function(event) { event.preventDefault(); // Empêche les actions par défaut // Appliquer le style à la cellule cliquée if (!clickedPosCells.has(this)) { this.style.backgroundColor = '#d3d3d3'; // Couleur de fond pour la cellule cliquée clickedPosCells.add(this); // Ajouter à l'ensemble des cellules cliquées } let position = ''; const positionCells = this.parentElement.querySelectorAll("td:nth-child(n+4)"); positionCells.forEach((cell, index) => { position += cell.textContent.trim(); if (index !== positionCells.length - 1) { position += ', '; } }); moveCommand = `move(${position});`; updateTextarea(); // Afficher le message contextuel à côté du curseur tooltip.style.left = `${event.pageX + 10}px`; // Position horizontale tooltip.style.top = `${event.pageY + 10}px`; // Position verticale tooltip.style.display = 'block'; // Afficher le message }); }); // Fonction pour réinitialiser le style des cellules function resetCellStyles() { // Réinitialiser le style des cellules de position uniquement positionCells.forEach(cell => { if (!clickedPosCells.has(cell)) { cell.style.backgroundColor = ''; // Réinitialiser la couleur de fond des cellules de position } }); // Réinitialiser le style des cellules de référence uniquement references.forEach(cell => { if (!clickedRefCells.has(cell)) { cell.style.border = ''; // Réinitialiser la bordure des cellules de référence } }); } // Fonction pour mettre à jour le contenu du textarea function updateTextarea() { const textarea = document.querySelector("textarea[name='sc']"); let output = ''; if (moveCommand) { output += `${moveCommand}\n`; } if (pickCommand) { output += `${pickCommand}\n`; } textarea.value = output; } // Cacher le message contextuel lorsque la souris se déplace document.addEventListener('mousemove', function() { tooltip.style.display = 'none'; // Cacher le message lorsqu'on se déplace }); } else { console.log('Aucune donnée de trésors trouvée dans localStorage'); } // Fonction pour générer le texte à insérer dans le textarea en fonction du bouton cliqué function generateText(action) { let output = ''; switch (action) { case 'move': output = 'move();'; break; case 'toutramasser': output = 'foreach(objects() as o):pick(OBJECT, id(o));endforeach;'; break; case 'toutdeposerausol': output = 'drop(OBJECT, ALL, GROUND, GROUND);'; break; case 'toutdeposerauchateau': output = 'drop(OBJECT, ALL, PLACE, 45337);'; break; case 'toutdeposeraumanoir': output = 'drop(OBJECT, ALL, PLACE, 46494);'; break; case 'toutramassersaufcorps': output = 'foreach(objects() as o):if(bnot(eq(category(o), "Corps"))):pick(OBJECT, id(o));endif;endforeach;'; break; case 'entrainer': output = 'train();'; break; case 'dépot1objetcase': output = 'drop(OBJECT, ID de l objet, GROUND, GROUND);'; break; case 'dépot1objetchateau': output = 'drop(OBJECT, ID de l objet, PLACE, 45337);'; break; case 'dépot1objetmanoir': output = 'drop(OBJECT, ID de l objet, PLACE, 46494);'; break; case 'ramasserplantes': output = 'foreach(plants() as o):pick(PLANT, id(o));endforeach;'; break; case 'ramasserct': output = "foreach(objects() as o): if(eq(name(o), 'CT')): pick(OBJECT, id(o)); endif; endforeach;" break; case 'attackmonster': output = "attack(MONSTER, Id);" break; case 'attackall': output = "foreach(monsters() as o):attack(MONSTER, id(o));endforeach;" break; case 'equip': output = "equip(Id);" break; case 'unequip': output = "unequip(Id);" break; case 'scout': output = "scout();" break; case 'passtp': output = "enter(PLACE|PORTAL, Id);" break; // Ajoutez des cases pour d'autres actions ou boutons default: break; } return output; } // recup du num de goblin pour l'ordre follow function generateFollowOrder(distance) { const gobId = localStorage.getItem('gobId'); // Récupérer l'ID depuis le local storage if (!gobId) { return "Je n'ai pas votre numéro, visitez votre page profil et revenez ici !"; // Retourner le message si gobId est null } const followOrder = `follow(PLAYER, ${gobId}, ${distance});`; return followOrder; } // Création de la liste déroulante pour choisir la distance pour l'ordre follow const followDistanceSelect = document.createElement('select'); followDistanceSelect.style.backgroundColor= '#64b3e4'; [0, 1, 2, 3, 4, 5].forEach((value) => { const option = document.createElement('option'); option.value = value; option.textContent = value + ' cases'; // Ajout de " cases" après chaque nombre followDistanceSelect.appendChild(option); }); // Sélection du textarea const textarea = document.querySelector("textarea[name='sc']"); // Fonction pour insérer du texte dans le textarea function insertText(text) { textarea.value += text + '\n'; // Ajout du nouveau texte à la suite du texte existant } // Création du bouton 0 "Move" const button0 = document.createElement('button'); button0.textContent = 'Se déplacer'; button0.style.backgroundColor= '#a8eff1'; // Définir la couleur de fond 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'; button0.addEventListener('click', function(event) { event.preventDefault(); // Empêche le rafraîchissement de la page const output = generateText('move'); insertText(output); }); // Création du premier bouton "Tout ramasser" const button1 = document.createElement('button'); button1.textContent = 'Tout ramasser'; button1.style.backgroundColor= '#e4ed97'; // Définir la couleur de fond button1.addEventListener('click', function(event) { event.preventDefault(); // Empêche le rafraîchissement de la page const output = generateText('toutramasser'); insertText(output); }); // Création du deuxième bouton const button2 = document.createElement('button'); button2.textContent = 'Tout déposer (sol)'; button2.style.backgroundColor= '#e4ed97'; // Définir la couleur de fond button2.addEventListener('click', function(event) { event.preventDefault(); // Empêche le rafraîchissement de la page const output = generateText('toutdeposerausol'); insertText(output); }); // Création du troisième bouton const button3 = document.createElement('button'); button3.textContent = 'Tout déposer (chateau)'; button3.style.backgroundColor= '#e4ed97'; // Définir la couleur de fond button3.addEventListener('click', function(event) { event.preventDefault(); // Empêche le rafraîchissement de la page const output = generateText('toutdeposerauchateau'); insertText(output); }); // Création du troisième bouton const button3b = document.createElement('button'); button3b.textContent = 'Tout déposer (manoir)'; button3b.style.backgroundColor= '#e4ed97'; // Définir la couleur de fond button3b.addEventListener('click', function(event) { event.preventDefault(); // Empêche le rafraîchissement de la page const output = generateText('toutdeposeraumanoir'); insertText(output); }); // Création du 4em bouton const button4 = document.createElement('button'); button4.textContent = 'Tout ramasser (sauf corps)'; button4.style.backgroundColor= '#e4ed97'; // Définir la couleur de fond button4.addEventListener('click', function(event) { event.preventDefault(); // Empêche le rafraîchissement de la page const output = generateText('toutramassersaufcorps'); insertText(output); }); // Création du 5em bouton const button5 = document.createElement('button'); button5.textContent = 'Entrainer'; button5.style.backgroundColor= '#a8eff1'; button5.addEventListener('click', function(event) { event.preventDefault(); // Empêche le rafraîchissement de la page const output = generateText('entrainer'); insertText(output); }); // Création du 6em bouton const button6 = document.createElement('button'); button6.textContent = 'Déposer un objet (sol)'; button6.title = 'remplacer ID par l id de votre objet'; button6.style.backgroundColor= '#e4ed97'; // Définir la couleur de fond button6.addEventListener('click', function(event) { event.preventDefault(); // Empêche le rafraîchissement de la page const output = generateText('dépot1objetcase'); insertText(output); }); // Création du 7em bouton const button7 = document.createElement('button'); button7.textContent = 'Déposer un objet (chateau)'; button7.title = 'remplacer ID par l id de votre objet'; button7.style.backgroundColor= '#e4ed97'; // Définir la couleur de fond button7.addEventListener('click', function(event) { event.preventDefault(); // Empêche le rafraîchissement de la page const output = generateText('dépot1objetchateau'); insertText(output); }); // Création du 7em bouton bis const button7b = document.createElement('button'); button7b.textContent = 'Déposer un objet (manoir)'; button7b.title = 'remplacer ID par l id de votre objet'; button7b.style.backgroundColor= '#e4ed97'; // Définir la couleur de fond button7b.addEventListener('click', function(event) { event.preventDefault(); // Empêche le rafraîchissement de la page const output = generateText('dépot1objetmanoir'); insertText(output); }); // Création du 8em bouton const button8 = document.createElement('button'); button8.textContent = 'Ramasser plantes'; button8.style.backgroundColor= '#e4ed97'; // Définir la couleur de fond button8.addEventListener('click', function(event) { event.preventDefault(); // Empêche le rafraîchissement de la page const output = generateText('ramasserplantes'); insertText(output); }); // Création du 9em bouton const button9 = document.createElement('button'); button9.textContent = 'Ramasser CT'; button9.style.backgroundColor= '#e4ed97'; // Définir la couleur de fond button9.addEventListener('click', function(event) { event.preventDefault(); // Empêche le rafraîchissement de la page const output = generateText('ramasserct'); insertText(output); }); // Création du bouton pour l'ordre follow const followButton = document.createElement('button'); followButton.textContent = 'Me suivre à'; followButton.style.backgroundColor= '#a8eff1'; followButton.title = 'Sélectionner la distance et cliquer'; followButton.addEventListener('click', function(event) { event.preventDefault(); // Empêche le rafraîchissement de la page const distance = followDistanceSelect.value; const followOrderText = generateFollowOrder(distance); insertText(followOrderText); }); // Création du 11em bouton const button11 = document.createElement('button'); button11.textContent = 'Attaquer un monstre'; button11.style.backgroundColor= '#d37d7d' button11.title = "Remplacer l'ID"; button11.addEventListener('click', function(event) { event.preventDefault(); // Empêche le rafraîchissement de la page const output = generateText('attackmonster'); insertText(output); }); // Création du 12em bouton const button12 = document.createElement('button'); button12.textContent = 'Attaquer tout'; button12.style.backgroundColor= '#d37d7d' button12.addEventListener('click', function(event) { event.preventDefault(); // Empêche le rafraîchissement de la page const output = generateText('attackall'); insertText(output); }); // Création du 13em bouton const button13 = document.createElement('button'); button13.textContent = 'Equiper'; button13.style.backgroundColor= '#e4ed97'; button13.title = "Remplacer l'ID"; button13.addEventListener('click', function(event) { event.preventDefault(); // Empêche le rafraîchissement de la page const output = generateText('equip'); insertText(output); }); // Création du 14em bouton const button14 = document.createElement('button'); button14.textContent = 'Déséquiper'; button14.style.backgroundColor= '#e4ed97'; button14.title = "Remplacer l'ID"; button14.addEventListener('click', function(event) { event.preventDefault(); // Empêche le rafraîchissement de la page const output = generateText('unequip'); insertText(output); }); // Création du 15em bouton const button15 = document.createElement('button'); button15.textContent = 'Espionner'; button15.style.backgroundColor= '#a8eff1'; button15.addEventListener('click', function(event) { event.preventDefault(); // Empêche le rafraîchissement de la page const output = generateText('scout'); insertText(output); }); // Création du 16em bouton const button16 = document.createElement('button'); button16.textContent = 'Prendre un TP'; button16.style.backgroundColor= '#a8eff1'; button16.title = "Remplacer l'ID"; button16.addEventListener('click', function(event) { event.preventDefault(); // Empêche le rafraîchissement de la page const output = generateText('passtp'); insertText(output); }); function createDropdownMenu() { // Création du menu déroulant avec des options const dropdown = document.createElement('select'); const option1 = document.createElement('option'); option1.textContent = 'Option 1'; const option2 = document.createElement('option'); option2.textContent = 'Option 2'; // Ajout des options au menu déroulant dropdown.appendChild(option1); dropdown.appendChild(option2); // Style pour positionner le menu déroulant dropdown.style.position = 'absolute'; dropdown.style.left = '150px'; // Changer la position en fonction de votre mise en page dropdown.style.top = '50px'; // Changer la position en fonction de votre mise en page // Ajout du menu déroulant au document document.body.appendChild(dropdown); return dropdown; } // Trouver les boutons "Déposer un objet (sol)" et "Déposer un objet (château)" const solButton = document.querySelector('.gfmm > form:nth-child(11) > div:nth-child(2) > div:nth-child(5) > button:nth-child(8)'); const chateauButton = document.querySelector('.gfmm > form:nth-child(11) > div:nth-child(2) > div:nth-child(5) > button:nth-child(9)'); // Gérer l'événement de clic sur le bouton "Déposer un objet (sol)" if (solButton) { solButton.addEventListener('click', function() { // Créer le menu déroulant const dropdown = createDropdownMenu(); // Positionner le menu à côté du bouton "Déposer un objet (sol)" dropdown.style.left = solButton.getBoundingClientRect().right + 'px'; dropdown.style.top = solButton.getBoundingClientRect().top + 'px'; }); } // Gérer l'événement de clic sur le bouton "Déposer un objet (château)" if (chateauButton) { chateauButton.addEventListener('click', function() { // Créer le menu déroulant const dropdown = createDropdownMenu(); // Positionner le menu à côté du bouton "Déposer un objet (château)" dropdown.style.left = chateauButton.getBoundingClientRect().right + 'px'; dropdown.style.top = chateauButton.getBoundingClientRect().top + 'px'; }); } // Création des conteneurs pour chaque catégorie const basicActionsContainer = document.createElement('div'); const equipmentContainer = document.createElement('div'); const warriorsContainer = document.createElement('div'); // Ajout des boutons dans les conteneurs appropriés basicActionsContainer.appendChild(button0); basicActionsContainer.appendChild(button5); // Actions de base basicActionsContainer.appendChild(followButton); basicActionsContainer.appendChild(followDistanceSelect); basicActionsContainer.appendChild(button15); basicActionsContainer.appendChild(button16); equipmentContainer.appendChild(button1); // Équipement equipmentContainer.appendChild(button4); equipmentContainer.appendChild(button8); equipmentContainer.appendChild(button9); equipmentContainer.appendChild(document.createElement('br')); equipmentContainer.appendChild(button2); equipmentContainer.appendChild(button3); equipmentContainer.appendChild(button3b); equipmentContainer.appendChild(button6); equipmentContainer.appendChild(button7); equipmentContainer.appendChild(button7b); equipmentContainer.appendChild(document.createElement('br')); equipmentContainer.appendChild(button13); equipmentContainer.appendChild(button14); warriorsContainer.appendChild(button11); // Guerriers warriorsContainer.appendChild(button12); // Ajout du style pour masquer les catégories par défaut basicActionsContainer.style.display = 'none'; equipmentContainer.style.display = 'none'; warriorsContainer.style.display = 'none'; // Gestionnaire d'événement pour masquer ou afficher une catégorie function toggleCategory(category, button) { const display = category.style.display; if (display === 'none') { category.style.display = 'block'; button.textContent = button.textContent.replace('►', '▼'); } else { category.style.display = 'none'; button.textContent = button.textContent.replace('▼', '►'); } } // Fonction pour créer un bouton de catégorie et son gestionnaire d'événements function createCategoryButton(container, buttonText) { const toggleButton = document.createElement('button'); toggleButton.textContent = `${buttonText} ►`; toggleButton.addEventListener('click', function(event) { event.preventDefault(); // Empêcher le rafraîchissement de la page toggleCategory(container, this); }); return toggleButton; } // Création des boutons pour masquer ou afficher les catégories const basicActionsToggle = createCategoryButton(basicActionsContainer, 'Actions de base'); basicActionsToggle.title = "Cliquez pour afficher/masquer les actions de base"; basicActionsToggle.style.backgroundColor= '#8de4e7'; basicActionsToggle.style.fontWeight= 'bold' const equipmentToggle = createCategoryButton(equipmentContainer, 'Équipement'); equipmentToggle.style.backgroundColor= '#ced688'; equipmentToggle.style.fontWeight= 'bold' const warriorsToggle = createCategoryButton(warriorsContainer, 'Guerriers'); warriorsToggle.style.backgroundColor= '#d37d7d'; warriorsToggle.style.fontWeight= 'bold' // Trouver l'élément spécifique où insérer les boutons 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; if (specificElement) { // Création d'un conteneur principal pour tous les boutons et les catégories const allButtonsContainer = document.createElement('div'); allButtonsContainer.appendChild(basicActionsToggle); allButtonsContainer.appendChild(basicActionsContainer); allButtonsContainer.appendChild(document.createElement('br')); allButtonsContainer.appendChild(equipmentToggle); allButtonsContainer.appendChild(equipmentContainer); allButtonsContainer.appendChild(document.createElement('br')); allButtonsContainer.appendChild(warriorsToggle); allButtonsContainer.appendChild(warriorsContainer); // Ajoutez les autres catégories de la même manière // Insérer le conteneur des boutons avant l'élément spécifique specificElement.parentNode.insertBefore(allButtonsContainer, specificElement); } else { console.log('Élément spécifique non trouvé'); } // Sélectionner l'élément cible const targetElement = document.querySelector('div.titreMenu:nth-child(9)'); if (targetElement) { // Créer un nouvel élément pour le texte const newElement = document.createElement('p'); // Utilise un <p> pour le texte, ou tout autre élément approprié 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 // Ajouter le nouvel élément sous l'élément cible targetElement.parentNode.insertBefore(newElement, targetElement.nextSibling); } else { console.error('L\'élément spécifié n\'a pas été trouvé.'); } }); // Sélection de l'élément contenant le code const codeElement = document.querySelector('td > div > pre > code > span > span'); if (codeElement) { // Récupération du texte de l'élément const texte = codeElement.textContent.trim(); // Extraction du mot "stop" const stopIndex = texte.indexOf('stop'); let stopData = ''; if (stopIndex !== -1) { // Si le mot "stop" est trouvé, récupération de la partie du texte à partir de "stop" stopData = texte.substring(stopIndex, stopIndex + 4); console.log('Donnée "stop" extraite :', stopData); } else { console.log('Mot "stop" non trouvé dans le texte'); } } else { console.log('Élément contenant le code non trouvé'); } } //========================================================================================================================================================================================================================== // Page équipement - récuprer les BM du matos templaté et en calculer le total //========================================================================================================================================================================================================================== if ($(location).attr('href').match(/http:\/\/(.*\.)?gobland\.fr\/Equipement\.php/i)) { (function() { 'use strict'; let elements = document.querySelectorAll('td.blanc'); elements.forEach(element => { if (element.innerText.includes("Viverne")) { let regex = /(DEG:\W\d+)/g; element.innerHTML = element.innerHTML.replace(regex, '<span style="color: #e530cf ;">$1</span>'); } else if (element.innerText.includes("Centaure")) { let regex = /(ATT:\W\d+|DEG:\+\d+|PER:\W\d+)/g; element.innerHTML = element.innerHTML.replace(regex, '<span style="color: #e530cf ;">$1</span>'); } else if (element.innerText.includes("Titan")) { let regex = /(ATT:\W\d+|DEG:\W\d+|ESQ:\W\d+)/g; element.innerHTML = element.innerHTML.replace(regex, '<span style="color: #e530cf ;">$1</span>'); } else if (element.innerText.includes("Sphinx")) { let regex = /(ArmMag:\W\d+)/g; element.innerHTML = element.innerHTML.replace(regex, '<span style="color: #e530cf ;">$1</span>'); } else if (element.innerText.includes("Lézard Géant")) { let regex = /(-30 Min)/g; element.innerHTML = element.innerHTML.replace(regex, '<span style="color: #e530cf ;">$1</span>'); } else if (element.innerText.includes("Griffon")) { let regex = /(ATT:\W\d+|PER:\W\d+)/g; element.innerHTML = element.innerHTML.replace(regex, '<span style="color: #e530cf ;">$1</span>'); } else if (element.innerText.includes("Minotaure")) { let regex = /(ArmMag:\W\d+|ESQ:\W\d+)/g; element.innerHTML = element.innerHTML.replace(regex, '<span style="color: #e530cf ;">$1</span>'); } else if (element.innerText.includes("Oni")) { let regex = /(ATT:\W\d+|REG:\W\d+)/g; element.innerHTML = element.innerHTML.replace(regex, '<span style="color: #e530cf ;">$1</span>'); } else if (element.innerText.includes("Golem")) { let regex = /(\+30 Min|ArmMag:\W\d+)/g; element.innerHTML = element.innerHTML.replace(regex, '<span style="color: #e530cf ;">$1</span>'); } else if (element.innerText.includes("Galopin")) { let regex = /(ESQ:\W\d+|DEG:\W\d+)/g; element.innerHTML = element.innerHTML.replace(regex, '<span style="color: #e530cf ;">$1</span>'); } else if (element.innerText.includes("Dragon")) { let regex = /(ATT:\W\d+|DEG:\W\d+|ESQ:\W\d+|ArmMag:\W\d+|RM:\W\d+%|MM\W\d+%)/g; element.innerHTML = element.innerHTML.replace(regex, '<span style="color: #e530cf ;">$1</span>'); } else if (element.innerText.includes("Phoenix")) { let regex = /(DEG:\W\d+|REG:\W\d+|MS:\W\d+%)/g; element.innerHTML = element.innerHTML.replace(regex, '<span style="color: #e530cf ;">$1</span>'); } else if (element.innerText.includes("Ombre")) { let regex = /(ATT:\W\d+|DEG:\W\d+|PER:\W\d+|RT\W\d+%|MT\W\d+%)/g; element.innerHTML = element.innerHTML.replace(regex, '<span style="color: #e530cf ;">$1</span>'); } }); })(); // Fonction pour extraire et calculer les bonus magiques des objets équipés function calculerBonusMagiques() { // Sélection des balises contenant les informations des objets équipés const elements = document.querySelectorAll('.blanc'); let attBonus = 0; let armBonus = 0; let esqBonus = 0; let perBonus = 0; let degBonus = 0; let regBonus = 0; let tempsBonus = 0; // Parcours de chaque élément pour extraire les informations elements.forEach((element) => { const text = element.innerText.toLowerCase(); if (text.includes('oni')) { attBonus += 1; regBonus += 1; } else if (text.includes('griffon')) { attBonus += 1; perBonus += 1; } else if (text.includes('viverne')) { degBonus += 1; } else if (text.includes('centaure')) { attBonus += 1; degBonus += 1; perBonus -= 1; } else if (text.includes('titan')) { attBonus += 1; degBonus += 1; esqBonus -= 1; } else if (text.includes('sphinx ')) { armBonus += 1; } else if (text.includes('lézard')) { tempsBonus -= 30; } else if (text.includes('minotaure')) { armBonus += 1; esqBonus -= 1; } else if (text.includes('golem')) { tempsBonus += 30; armBonus += 2; } else if (text.includes('galopin')) { esqBonus += 1; degBonus -= 1; } else if (text.includes('dragon')) { attBonus += 1; degBonus += 1; esqBonus -= 3; armBonus += 2; } else if (text.includes('phoenix')) { degBonus += 1; regBonus += 2; } else if (text.includes('ombre')) { attBonus += 1; degBonus += 1; perBonus -= 1; } }); // Calcul du total des bonus malus magiques const totalBonus = `ATT${attBonus} | ESQ${esqBonus} | DEG${degBonus} | REG${regBonus} | Arm${armBonus} | PER${perBonus} | Temps${tempsBonus}`; // Sélection de l'élément où insérer les bonus const enleverButton = document.querySelector('input[name="maction"][value="Enlever"]'); // Création d'un élément pour afficher les bonus const bonusElement = document.createElement('div'); // Ajout des styles pour la couleur et le centrage bonusElement.style.color = '#e530cf'; // Couleur e530cf bonusElement.style.fontWeight = 'bold' ; // gras bonusElement.style.marginTop = '20px'; // Ajout d'un espace sous l'élément // Fonction pour afficher un symbole '+' ou '-' en fonction de la valeur du bonus const afficherSymbole = (valeur) => (valeur > 0 ? '+' : valeur < 0 ? '-' : ''); // Texte pour afficher les bonus let texteBonus = 'Total des BMM: '; // Liste des bonus individuels avec leur nom et valeur const bonusIndividuels = [ { nom: 'ATT', valeur: attBonus }, { nom: 'ESQ', valeur: esqBonus }, { nom: 'DEG', valeur: degBonus }, { nom: 'REG', valeur: regBonus }, { nom: 'ArmMag', valeur: armBonus }, { nom: 'PER', valeur: perBonus }, { nom: 'Temps', valeur: tempsBonus }, ]; // Boucle à travers chaque bonus individuel et les ajouter au texte bonusIndividuels.forEach((bonus) => { const symbole = afficherSymbole(bonus.valeur); const valeurAbsolue = Math.abs(bonus.valeur); // Si la valeur du bonus est différente de zéro, l'ajouter au texte if (bonus.valeur !== 0) { texteBonus += `${bonus.nom}${symbole}${valeurAbsolue} | `; } }); // Supprimer le dernier symbole '|' s'il est présent à la fin texteBonus = texteBonus.replace(/\s*\|\s*$/, ''); // Création d'un élément avec le texte des bonus const totalBBMElement = document.createElement('div'); totalBBMElement.textContent = texteBonus; bonusElement.appendChild(totalBBMElement); // Insertion du texte des bonus après l'élément "Enlever" enleverButton.insertAdjacentElement('afterend', bonusElement); } // Appel de la fonction une fois que la page est chargée window.addEventListener('load', calculerBonusMagiques); } //========================================================================================================================================================================================================================== // Page Option - Description de Gobzilla quand on clique sur Goodies et Gobzilla //========================================================================================================================================================================================================================== // rename Goodies if ($(location).attr('href').match(/http:\/\/(.*\.)?gobland\.fr\/Options\.php/i)) { (function() { 'use strict'; var newLinkText = "[Googies et GobZilla]"; var goodiesLink = document.querySelector('a[href="goodies.php"]'); if (goodiesLink) { goodiesLink.textContent = newLinkText; } }) (); } // ajoute un paragraphe de description de Gobzilla if ($(location).attr('href').match(/http:\/\/(.*\.)?gobland\.fr\/Goodies\.php/i)) { (function() { 'use strict'; var newLinkText = "[Googies et GobZilla]"; var goodiesLink = document.querySelector('a[href="goodies.php"]'); if (goodiesLink) { goodiesLink.textContent = newLinkText; } var newMessageLines = [ "Roulé à la main sous les Aisselles par DeathMétal 330, puis grandement amélioré par Glak 393", "Fonctions principales :", "- GobCDM : Cliquez sur un monstre dans la page vue pour avoir sa cdm, si déja dans la base de donnée", " - Affiche une vue 2d activable ou non ", " - Boutons pour les ordres des suivants ", " - Décoche le vestiaire, décoche l'activation de DLA ", ' - Masquer les petits monstres, masquer les arbres', " - Calcul auto de nombre d'entrainements pour passer lvl supérieur" , " - Récupération des caracs et calculs des skills au survol de la souris. ", " - Calcul sur les Matériaux, page équipement et habitation", " - 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", "- Filtre et tri des monstres + compteur, tri des plantes", "- Affiche les lieux étendus (lieux hors de vue), ainsi que les plantes étendues (plantes hors vue, activable via une coche)", " - Herboriser : Affiche en couleur verte les plantes herborisables", " - Met en évidence le Bonus/Malus de concentration sur la page Mon profil ", " - Calcul des Bonus Malus Magiques de l'équipement sur la page equipement et met en évidence les bonus magiques sur chaque objet ", " - Ajout d'icônes dans le profil et dans la vue ", " 🥰 amis", " 👨🍳 monstre à cuisiner ", "👁️👁️👁️ VLC Totale", "👁️👁️ VLC Importante", "👁️ VLC partielle", " Bipez moi si vous voyez des erreurs, il doit y en avoir......." ]; var developmentMessage = document.querySelector('font[color="RED"]'); if (developmentMessage) { developmentMessage.textContent = ''; // Clear existing content // Add an image var imageElement = document.createElement('img'); imageElement.src = 'https://i.ibb.co/cgqGVCt/g-OBZILLAICON.png'; // Replace with the URL of your image imageElement.style.maxWidth = '60%'; // Ensure the image fits within the content developmentMessage.appendChild(imageElement); var welcomeTitle = document.createElement('div'); welcomeTitle.style.fontSize = '24px'; // Larger font size welcomeTitle.style.fontWeight = 'bold'; // Bold style welcomeTitle.style.marginBottom = '10px'; // Add some space below welcomeTitle.textContent = 'Bienvenue sur GobZilla'; developmentMessage.appendChild(welcomeTitle); newMessageLines.forEach(function(line) { var paragraph = document.createElement('p'); paragraph.style.color = 'black'; if (line === "Fonctions principales :") { var underline = document.createElement('u'); underline.textContent = line; paragraph.appendChild(underline); } else { paragraph.textContent = line; } developmentMessage.appendChild(paragraph); }); } })(); } //========================================================================================================================================================================================================================== // Page Clan - Récupération des infos et affichage au survol (surrement a fusionner avec meute juste en dessous) //========================================================================================================================================================================================================================== if ($(location).attr('href').match(/http:\/\/(.*\.)?gobland\.fr\/membresClan\.php/i)) { // XPath pour la colonne des noms des goblins const xpathExpression = "//table[@class='tab90']/tbody/tr/th[3]"; const gobelinPasswords = { '330': '30fae3bb4bf976a5cd29628102d42fd2', '393': '461a9bdebd3bca149b7b07380b23c7fb', '346': '0da2dc91e48d987245a1c6b1662ea41f', '387': 'e49a305f7e7e0c784890f47793dd838a', '386' : 'b67d6b06e728729e6a2111ca7ffcf387', '388': 'c6d64737a6737cdb73a405353b3f1771', '411': 'd72e3819d988118cd76f3f5105c8fc7d', '407' : '8fdbd9336997cf1dab7a72cbd80733a3', '385': 'd8136cab7a465e1e1e2be460c161ef7e', '405' : 'e3d4c7b9250c8bde4c0a4ac7a596ecbb', '458' : '1eac37ef925c635c9be62212deba8642', '456' : '94238d5187351be4adbfc220e6baea4e' }; const goblinIDs = ['330', '393', '346', '387' , '386', '388', '411', '407', '385', '405' , '456' , '458']; // Noms des goblins const goblinNames = { '330': 'DeathMétal', '393': 'Glakus Batak Batak', '346': 'Globulus', '387': 'SeRiNy', '386': 'IKI', '388': 'Wose', '411': 'TKeePeR', '407': 'Groot', '385': 'Tamarand', '405': 'Catarate', '456' : 'Kroc le Bo', '458' : 'Shadox' }; function getGoblinInfoById(id) { const goblinData = localStorage.getItem(`goblinInfo_${id}`); console.log(`Data for ID ${id}:`, goblinData); // Vérification dans la console return goblinData; } // Fonction pour afficher les données dans une info bulle function showGoblinInfoOnHover() { const playerLinks = document.querySelectorAll('td.pfmm a'); playerLinks.forEach(link => { link.addEventListener('mouseover', (event) => { const playerId = link.getAttribute('href').match(/\((\d+)\)/)[1]; const goblinInfo = getGoblinInfoById(playerId); const tooltip = document.createElement('div'); tooltip.classList.add('tooltip'); if (goblinInfo) { const lines = goblinInfo.split('\n'); // Divise les lignes const table = document.createElement('table'); table.classList.add('tooltip-table'); lines.forEach((line, index) => { const rowData = line.split(',').map(data => data.replace(/^"|"$/g, '')); // Divise les données par colonne et supprime les guillemets const row = document.createElement('tr'); rowData.forEach(cellData => { const cell = document.createElement(index === 0 ? 'th' : 'td'); // Utilisation de th pour la première ligne cell.textContent = cellData; row.appendChild(cell); }); table.appendChild(row); }); tooltip.appendChild(table); } else { tooltip.textContent = "Aucune information disponible, mot de passe de clan manquant"; } document.body.appendChild(tooltip); tooltip.style.position = 'absolute'; tooltip.style.top = `${event.clientY + window.scrollY}px`; tooltip.style.left = `${event.clientX}px`; tooltip.style.backgroundColor = 'white'; tooltip.style.border = '1px solid black'; tooltip.style.padding = '5px'; tooltip.style.zIndex = '9999'; tooltip.style.backgroundColor = 'yellow' link.addEventListener('mouseout', () => { tooltip.remove(); }); }); }); } // Appel de la fonction pour afficher les infos bulles showGoblinInfoOnHover(); // Création du bouton const refreshButton = document.createElement('input'); refreshButton.type = 'button'; refreshButton.value = 'Rafraîchir les données externes'; refreshButton.title = 'Cliquez ici pour actualiser les données externes. NE PAS ABUSER'; refreshButton.onclick = refreshData; // Assure-toi que la fonction refreshData est définie // Ajout de classe au bouton (facultatif) refreshButton.classList.add('refresh-button'); // Trouver l'emplacement où tu veux insérer le bouton const centerElement = document.querySelector('#identite .pfmm'); if (centerElement) { centerElement.appendChild(refreshButton); } else { console.error('Impossible de trouver l\'emplacement pour insérer le bouton.'); } // Création de l'élément de style const style = document.createElement('style'); style.innerHTML = ` .refresh-button { display: block; margin: 0 auto; text-align: center; } `; // Ajout du style au head de la page document.head.appendChild(style); let lastFetchTime = performance.now(); function refreshData() { goblinIDs.forEach(id => { const password = gobelinPasswords[id]; const url = `http://ie.gobland.fr/IE_Profil.php?id=${id}&passwd=${password}&sep=,&`; fetch(url) .then(response => response.text()) .then(csvData => { localStorage.setItem(`goblinInfo_${id}`, csvData); const currentTime = performance.now(); const timeElapsed = currentTime - lastFetchTime; lastFetchTime = currentTime; console.log(`Données pour l'ID ${id} rafraîchies et stockées dans le local storage.`); console.log(`Temps écoulé depuis le dernier appel pour ID ${id}: ${timeElapsed} millisecondes`); // Convertir le temps en heures et/ou minutes const timeInMinutes = Math.floor(timeElapsed / (1000 * 60)); const hours = Math.floor(timeInMinutes / 60); const minutes = timeInMinutes % 60; const formattedTime = `${hours}h ${minutes}m`; // Mettre à jour le titre du bouton avec le temps écoulé refreshButton.title = `Cliquez ici pour actualiser les données externes. NE PAS ABUSER. Dernière mise à jour il y a ${formattedTime}`; }) .catch(error => { console.error(`Erreur lors de la récupération du CSV pour l'ID ${id}:`, error); }); }); } } //========================================================================================================================================================================================================================== // Page Meute - Récupération du niveau pour calcul des PX et récup de l'heure de DLA via ieprofil //========================================================================================================================================================================================================================== if ($(location).attr('href').match(/http:\/\/(.*\.)?gobland\.fr\/Meute\.php/i)) { var lvlmeute = $('center:contains("Niveau de la meute :")').text().match(/^(\D*)(\d+)/)[2]; window.localStorage.setItem('lvlmeute', lvlmeute); } else { var lvlmeute = window.localStorage.getItem('lvlmeute'); } /// recup des données sur http://ie.gobland.fr/IE_Profil.php?id=XXX if ($(location).attr('href').match(/http:\/\/(.*\.)?gobland\.fr\/Meute\.php/i)) { (function() { const gobelinPasswords = { '330': '30fae3bb4bf976a5cd29628102d42fd2', '393': '461a9bdebd3bca149b7b07380b23c7fb', '346': '0da2dc91e48d987245a1c6b1662ea41f', '387': 'e49a305f7e7e0c784890f47793dd838a', '386' : 'b67d6b06e728729e6a2111ca7ffcf387', '388': 'c6d64737a6737cdb73a405353b3f1771', '411': 'd72e3819d988118cd76f3f5105c8fc7d', '407' : '8fdbd9336997cf1dab7a72cbd80733a3', '385': 'd8136cab7a465e1e1e2be460c161ef7e', '405' : 'e3d4c7b9250c8bde4c0a4ac7a596ecbb', '458' : '1eac37ef925c635c9be62212deba8642', '456' : '94238d5187351be4adbfc220e6baea4e' }; const goblinIDs = ['330', '393', '346', '387' , '386', '388', '411', '407', '385', '405' , '456', '458']; const goblinNames = { '330': 'DeathMétal', '393': 'Glakus Batak Batak', '346': 'Globulus', '387':'SeRiNy', '386':'IKI', '388': 'Wose', '411':'TKeePeR', '407':'Groot', '385':'Tamarand', '405':'Catarate', '456' : 'Kroc le Bo', '458' : 'Shadox' }; function extractinfos(csvData) { const rows = csvData.split('\n'); if (rows.length < 2) return null; const headers = rows[0].split(','); const dataIndex = headers.indexOf('DLA'); if (dataIndex === -1) return null; const dataArray = rows[1].split(','); return dataArray[dataIndex]; } //ici c'est un peu le bordel j'avoue function updateTableWithDLA(infosValue, goblinName) { } // Enregistrement du dernier temps de récupération de données let lastFetchTime = performance.now(); function refreshData() { goblinIDs.forEach(id => { const password = gobelinPasswords[id]; const url = `http://ie.gobland.fr/IE_Profil.php?id=${id}&passwd=${password}&sep=,&`; fetch(url) .then(response => response.text()) .then(csvData => { localStorage.setItem(`goblinInfo_${id}`, csvData); const currentTime = performance.now(); const timeElapsed = currentTime - lastFetchTime; lastFetchTime = currentTime; console.log(`Données pour l'ID ${id} rafraîchies et stockées dans le local storage.`); console.log(`Temps écoulé depuis le dernier appel pour ID ${id}: ${timeElapsed} millisecondes`); // Convertir le temps en heures et/ou minutes const timeInMinutes = Math.floor(timeElapsed / (1000 * 60)); const hours = Math.floor(timeInMinutes / 60); const minutes = timeInMinutes % 60; const formattedTime = `${hours}h ${minutes}m`; // Mettre à jour le titre du bouton avec le temps écoulé refreshButton.title = `Cliquez ici pour actualiser les données externes. NE PAS ABUSER. Dernière mise à jour il y a ${formattedTime}`; }) .catch(error => { console.error(`Erreur lors de la récupération du CSV pour l'ID ${id}:`, error); }); }); } const refreshButton = document.createElement('input'); refreshButton.type = 'button'; refreshButton.value = 'Rafraîchir les données externes'; refreshButton.title = 'Cliquez ici pour actualiser les données externes. NE PAS ABUSER'; refreshButton.onclick = refreshData; refreshButton.classList.add('refresh-button'); // Ajout de la classe au bouton const centerElement = document.querySelector('#identite .pfmm'); if (centerElement) { centerElement.appendChild(refreshButton); } else { console.error('Impossible de trouver l\'emplacement pour insérer le bouton.'); } })(); // Ajout de styles CSS pour centrer le bouton const style = document.createElement('style'); style.innerHTML = ` .refresh-button { display: block; margin: 0 auto; text-align: center; } `; document.head.appendChild(style); // Sélection de la colonne "Santé" const healthColumn = document.querySelector('.tab75 > tbody:nth-child(1) > tr:nth-child(2) > td:nth-child(4)'); // Appliquer le style pour empêcher le texte de passer à la ligne if (healthColumn) { healthColumn.style.whiteSpace = 'nowrap'; } // Fonction pour récupérer les informations du local storage function getGoblinInfoById(id) { const goblinData = localStorage.getItem(`goblinInfo_${id}`); console.log(`Data for ID ${id}:`, goblinData); // Vérification dans la console return goblinData; } // Fonction pour afficher les infos bulles function showGoblinInfoOnHover() { const playerLinks = document.querySelectorAll('td.pfmm a'); playerLinks.forEach(link => { link.addEventListener('mouseover', (event) => { const playerId = link.getAttribute('href').match(/\((\d+)\)/)[1]; const goblinInfo = getGoblinInfoById(playerId); const tooltip = document.createElement('div'); tooltip.classList.add('tooltip'); if (goblinInfo) { const lines = goblinInfo.split('\n'); // Divise les lignes const table = document.createElement('table'); table.classList.add('tooltip-table'); lines.forEach((line, index) => { const rowData = line.split(',').map(data => data.replace(/^"|"$/g, '')); // Divise les données par colonne et supprime les guillemets const row = document.createElement('tr'); rowData.forEach(cellData => { const cell = document.createElement(index === 0 ? 'th' : 'td'); // Utilisation de th pour la première ligne cell.textContent = cellData; row.appendChild(cell); }); table.appendChild(row); }); tooltip.appendChild(table); } else { tooltip.textContent = "Aucune information disponible, mot de passe de clan manquant"; } document.body.appendChild(tooltip); tooltip.style.position = 'absolute'; tooltip.style.top = `${event.clientY + window.scrollY}px`; tooltip.style.left = `${event.clientX}px`; tooltip.style.backgroundColor = 'white'; tooltip.style.border = '1px solid black'; tooltip.style.padding = '5px'; tooltip.style.zIndex = '9999'; tooltip.style.backgroundColor = 'yellow' link.addEventListener('mouseout', () => { tooltip.remove(); }); }); }); } // Appel de la fonction pour afficher les infos bulles showGoblinInfoOnHover(); } $(document).ready(function () { // Récupérer le message stocké dans localStorage const criStatus = localStorage.getItem("criStatus"); // Si le message n'est pas trouvé dans le localStorage, utiliser un message par défaut const messageToDisplay = criStatus || "Aucune information disponible"; // Si on est sur la page "vue", afficher le message stocké if ($(location).attr('href').match(/^http:\/\/(.*\.)?gobland\.fr\/vue\.php$/i)) { // Vérifier si un message existe dans le localStorage if (criStatus) { console.log("Message récupéré : " + criStatus); } else { console.log("Aucun message trouvé, affichage par défaut."); } // Créer l'élément pour le message const messageElement = $("<div>") .text(messageToDisplay) .css({ "margin-top": "14px", "text-align": "center", "font-weight": "bold", "color": criStatus === "Vous êtes sous cri de Guerre" ? "green" : "red", }); // Insérer le message sous les boutons $("input[type='button'][value='Envoyer un MP']") .parent() // Cible le parent de chaque bouton .before(messageElement); } // Si on est sur la page "meute", déterminer le statut et l'enregistrer dans localStorage if ($(location).attr('href').match(/http:\/\/(.*\.)?gobland\.fr\/Meute\.php/i)) { let criActif = false; // Variable pour vérifier si un membre a un niveau 0 // Parcourir chaque ligne du tableau des membres de la meute $("#content table.tab75 tbody tr").each(function () { // Extraire le niveau du membre const levelCell = $(this).find("td:nth-child(3)").text().trim(); // Cellule avec le niveau // Recherche du niveau (le dernier nombre dans la cellule) const match = levelCell.match(/\d+$/); if (match) { const level = parseInt(match[0], 10); console.log("Niveau trouvé : " + level); // Si un niveau est égal à 0, on active le cri de guerre if (level === 0) { criActif = true; return false; // Arrêter la boucle dès qu'on trouve un niveau égal à 0 } } }); // Déterminer le message en fonction de l'état du cri let message; if (criActif) { message = "Vous êtes sous cri de Guerre"; } else { message = "Attention, pas de cri actif actuellement"; } // Enregistrer le message dans localStorage localStorage.setItem("criStatus", message); // Afficher le message sur la page "meute" $("<div>") .text(message) .css("color", criActif ? "green" : "red") .css("font-weight", "bold") .css("margin-top", "12px") .insertAfter("#content table.tab75"); } // Affichage pour confirmation dans la console console.log("Message : " + messageToDisplay); }); //========================================================================================================================================================================================================================== // Page de résultat d'action - Envoi des CdM à GobZilla //========================================================================================================================================================================================================================== if ($(location).attr('href').match(/http:\/\/(.*\.)?gobland\.fr\/act\.php/i)) { // Extraction des caracs min - max d'une ligne de CdM function extractMinMax(intervalle) { var parse = intervalle.match(/entre (\d+) et (\d+)/); if (parse != null) { return new Array(parseInt(parse[1]), parseInt(parse[2])); } else { parse = intervalle.match(/inférieur ou égal à (\d+)/); if (parse != null) { return new Array(1, parseInt(parse[1])); } else { parse = intervalle.match(/supérieur ou égal à (\d+)/); if (parse != null) { return new Array(parseInt(parse[1]), parse[1]*1.5); } else { return null; } } } } $( document ).ready(function() { if ($("h1").text() == "Connaissance des Monstres") { // Analyse de la CdM var conteneur = $("#identite").find("div.deborde"); var rang = null; var executionLinesArr = conteneur.find("center:first").text().split("\n"); $.each( executionLinesArr, function( key, value ) { if (value.indexOf("AVEZ RÉUSSI") > 0) { rang = value.substring( value.indexOf("en tant que") + 12, value.indexOf(" (")); return false; } }); console.log("Rang = " + rang); // Vérification du rang : on ne traite pas les CdM des grouillots if (rang == "Maître" || rang == "Grand Maître") { var resultLinesArr = conteneur.text().split("\n"); var cdm = {}; cdm.gob = window.localStorage.getItem('gobId'); cdm.rang = rang; $.each( resultLinesArr, function( key, value ) { lineArr = value.split(" : "); // Construction de la CdM en parsant la page switch (lineArr[0]) { case "Le monstre ciblé fait partie des": cdm.nom = lineArr[1].split("(")[1].split(" - ")[0]; cdm.numMob = lineArr[1].split(" - N° ")[1].split(")")[0]; break; case "Niveau": cdm.niveau = lineArr[1]; break; case "Points de Vie": var arrMinMax = extractMinMax(lineArr[1]); cdm.pvMin = arrMinMax[0]; cdm.pvMax = arrMinMax[1]; break; case "Dés d'Attaque": var arrMinMax = extractMinMax(lineArr[1]); cdm.attMin = arrMinMax[0]; cdm.attMax = arrMinMax[1]; break; case "Dés d'Esquive": var arrMinMax = extractMinMax(lineArr[1]); cdm.esqMin = arrMinMax[0]; cdm.esqMax = arrMinMax[1]; break; case "Dés de Dégât": var arrMinMax = extractMinMax(lineArr[1]); cdm.degMin = arrMinMax[0]; cdm.degMax = arrMinMax[1]; break; case "Dés de Régénération": var arrMinMax = extractMinMax(lineArr[1]); cdm.regMin = arrMinMax[0]; cdm.regMax = arrMinMax[1]; break; case "Perception": var arrMinMax = extractMinMax(lineArr[1]); cdm.perMin = arrMinMax[0]; cdm.perMax = arrMinMax[1]; break; case "Armure Physique": var arrMinMax = extractMinMax(lineArr[1]); cdm.armurePhyMin = arrMinMax[0]; cdm.armurePhyMax = arrMinMax[1]; break; case "Armure Magique": var arrMinMax = extractMinMax(lineArr[1]); cdm.armureMagMin = arrMinMax[0]; cdm.armureMagMax = arrMinMax[1]; break; case "Durée du tour": var arrMinMax = extractMinMax(lineArr[1]); cdm.tourMin = arrMinMax[0]; cdm.tourMax = arrMinMax[1]; break; case "Créature volante": cdm.vol = lineArr[1]; break; case "Attaque à distance": cdm.distance = lineArr[1]; break; case "Pouvoir": cdm.pouvoir = lineArr[1]; break; case "Nombre d'attaques": cdm.nbAttaques = lineArr[1]; break; case "Habitat": cdm.habitat = lineArr[1]; break; case "Comportement": cdm.comportement = lineArr[1]; break; case "Intelligence": cdm.intelligence = lineArr[1]; break; case "Vitesse de déplacement": cdm.vitesse = lineArr[1]; break; case "Vision du Caché": cdm.vlc = lineArr[1]; break; } }); // Envoi de la CdM var url = "https://gobzilla.incaworld.fr/cdm"; var result = $("<center></center>"); console.log(cdm); var data = JSON.stringify(cdm); console.log(data); $.ajax({ type: "PUT", url: url, contentType: "application/json", data: data }) .done(function() { result.html("<br><b>**** CdM envoyée à GobZilla ****</b>"); }) .fail(function(err) { console.log(err); result.html("<br><b>**** Echec de l'envoi de la CdM à GobZilla ****</b>"); }) .always(function() { result.insertAfter(conteneur.find("center:last")); }); } } }); } //========================================================================================================================================================================================================================== // Page MENU (left) //========================================================================================================================================================================================================================== if ($(location).attr('href').match(/http:\/\/(.*\.)?gobland\.fr\/Menu\.php/i)) { // Enregistrement dans le stockage local de l'identité du Gob var gobContainer = $(".presentation").find('a:first'); window.localStorage.setItem('gobName', gobContainer.text()); window.localStorage.setItem('gobId', gobContainer.attr('href').match(/javascript:EPV\((\d+)\)/)[1]); } //========================================================================================================================================================================================================================== // Page ACTIONS (footer) Affiche en couleur les monstres qui manquent de CDM //========================================================================================================================================================================================================================== if ($(location).attr('href').match(/http:\/\/(.*\.)?gobland\.fr\/playActions\.php/i)) { function showHideCdmNeededActions() { var displayCdmNeededChecked = window.localStorage.getItem('displayCdmNeededChecked'); if(displayCdmNeededChecked == 1) { var cdmNeeded = window.localStorage.getItem('cdmNeeded'); $.each(cdmNeeded.split(","), function(index, value) { $('option:contains("' + value + '")').css("background-color", "#FF99FF"); }); } else { $(".cdmNeeded").removeClass("cdmNeeded"); } } // Après chargement de la page, lancement des enhancements $( document ).ready(function() { showHideCdmNeededActions(); }); } //========================================================================================================================================================================================================================== // Page VUE. Vue 2D, divers filtres/tri, modification de la CSS, lieux et plantes étendus, CDM, Compteur de créatures //========================================================================================================================================================================================================================== if ($(location).attr('href').match(/^http:\/\/(.*\.)?gobland\.fr\/vue\.php$/i)) { // Intégration de CSS pour le loader et la CDM var myCSS = ` #preFilter label { padding-left: 10px; } #preFilter { padding: 5px; margin-bottom: 5px; border: 1px solid black; text-align: center; } #btnRefresh { display: block; text-align: center; margin: auto; } #filterDiv { padding-bottom: 5px; } #filterDiv label { padding-left: 10px; } .ckbFilter { vertical-align: middle; } .cdmNeeded { background-color: #FF99FF; } .cuisine { background-color: #99FF99; } .cdmContainer { background: url(http://images.gobland.fr/v1.0/grande-fenetre/gf-centre.png); border: 2px solid #666; font-family: sans-serif; font-size: 12px; padding: 10px; display: inline-block; background-color: #ddd; position: fixed; width: 400px; left: 270px; top: 10%; } .cdmContainer .title { font-weight: bold; font-size: 14px; } .cdmContainer span { display: block; padding: 2px; } .lds-roller { display: inline-block; position: fixed; width: 80px; height: 80px; left: 415px; top: 50%; z-index: 1000; } .lds-roller div { animation: lds-roller 1.2s cubic-bezier(0.5, 0, 0.5, 1) infinite; transform-origin: 40px 40px; } .lds-roller div:after { content: " "; display: block; position: absolute; width: 7px; height: 7px; border-radius: 50%; background: #000; margin: -4px 0 0 -4px; } .lds-roller div:nth-child(1) { animation-delay: -0.036s; } .lds-roller div:nth-child(1):after { top: 63px; left: 63px; } .lds-roller div:nth-child(2) { animation-delay: -0.072s; } .lds-roller div:nth-child(2):after { top: 68px; left: 56px; } .lds-roller div:nth-child(3) { animation-delay: -0.108s; } .lds-roller div:nth-child(3):after { top: 71px; left: 48px; } .lds-roller div:nth-child(4) { animation-delay: -0.144s; } .lds-roller div:nth-child(4):after { top: 72px; left: 40px; } .lds-roller div:nth-child(5) { animation-delay: -0.18s; } .lds-roller div:nth-child(5):after { top: 71px; left: 32px; } .lds-roller div:nth-child(6) { animation-delay: -0.216s; } .lds-roller div:nth-child(6):after { top: 68px; left: 24px; } .lds-roller div:nth-child(7) { animation-delay: -0.252s; } .lds-roller div:nth-child(7):after { top: 63px; left: 17px; } .lds-roller div:nth-child(8) { animation-delay: -0.288s; } .lds-roller div:nth-child(8):after { top: 56px; left: 12px; } @keyframes lds-roller { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } }`; var myStyle = document.createElement("style"); myStyle.setAttribute("type", "text/css"); myStyle.appendChild(document.createTextNode(myCSS)); document.body.appendChild(myStyle); // HTML pour le loader 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>"); $("#content").append(loader); $("#loader").hide(); // HTML pour les CdM var cdm = $("<div id=\"cdm\" class=\"cdmContainer\"></div>"); $("#content").append(cdm); cdm.click(function(evt) { evt.preventDefault(); $("#cdm").hide(); }); $("#cdm").hide(); const raceGobs = ["Musculeux", "Mentalo", "Nodef", "Trad Scion", "Vis Yonnair", "Zozo Giste"]; const monstreAMasquer = ["Lémure", "Sprigan", "Larbin démoniaque", "Plante Carnivore", "Abishaii Blanc", "Abishaii Bleu" , "Abishaii Noir ", "Abishaii Vert" , "Ame-en-peine" , "Pitimarmotte" , "Diablotin" ]; const ArbresAMasquer = ["Arbre"]; const suivants =["Créature mécanique", "Squelette", "Pierreux" , "Esprit-rôdeur" , "Zombi"]; //insere un lien vers GobMaps (function() { 'use strict'; // Fonction pour créer et insérer l'icône function insertIcon() { // Vérifier si l'icône existe déjà pour éviter les doublons if (document.getElementById("gobmaps-icon")) { console.log("Icône déjà insérée, arrêt."); return; } // Créer un conteneur pour l'icône const iconContainer = document.createElement("div"); iconContainer.id = "gobmaps-icon"; iconContainer.style.textAlign = "center"; iconContainer.style.margin = "0 0"; iconContainer.style.fontFamily = "Arial, sans-serif"; // Créer le lien avec l'icône const link = document.createElement("a"); link.href = "https://gobmaps.rf.gd/carte.html"; link.title = "Aller sur GobMaps"; // Tooltip au survol link.target = "_blank"; // Créer l'élément image const icon = document.createElement("img"); icon.src = "https://i.ibb.co/tpnPvnYv/favicon.jpg"; icon.alt = "GobMaps"; icon.style.width = "32px"; // Ajustez la taille si nécessaire icon.style.height = "26px"; icon.style.verticalAlign = "middle"; link.appendChild(icon); iconContainer.appendChild(link); // Trouver le bouton "Envoyer des PX" const pxButton = document.querySelector('center input[type="BUTTON"][value="Envoyer des PX"]'); if (pxButton && pxButton.parentNode) { console.log("Bouton 'Envoyer des PX' trouvé, insertion de l'icône après."); // Insérer après le bouton "Envoyer des PX" pxButton.parentNode.insertBefore(iconContainer, pxButton.nextSibling.nextSibling); // Passe après l'espace ( ) } else { console.warn("Bouton 'Envoyer des PX' non trouvé."); // Fallback : insérer dans #content const contentDiv = document.getElementById("content"); if (contentDiv) { console.log("Insertion de secours dans #content."); contentDiv.appendChild(iconContainer); } else { console.warn("Aucun conteneur de secours (#content) trouvé."); } } } // Essayer d'insérer l'icône au chargement initial document.addEventListener("DOMContentLoaded", () => { console.log("DOM chargé, tentative d'insertion de l'icône."); insertIcon(); }); // Observer les changements dans le DOM pour un chargement dynamique const observer = new MutationObserver((mutations, obs) => { console.log("Changement détecté dans le DOM, nouvelle tentative d'insertion."); insertIcon(); // Arrêter l'observation si l'icône a été insérée if (document.getElementById("gobmaps-icon")) { obs.disconnect(); console.log("Icône insérée, observation arrêtée."); } }); observer.observe(document.body, { childList: true, subtree: true }); console.log("Observation du DOM démarrée."); })(); /// Coloration des gobs $.each(raceGobs, function(index, value) { $('#TCREATURES > center > table > tbody > tr > td:contains("' + value + '")').parent().css("background-color","#ccccff"); }); // Coloration des suivants avec condition supplémentaire $.each(suivants, function(index, value) { $('#TCREATURES > center > table > tbody > tr > td:contains("' + value + '")').each(function() { // Récupérez le texte de l'élément td contenant le lien var texte = $(this).parent().find('td:eq(2)').text(); // Utilisez une expression régulière pour extraire le nombre entre parenthèses var nombre = texte.match(/\((\d+)\)/); // Vérifiez si le nombre extrait existe et est supérieur à 1000 if (nombre && parseInt(nombre[1]) < 1000000) { // Coloration de l'élément parent de l'élément td $(this).parent().css("background-color", "#ffadde"); } }); }); //// Coloration des gros mobs et indication px $("#TCREATURES > center > table > tbody > tr").each( function(){ var nValue = parseInt($(this).find('td').eq(8).text(), 10); // Obtenez la valeur de la colonne N if (nValue === 0) { $(this).css({ "font-style": "italic", // Appliquer le style italique à la ligne entière "color": "grey" // Changer la couleur du texte en gris }); $(this).find('td a').css("color", "grey"); // Changer la couleur du lien en gris } else { $(this).css({ "font-style": "normal", // Réinitialiser le style si la valeur de N n'est pas 0 "color": "black" // Réinitialiser la couleur du texte }); $(this).find('td a').css("color", "blue"); // Réinitialiser la couleur du lien } var race = $(this).find('td').eq(4).text(); if (jQuery.inArray(race, raceGobs) < 0) { var tdlevel = $(this).find('td'); var lvl = parseInt(tdlevel.eq(3).text(), 10); if (isNaN(lvl)) return; if (lvl > 39) { $(this).css("background-color","#f55442") } else if (lvl > 29) { $(this).css("background-color","#f59c42") } else if (lvl > 25) { $(this).css("background-color","#f5b342") } var id = 0; var infosMob = $(this).find('a:first').attr('href').match(/javascript:EMV\((\d+)\)/); if (infosMob != null) { id = parseInt(infosMob[1]); if (id < 9999) { // $(this).css("background-color", "#6fcf97"); // Green background for creatures with ID < 9999 $(this).find('td').eq(2).css("background-color", "#c791b1"); // Apply green background to the ID cell } } /// création de tresorsData qui récup les trésors dans la vue et est utilisé dans les ordres des suivants const tableauTresors = document.getElementById('TOBJETS'); if (tableauTresors) { // Sélection des lignes du tableau const lignes = tableauTresors.getElementsByTagName('tr'); const tresors = []; // Parcours de chaque ligne du tableau for (let i = 1; i < lignes.length; i++) { const colonnes = lignes[i].getElementsByTagName('td'); // Extraction des données de chaque colonne const distance = colonnes[0].textContent; const reference = colonnes[1].textContent; const nom = colonnes[2].textContent; const x = colonnes[3].textContent; const y = colonnes[4].textContent; const n = colonnes[5].textContent; // Stockage des données dans un objet const tresorObj = { distance, reference, nom, x, y, n }; // Ajout de l'objet à la liste des trésors tresors.push(tresorObj); } // Stockage des trésors dans localStorage localStorage.setItem('tresorsData', JSON.stringify(tresors)); } /// Ajout de l'affichage d'une CDM au clic sur la race $(this).find('td').eq(4).css("cursor", "pointer"); $(this).find('td').eq(4).click(function(evt) { evt.preventDefault(); $("#loader").show(); var url = "https://gobzilla.incaworld.fr/cdm/"+race+"/"+lvl+"/"+id; $.getJSON( url, function( data ) { if (data["race"] != undefined) { $("#loader").hide(); $("#cdm").html( "<div class=\"title\">" + data["nom"] + (data["numMob"]?" (n° " + data["numMob"] + ")":"") + "</div>" + "<p>Le monstre fait partie des : " + data["race"] + "</p>" + "<span>Niveau moyen : " + data["niveau"] + "</span>" + "<span>Points de Vie : entre " + data["pvMin"] + " à " + data["pvMax"] + "</span>" + "<span>Dés d'Attaque : entre " + data["attMin"] + " et " + data["attMax"] + "</span>" + "<span>Dés d'Esquive : entre " + data["esqMin"] + " et " + data["esqMax"] + "</span>" + "<span>Dés de Dégât : entre " + data["degMin"] + " et " + data["degMax"] + "</span>" + "<span>Dés de Régénération : entre " + data["regMin"] + " et " + data["regMax"] + "</span>" + "<span>Perception : entre " + data["perMin"] + " et " + data["perMax"] + "</span>" + "<span>Armure Physique : entre " + data["armurePhyMin"] + " et " + data["armurePhyMax"] + "</span>" + "<span>Armure Magique : entre " + data["armureMagMin"] + " et " + data["armureMagMax"] + "</span>" + "<span>Tour : entre " + data["tourMin"] + "h et " + data["tourMax"] + "h</span>" + "<span>Pouvoir : " + data["pouvoir"] + "</span>" + "<span>Créature volante : " + (data["vol"]?"Oui":"Non") + "</span>" + "<span>Attaque à distance : " + (data["distance"]?"Oui":"Non") + "</span>" + "<span>Nombre d'attaques : " + data["nbAttaques"] + "</span>" + "<span>Comportement : " + data["comportement"] + "</span>" + "<span>Intelligence : " + data["intelligence"] + "</span>" + "<span>Vitesse : " + data["vitesse"] + "</span>" + "<span>VLC : " + data["vlc"] + "</span>" + "<span>" + data["magie"] + "</span></br>" + "<b>Moyenne basée sur " + data["nbCdm"] + " CdM</b>"); } else { $("#loader").hide(); $("#cdm").html("Pas de CDM en stock !"); } $("#cdm").show(); }); }); if (lvlmeute != undefined) { var px = Math.max(0, 20+2*(lvl-lvlmeute)+lvl); tdlevel.prop('title', px + "px"); } else { tdlevel.prop('title', "Merci de visiter la page meute pour charger le niveau"); } } }); //// fonction filtre creatures dans la vue (function() { 'use strict'; const table = document.querySelector('#TCREATURES table'); if (table) { const headers = table.querySelectorAll('th'); headers.forEach(header => { if (!header.hasAttribute('colspan')) { header.style.cursor = 'pointer'; const arrowUp = document.createElement('span'); arrowUp.textContent = ' ▲'; arrowUp.className = 'sortIndicator'; arrowUp.style.display = 'none'; const arrowDown = document.createElement('span'); arrowDown.textContent = ' ▼'; arrowDown.className = 'sortIndicator'; arrowDown.style.display = 'none'; header.appendChild(arrowUp); header.appendChild(arrowDown); let ascending = false; // Utilisation de l'attribut title pour l'infobulle header.title = "Cliquer pour classer dans l'ordre"; header.addEventListener('click', () => { // reset sort indicators $(".sortIndicator").css("display", 'none'); const headerIndex = Array.from(headers).indexOf(header); let rows = Array.from(table.querySelectorAll('tbody tr')); rows.sort((a, b) => { const aValue = a.cells[headerIndex].textContent.trim(); const bValue = b.cells[headerIndex].textContent.trim(); // La 1ère ligne est toujours en haut if (a.cells[0].textContent.trim().match("^Dist.")) return -1; let result = aValue.localeCompare(bValue, undefined, { numeric: true }); if (!ascending) { result *= -1; } return result; }); ascending = !ascending; arrowUp.style.display = ascending ? 'none' : 'inline-block'; arrowDown.style.display = ascending ? 'inline-block' : 'none'; table.querySelector('tbody').innerHTML = ''; rows.forEach(row => table.querySelector('tbody').appendChild(row)); }); } }); } })(); //// fonction filtre trésors dans la vue (function() { 'use strict'; const table = document.querySelector('#TOBJETS table'); if (table) { const headers = table.querySelectorAll('th'); headers.forEach(header => { if (!header.hasAttribute('colspan')) { header.style.cursor = 'pointer'; const arrowUp = document.createElement('span'); arrowUp.textContent = ' ▲'; arrowUp.className = 'sortIndicator'; arrowUp.style.display = 'none'; const arrowDown = document.createElement('span'); arrowDown.textContent = ' ▼'; arrowDown.className = 'sortIndicator'; arrowDown.style.display = 'none'; header.appendChild(arrowUp); header.appendChild(arrowDown); let ascending = false; // Utilisation de l'attribut title pour l'infobulle header.title = "Cliquer pour classer dans l'ordre"; header.addEventListener('click', () => { // reset sort indicators $(".sortIndicator").css("display", 'none'); const headerIndex = Array.from(headers).indexOf(header); let rows = Array.from(table.querySelectorAll('tbody tr')); rows.sort((a, b) => { const aValue = a.cells[headerIndex].textContent.trim(); const bValue = b.cells[headerIndex].textContent.trim(); // La 1ère ligne est toujours en haut if (a.cells[0].textContent.trim().match("^Dist.")) return -1; let result = aValue.localeCompare(bValue, undefined, { numeric: true }); if (!ascending) { result *= -1; } return result; }); ascending = !ascending; arrowUp.style.display = ascending ? 'none' : 'inline-block'; arrowDown.style.display = ascending ? 'inline-block' : 'none'; table.querySelector('tbody').innerHTML = ''; rows.forEach(row => table.querySelector('tbody').appendChild(row)); }); } }); } })(); //// fonction filtre plantes dans la vue (function() { 'use strict'; const table = document.querySelector('#TPLANTS table'); if (table) { const headers = table.querySelectorAll('th'); headers.forEach(header => { if (!header.hasAttribute('colspan')) { header.style.cursor = 'pointer'; const arrowUp = document.createElement('span'); arrowUp.textContent = ' ▲'; arrowUp.className = 'sortIndicator'; arrowUp.style.display = 'none'; const arrowDown = document.createElement('span'); arrowDown.textContent = ' ▼'; arrowDown.className = 'sortIndicator'; arrowDown.style.display = 'none'; header.appendChild(arrowUp); header.appendChild(arrowDown); let ascending = false; header.addEventListener('click', () => { // reset sort indicators $(".sortIndicator").css("display", 'none'); const headerIndex = Array.from(headers).indexOf(header); let rows = Array.from(table.querySelectorAll('tbody tr')); rows.sort((a, b) => { const aValue = a.cells[headerIndex].textContent.trim(); const bValue = b.cells[headerIndex].textContent.trim(); // La 1ère ligne est toujours en haut if (a.cells[0].textContent.trim().match("^Dist.")) return -1; let result = aValue.localeCompare(bValue, undefined, { numeric: true }); if (!ascending) { result *= -1; } return result; }); ascending = !ascending; arrowUp.style.display = ascending ? 'none' : 'inline-block'; arrowDown.style.display = ascending ? 'inline-block' : 'none'; table.querySelector('tbody').innerHTML = ''; rows.forEach(row => table.querySelector('tbody').appendChild(row)); }); } }); } })(); //// compteur de créatures (function() { 'use strict'; function updateRowCount() { var table = document.getElementById("TCREATURES"); var rowCount = table.getElementsByTagName("tr").length - 1; $('a[name="CREATURES"]').next().html("Créatures (" + rowCount + " visibles)"); } var observer = new MutationObserver(updateRowCount); var target = document.querySelector("#TCREATURES tbody"); var config = { childList: true, subtree: true }; observer.observe(target, config); updateRowCount(); })(); var show2DChecked = window.localStorage.getItem('show2DChecked'); var displayLieuxChecked = window.localStorage.getItem('displayLieuxChecked'); var displayPlantesChecked = window.localStorage.getItem('displayPlantesChecked'); var displayCdmNeeded = window.localStorage.getItem('displayCdmNeededChecked'); var displayCuisine = window.localStorage.getItem('displayCuisineChecked'); var displayMiniMobs = window.localStorage.getItem('displayMiniMobs'); var displayTrees = window.localStorage.getItem('displayTreesChecked'); var displayFullWidth = window.localStorage.getItem('displayFullWidthChecked'); var vue2DBuilt = false; var extendedLieuxBuilt = false; var extendedPlantesBuilt = false; var R; function showHideVue2d() { if($('#ckbDisplay2D').is(":checked")) { window.localStorage.setItem('show2DChecked', 1); if (!vue2DBuilt) build2DView(); $("#vue2D").show(); $("#filterDiv").show(); } else { window.localStorage.setItem('show2DChecked', 0); $("#vue2D").hide(); $("#filterDiv").hide(); } } function showHideExtendedLieux() { if($('#ckbDisplayLieux').is(":checked")) { window.localStorage.setItem('displayLieuxChecked', 1); if (!extendedLieuxBuilt) buildExtendedLieux(); $(".extendedLieu").show(); } else { window.localStorage.setItem('displayLieuxChecked', 0); $(".extendedLieu").hide(); } } function showHideExtendedPlantes() { if($('#ckbDisplayPlantes').is(":checked")) { window.localStorage.setItem('displayPlantesChecked', 1); if (!extendedPlantesBuilt) buildExtendedPlantes(); $(".extendedPlante").show(); } else { window.localStorage.setItem('displayPlantesChecked', 0); $(".extendedPlante").hide(); } } function refreshCdmNeeded() { $("#loader").show(); var urlCdMNeeded = "https://gobzilla.incaworld.fr/mobs/cdm/5"; $.getJSON( urlCdMNeeded, function( data ) { if (data != undefined) { window.localStorage.setItem('cdmNeeded', data.monstres); window.localStorage.setItem('cdmNeededUpdate', new Date()); } $("#loader").hide(); }); } function showHideCdmNeeded() { if($('#ckbDisplayCdmNeeded').is(":checked")) { window.localStorage.setItem('displayCdmNeededChecked', 1); var cdmNeededUpdate = new Date(window.localStorage.getItem('cdmNeededUpdate')); var delta = (new Date() - cdmNeededUpdate)/1000/60/60/24; if (delta > 5) { refreshCdmNeeded(); } var cdmNeeded = window.localStorage.getItem('cdmNeeded'); $.each(cdmNeeded.split(","), function(index, value) { $('#TCREATURES td:contains("' + value + '")').closest('tr').find('td:eq(5)').text("CdM manquante !"); }); } else { window.localStorage.setItem('displayCdmNeededChecked', 0); $(".cdmNeeded").removeClass("cdmNeeded"); $('#TCREATURES td:contains("CdM manquante !")').text(""); } } function refreshCuisine() { $("#loader").show(); var urlCuisine = "https://gobzilla.incaworld.fr/mobs/insecte"; $.getJSON( urlCuisine, function( data ) { if (data != undefined) { window.localStorage.setItem('cuisine', data.monstres); window.localStorage.setItem('cuisineUpdate', new Date()); } $("#loader").hide(); }); } function showHideCuisine() { if($('#ckbDisplayCuisine').is(":checked")) { window.localStorage.setItem('displayCuisineChecked', 1); var cuisineUpdate = new Date(window.localStorage.getItem('cuisineUpdate')); var delta = (new Date() - cuisineUpdate)/1000/60/60/24; if (delta > 30) { refreshCuisine(); } var cuisine = window.localStorage.getItem('cuisine'); $.each(cuisine.split(","), function(index, value) { $('#TCREATURES td:contains("' + value + '")').parent().addClass("cuisine"); }); } else { window.localStorage.setItem('displayCuisineChecked', 0); $(".cuisine").removeClass("cuisine"); } } function showHideMiniMobs() { if ($('#ckbDisplayMiniMobs').is(":checked")) { window.localStorage.setItem('displayMiniMobs', 1); // Suppression des mobs trop nombreux $.each(monstreAMasquer, function(index, value) { $('#TCREATURES > center > table > tbody > tr > td:contains("' + value + '")').each(function() { var chiffre = parseInt($(this).parent().find('td:first').text()); if (chiffre < 2) { $(this).parent().show(); } else { $(this).parent().hide(); } }); }); } else { window.localStorage.setItem('displayMiniMobs', 0); // Affichage de tous les mobs $.each(monstreAMasquer, function(index, value) { $('#TCREATURES > center > table > tbody > tr > td:contains("' + value + '")').parent().show(); }); } } function showHideTrees() { if($('#ckbDisplayTrees').is(":checked")) { window.localStorage.setItem('displayTreesChecked', 1); // Suppression des arbres $.each(ArbresAMasquer, function(index, value) { $('#TLIEUX > center > table > tbody > tr > td:contains("' + value + '")').parent().hide(); }); } else { window.localStorage.setItem('displayTreesChecked', 0); $.each(ArbresAMasquer, function(index, value) { $('#TLIEUX > center > table > tbody > tr > td:contains("' + value + '")').parent().show(); }); } } function showVueFullWidth() { if($('#ckbDisplayFullWidth').is(":checked")) { window.localStorage.setItem('displayFullWidthChecked', 1); // Vue en pleine largeur } else { window.localStorage.setItem('displayFullWidthChecked', 0); // Vue normale } } function refreshListes() { refreshCuisine(); showHideCuisine(); refreshCdmNeeded(); showHideCdmNeeded(); } // Après chargement de la page, lancement des enhancements $( document ).ready(function() { // Full width if (displayFullWidth == 1) { $('#ckbDisplayFullWidth').prop( "checked", displayFullWidth ); } showVueFullWidth(); // Mini mobs if (displayMiniMobs == 1) { $('#ckbDisplayMiniMobs').prop( "checked", displayMiniMobs ); } showHideMiniMobs(); // showhide trees if (displayTrees == 1) { $('#ckbDisplayTrees').prop( "checked", displayTrees ); } showHideTrees(); // Liste des lieux étendue if (displayLieuxChecked == 1) { $('#ckbDisplayLieux').prop( "checked", displayLieuxChecked ); } showHideExtendedLieux(); //Liste des plantes étendue if (displayPlantesChecked == 1) { $('#ckbDisplayPlantes').prop( "checked", displayPlantesChecked ); } showHideExtendedPlantes(); // Vue 2D if (show2DChecked == 1) { $('#ckbDisplay2D').prop( "checked", show2DChecked ); } showHideVue2d(); // CdM manquantes if (displayCdmNeeded == 1) { $('#ckbDisplayCdmNeeded').prop( "checked", displayCdmNeeded ); } showHideCdmNeeded(); // A cuisiner if (displayCuisine == 1) { $('#ckbDisplayCuisine').prop( "checked", displayCuisine ); } showHideCuisine(); $('#btnRefresh').click(function(evt) { evt.preventDefault(); $("#btnRefresh").val("..."); refreshListes(); $("#btnRefresh").val("Done !"); }); }); var cells = {}; var niveau = 0; var _X=0, _Y=0, _N=0; var div = $("<div id=\"vue2D\"></div>"); div.insertBefore($("form[action*='newMail.php']")); //======================================================================= // Filters //======================================================================= var prediv = $("<div id=\"preFilter\"></div>"); prediv.css({ 'background-color': 'gainsboro', // Couleur de fond sombre 'border': '2px solid black', // Bordure noire 'padding': '10px', // Espacement intérieur 'margin': '10px' // Marge extérieure }); var select = document.createElement('select'); select.id = 'lvlherbo'; select.innerHTML = ` <option value="1.5">A</option> <option value="2">C</option> <option value="2.5">M</option> <option value="3">GM</option>`; prediv.append(select); prediv.append("</br>"); prediv.insertBefore(div); prediv.append($('<label />', { 'for': 'ckbDisplay2D', text: 'Vue 2D', title: 'affiche une vue 2d des éléments qui vous entoure' })); prediv.append($("<input type=\"checkbox\" id=\"ckbDisplay2D\" title=\"affiche une vue 2d des éléments qui vous entoure\" name=\"ckbDisplay2D\" class=\"ckbFilter\" >")); prediv.append($('<label />', { 'for': 'ckbDisplayLieux', text: ' Lieux étendus', title: 'affiche tous les lieux déja connus hors de votre vue' })); prediv.append($("<input type=\"checkbox\" id=\"ckbDisplayLieux\" title=\"affiche tous les lieux déja connus hors de votre vue\" name=\"ckbDisplayLieux\" class=\"ckbFilter\" >")); 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é' })); prediv.append($("<input type=\"checkbox\" id=\"ckbDisplayPlantes\" title=\"affiche toutes les plantes déja connues hors de votre vue\" name=\"ckbDisplayPlantes\" class=\"ckbFilter\" >")); prediv.append($('<label />', { 'for': 'ckbDisplayCdmNeeded', text: ' CdM manquantes', title: 'permet de savoir quel monstres sont manquants dans la base de données des CdM' })); 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\" >")); prediv.append($('<label />', { 'for': 'ckbDisplayCuisine', text: ' Mobs à cuisiner', title: 'met en surbrillance les monstres les + efficaces pour la cuisine' })); prediv.append($("<input type=\"checkbox\" id=\"ckbDisplayCuisine\" title=\"met en surbrillance les monstres les + efficaces pour la cuisine\" name=\"ckbDisplayCuisine\" class=\"ckbFilter\" >")); prediv.append("</br>"); 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' })); prediv.append($("<input type=\"checkbox\" id=\"ckbDisplayMiniMobs\" title=\"masquer les tout petits monstres (lémures, larbins ..)\" name=\"ckbDisplayMiniMobs\" class=\"ckbFilter\" >")); prediv.append($('<label />', { 'for': 'ckbDisplayTrees', text: ' Masquer Arbres.', title: 'masque les arbres' })); prediv.append($("<input type=\"checkbox\" id=\"ckbDisplayTrees\" title=\"masque les arbres\" name=\"ckbDisplayTrees\" class=\"ckbFilter\" >")); prediv.append($('<label />', { 'for': 'ckbDisplayFullWidth', text: ' Vue pleine largeur', title: 'pour les grandes vue. Permet d élargir la vue 2d pour une meilleure visualisation' })); 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\" >")); prediv.append("</br>"); prediv.append($('<label />', { 'for': 'monsterLevelMin', text: 'Filtrer Lvl ', title: 'Filtrer les monstres par niveau' })); var levelInputMin = $("<input type='number' id='monsterLevelMin' placeholder='Min' min='0' max='100' style='width: 60px;'>"); prediv.append(levelInputMin); var levelInputMax = $("<input type='number' id='monsterLevelMax' placeholder='Max' min='0' max='100' style='width: 60px;'>"); prediv.append(levelInputMax); var filterButton = $("<button id='applyFilter'>Filtrer</button>"); prediv.append(filterButton); prediv.append("</br>"); prediv.append("</br>"); prediv.append($("<input type=\"button\" id=\"btnRefresh\" name=\"btnRefresh\" value=\"Rafraîchir les listes\">")); prediv.append("</br>"); prediv.append($('<label />', { 'for': 'ckbFetchCSV', text: ' Vue DeathMetal', title: 'profitez de la vue de DeathMetal. Attention, utiliser avec parcimonie !' })); 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\" >")); // filtres de la vue 2d var filterDiv = $("<div id=\"filterDiv\"></div>"); filterDiv.insertBefore(div); filterDiv.append($('<label />', { 'for': 'ckbNiveau', text: 'Même niveau' })); filterDiv.append($("<input type=\"checkbox\" id=\"ckbNiveau\" name=\"ckbNiveau\" class=\"ckbFilter\" >")); filterDiv.append($('<label />', { 'for': 'ckbObject', text: 'Trésor' })); filterDiv.append($("<input type=\"checkbox\" id=\"ckbObject\" name=\"ckbObject\" class=\"ckbFilter\" checked=\"checked\" >")); filterDiv.append($('<label />', { 'for': 'ckbMonster', text: 'Monstre' })); filterDiv.append($("<input type=\"checkbox\" id=\"ckbMonster\" name=\"ckbMonster\" class=\"ckbFilter\" checked=\"checked\" >")); filterDiv.append($('<label />', { 'for': 'ckbPlant', text: 'Plante' })); filterDiv.append($("<input type=\"checkbox\" id=\"ckbplants\" name=\"ckbplants\" class=\"ckbFilter\" checked=\"checked\" >")); filterDiv.append($('<label />', { 'for': 'ckbPlace', text: 'Lieu' })); filterDiv.append($("<input type=\"checkbox\" id=\"ckbPlace\" name=\"ckbPlace\" class=\"ckbFilter\" checked=\"checked\" >")); filterDiv.append($('<label />', { 'for': 'ckbBigMonsters', text: 'Gros monstres', title: 'afficher que les monstres sup à 40' })); filterDiv.append($("<input type=\"checkbox\" id=\"ckbBigMonsters\" name=\"ckbBigMonsters\" class=\"ckbFilter\" >")); //======================================================================= // Filtre Herbo //======================================================================= // Cache initialement le niveau herbo select.style.display = 'none'; // Fonction pour contrôler la visibilité du niveau herbo function toggleLvlHerboVisibility() { if ($('#ckbDisplayPlantes').is(':checked')) { select.style.display = 'block'; $('#lvlherbo').css('display', 'inline-block'); } else { select.style.display = 'none'; $('#lvlherbo').css('display', 'none'); } } $('#ckbDisplayPlantes').change(function() { toggleLvlHerboVisibility(); }); toggleLvlHerboVisibility(); //======================================================================= // Fonction pour filtrer les monstres dans le tableau et la vue 2D //======================================================================= function applyMonsterFilter(minLevel, maxLevel) { // Filtrer dans le tableau seulement si minLevel et maxLevel sont spécifiés if (!isNaN(minLevel) && !isNaN(maxLevel)) { $("#TCREATURES > center > table > tbody > tr").each(function() { var tdLevel = $(this).find('td').eq(3); var lvl = parseInt(tdLevel.text(), 10); if (!isNaN(lvl)) { if (lvl >= minLevel && lvl <= maxLevel) { $(this).show(); } else { $(this).hide(); } } }); } else { // Si minLevel ou maxLevel n'est pas spécifié, afficher tous les éléments showHideMiniMobs(); } // Sauvegarder les valeurs dans le localStorage localStorage.setItem('monsterLevelMin', minLevel); localStorage.setItem('monsterLevelMax', maxLevel); } // Charger les valeurs depuis le localStorage et appliquer le filtre au chargement de la page $(document).ready(function() { var savedMinLevel = localStorage.getItem('monsterLevelMin'); var savedMaxLevel = localStorage.getItem('monsterLevelMax'); if (savedMinLevel !== null && savedMaxLevel !== null) { levelInputMin.val(savedMinLevel); levelInputMax.val(savedMaxLevel); applyMonsterFilter(parseInt(savedMinLevel, 10), parseInt(savedMaxLevel, 10)); } }); // Gestion du clic sur le bouton de filtrage filterButton.on('click', function() { var minLevel = parseInt(levelInputMin.val(), 10); var maxLevel = parseInt(levelInputMax.val(), 10); applyMonsterFilter(minLevel, maxLevel); }); //======================================================================= /// masquer via une petite fleche tout ce beau monde //======================================================================= var isPreFilterVisible = localStorage.getItem('isPreFilterVisible') === 'true'; // Lire l'état depuis localStorage // Créez un div contenant la flèche pour afficher/masquer preFilter var toggleDiv = $("<div id=\"togglePreFilter\" style=\"cursor: pointer; font-size: 10px; color: black;\">▼ Ouvrir les Filtres</div>"); // Ajoutez le div avant prediv toggleDiv.insertBefore(prediv); // Fonction pour mettre à jour l'état et le texte du div function updateToggleDiv() { if (isPreFilterVisible) { prediv.show(); // Afficher preFilter toggleDiv.html('▼ Masquer les filtres'); // Affiche la flèche vers le bas (▼) } else { prediv.hide(); // Masquer preFilter toggleDiv.html('► Ouvrir les filtres'); // Affiche la flèche de droite (→) } } // Définissez un gestionnaire d'événements pour le div toggleDiv.on('click', function() { isPreFilterVisible = !isPreFilterVisible; // Inverse l'état updateToggleDiv(); // Sauvegarde l'état dans localStorage localStorage.setItem('isPreFilterVisible', isPreFilterVisible); }); // Assurez-vous que preFilter est initialement visible updateToggleDiv(); //======================================================================= // Construction de la liste étendue des lieux sur la base d'une API externe //======================================================================= function buildExtendedLieux() { var reflieux = new Array(); $("#TLIEUX > table > tbody > tr").each( function(){ reflieux.push($(this).find('td').eq(1).text()); }); var url = "https://gobzilla.incaworld.fr/lieux/"+_X+"/"+_Y+"/"+_N; $.getJSON( url, function( data ) { // alert(JSON.stringify(data)); $.each( data, function( key, val ) { if (( reflieux.indexOf(val["id"]) == -1 ) && (val["id"] !== -1)) { var row = "<tr bgcolor=\"#E0E0E0\" class=\"extendedLieu\"><td>" + val["distance"] ; row += "</td><td>" + val["id"] ; row += "</td><td>" + val["nom"] ; row += "</td><td>" + val["type"] ; row += "</td><td>" + val["x"] ; row += "</td><td>" + val["y"] ; row += "</td><td>" + val["z"] ; row += "</td></tr>"; $(row).insertAfter("#TLIEUX table tr:last"); } }); }); extendedLieuxBuilt = true; } //======================================================================= // Construction de la liste étendue des plantes sur la base d'une API externe //======================================================================= var text = $("ul:contains('Ma vue peut porter')").text(); var matches = text.match(/Ma vue peut porter à (\d+) cases horizontalement et (\d+) verticalement/); if (matches) { var perh = matches[1]; // PER max (X Y) var perv = matches[2]; // PER max (N) var herbomax = perh * 1.5; var herbomin = +perh +1; // Récupérez la liste déroulante var lvlherbo = $('#lvlherbo'); // Ajoutez un gestionnaire d'événements pour écouter les changements de la liste déroulante lvlherbo.on('change', function() { var xfactor = parseFloat(lvlherbo.val()); // Obtenez la valeur sélectionnée en tant que nombre var herbomax = perh * xfactor; var herbomin = +perh + 1; window.localStorage.setItem('xfactor', xfactor); window.localStorage.setItem('herbomax', herbomax); console.log("Nouvelle valeur de herbomax : " + herbomax); console.log("Nouvelle valeur de herbomin : " + herbomin); }); // 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 var storedXFactor = window.localStorage.getItem('xfactor'); var storedHerboMax = window.localStorage.getItem('herbomax'); if (storedXFactor) { lvlherbo.val(storedXFactor); // Mettez à jour la liste déroulante avec la valeur précédemment enregistrée } if (storedHerboMax) { // Utilisez la valeur précédemment enregistrée pour herbomax herbomax = parseFloat(storedHerboMax); console.log("Utilisation de la valeur précédemment enregistrée pour herbomax : " + herbomax); } console.log("portée herboriser: " + herbomax); console.log("limite mini d'herboriser: " + herbomin); } else { console.log("Aucune correspondance trouvée."); } function buildExtendedPlantes() { var refplantes = new Array(); $("#TPLANTS> table > tbody > tr").each(function() { refplantes.push($(this).find('td').eq(1).text()); }); var url = "https://gobzilla.incaworld.fr/plantes"; $.ajaxSetup({ async: false }); $.getJSON(url, function(data) { // alert(JSON.stringify(data)); $.each(data, function(key, val) { var dist = Math.max( Math.abs(val["x"] - _X), Math.abs(val["y"] - _Y), Math.abs(val["z"] - _N) ); if (refplantes.indexOf(val["ID"]) == -1 && val["ID"] !== -1) { var bgColor = dist >= herbomin && dist <= herbomax ? 'background-color: #93d278;' : 'background-color: #E0E0E0;'; var row = "<tr style='" + bgColor + "' class='extendedPlante'><td>" + dist; row += "</td><td>" + val["id"]; row += "</td><td>" + val["nom"] + " (" + val["espece"] + ")"; row += "</td><td>" + val["x"]; row += "</td><td>" + val["y"]; row += "</td><td>" + val["z"]; row += "</td></tr>"; $(row).insertAfter("#TPLANTS table tr:last"); } }); }); $.ajaxSetup({ async: true }); extendedPlantesBuilt = true; } //===================================================================================================== // Fonction pour récupérer la vue de deathmétal depuis les scripts publics http://ie.gobland.fr //===================================================================================================== function fetchCSV(url) { return fetch(url) .then(response => response.text()) .then(csvData => parseCSV(csvData)); } // Fonction pour convertir les données CSV en tableau function parseCSV(csvData) { // Convertir les données CSV en tableau const rows = csvData.split('\n').slice(1); // Ignorer la première ligne d'en-têtes const table = rows.map(row => row.split(',')); // Créer le tableau HTML avec les en-têtes spécifiés const tableElement = document.createElement('table'); const headerRow = document.createElement('tr'); // En-têtes spécifiés const headers = ['Catégorie' , 'Dist.', 'Id', 'Nom', 'Niveau', 'Type' , 'Clan', 'X', 'Y', 'N', 'Z']; // Ajouter les en-têtes au tableau headers.forEach(headerText => { const th = document.createElement('th'); th.textContent = headerText; headerRow.appendChild(th); }); // Ajouter la ligne d'en-tête au tableau tableElement.appendChild(headerRow); // Ajouter les données CSV au tableau table.forEach(row => { const tr = document.createElement('tr'); row.forEach(cell => { const td = document.createElement('td'); // Nettoyer les guillemets autour des mots const cleanedCell = cell.replace(/"/g, ''); td.textContent = cleanedCell; tr.appendChild(td); }); tableElement.appendChild(tr); }); // Trouver l'élément cible pour insérer le tableau const targetElement = document.evaluate( "/html/body/div[3]/div/table/tbody/tr[2]/td[2]/center[3]/table/tbody", document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null ).singleNodeValue; // Modifier le texte de l'élément cible if (targetElement) { targetElement.textContent = "Vue Death"; targetElement.style.fontSize = '24px'; // Larger font size targetElement.style.fontWeight = 'bold'; // Bold style targetElement.setAttribute("onclick", "javascript:retract('VUEDEATH');return false;"); } else { console.error('Élément cible non trouvé.'); } // Insérer le tableau en dessous de l'élément cible if (targetElement) { targetElement.parentNode.parentNode.appendChild(tableElement); } else { console.error('Élément cible non trouvé.'); } } // Fonction pour activer ou désactiver fetchCSV en fonction de l'état de la case à cocher function toggleFetchCSV() { const tableElement = document.querySelector('#TPLANTS'); if ($('#ckbFetchCSV').is(":checked")) { fetchCSV(csvURL); // Afficher le tableau s'il existe if (tableElement) { tableElement.style.display = 'block'; } } else { // Actions à effectuer lors de la désactivation de la récupération des données CSV // Cacher le tableau s'il existe et arrêter la récupération if (tableElement) { tableElement.style.display = 'none'; } // Ajoutez ici d'autres actions pour arrêter la récupération des données CSV si nécessaire } } // Récupération de la case à cocher par son ID const ckbFetchCSV = document.getElementById('ckbFetchCSV'); // Écouteur d'événement pour détecter le changement d'état de la case à cocher ckbFetchCSV.addEventListener('change', toggleFetchCSV); // Appeler toggleFetchCSV au chargement de la page pour initialiser le comportement toggleFetchCSV(); // URL du CSV à récupérer const csvURL = 'http://ie.gobland.fr/IE_Vue.php?id=330&passwd=30fae3bb4bf976a5cd29628102d42fd2&sep=,'; // Appeler la fonction fetchCSV avec l'URL //fetchCSV(csvURL); //======================================================================= // VUE 2D. Piqué à Stéphane Beauquis (Extention Chrome) // Grab the data for Vue2D //======================================================================= var _terre="", _PX=0, _PY=0; // Get the name and num of the actual goblin var nom = $('#identite').attr("nom"); var num = $('#identite').attr("num"); // Get the actual position and view size $('li').each(function(){ // cache jquery var var current = $(this); var matches = current.text().match(/Ma position actuelle est : X = ([\-0-9]+), Y = ([\-0-9]+), N = ([\-0-9]+)([^\-]+)/); if (matches) { _X = parseInt(matches[1]); _Y = parseInt(matches[2]); _N = parseInt(matches[3]); niveau = _N; _terre = matches[4]; } matches = current.text().match(/L'affichage est limité à (\d+) cases horizontalement et (\d+) verticalement/); if (matches) { _PX = (parseInt(matches[1])>50)?50:parseInt(matches[1]); _PY = (parseInt(matches[2])>20)?20:parseInt(matches[2]); } }); if (displayFullWidth == 1) { var width = 1800, height = 1800, leftgutter = 20, bottomgutter = 30, coordOffset = 1790; var tailleTxt = "16px sans-serif"; $("#content").css("width" , "2000px"); $("html > body > div").css("left" , "1800x"); } else { var width = 630, height = 650, leftgutter = 30, bottomgutter = 20, coordOffset = 1190; var tailleTxt = "12px sans-serif"; } var offset = 40, nbCase = _PX * 2 + 1, carre = Math.floor((width-offset-5) / nbCase), txt = {"font": '10px Fontin-Sans, Arial', stroke: "none", fill: "#000"}; var alllieux = {}; // Compute grid limits var xmin = _X - _PX, ymin = _Y - _PX, ymax = _Y + _PX, Dx = xmin * -1, Dy = ymin * -1; // Initialisation de tooltipOpen comme un objet var tooltipOpen = {}; // Fonction pour attacher les gestionnaires d'événements des tooltips function attachTooltipEvents(st, key) { if (st[0]) { st[0].style.cursor = "pointer"; var isClicked = false; // Gestion du clic st[0].onclick = function (e) { e.stopPropagation(); // Évite la propagation de l'événement aux parents if (tooltipOpen[key]) { closeTooltip(key); } else { openTooltip(key); isClicked = true; } }; // Gestion du double-clic st[0].ondblclick = function (e) { e.stopPropagation(); if (isClicked) { closeTooltip(key); isClicked = false; } }; // Gestion du survol st[0].onmouseover = function () { if (!tooltipOpen[key] && !isClicked) { closeTooltips(); // Fermer toutes les tooltips ouvertes openTooltip(key); } }; st[0].onmouseout = function (e) { var target = e.relatedTarget || e.toElement; if (!isClicked && (!target || target !== st[0])) { closeTooltip(key); } }; // Gestion du clic droit st[0].oncontextmenu = function (e) { e.preventDefault(); // Empêche l'ouverture du menu contextuel par défaut // Copie du contenu de la tooltip dans le presse-papiers if (tooltipOpen[key]) { var tooltipContent = compute_text(key); // Méthode alternative pour copier le texte var tempInput = document.createElement('textarea'); tempInput.style.position = 'absolute'; tempInput.style.left = '-9999px'; tempInput.value = tooltipContent; document.body.appendChild(tempInput); tempInput.select(); try { var successful = document.execCommand('copy'); var msg = successful ? 'copié dans le presse-papiers' : 'Échec de la copie du contenu de la tooltip'; alert(msg); } catch (err) { console.error('Erreur lors de la copie du texte : ', err); } document.body.removeChild(tempInput); } else { alert('Aucune tooltip ouverte pour copier le contenu'); } }; } } function initializeTooltips() { for (var key in alllieux) { (function (st, key) { attachTooltipEvents(st, key); })(alllieux[key], key); } } function openTooltip(key) { if (key in alllieux && key in cells) { // Vérification importante var st = alllieux[key]; if (st && st[0]) { var x = cells[key].x; var y = cells[key].y; var tic = ""; tic += (y >= (Math.floor(nbCase / 2)) * carre) ? "bottom" : "top"; tic += (x > (Math.floor(nbCase / 2)) * carre) ? "left" : "right"; var s = compute_text(key); draw_tooltip(st[0], 1, s, x, y, carre, tic); tooltipOpen[key] = true; // Utilisez tooltipOpen si nécessaire } } } function closeTooltip(key) { var st = alllieux[key]; if (st[0] && tooltipOpen[key]) { draw_tooltip(st[0], 0); tooltipOpen[key] = false; } } function closeTooltips() { for (var k in tooltipOpen) { if (tooltipOpen[k]) { closeTooltip(k); } } } // Gestion des changements de filtre $("input.ckbFilter").change(function () { showVueFullWidth(); showHideMiniMobs(); showHideTrees(); showHideVue2d(); showHideExtendedLieux(); showHideExtendedPlantes(); showHideCdmNeeded(); showHideCuisine(); var showBigMonsters = $('input[name=ckbBigMonsters]').is(':checked'); for (var key in cells) { var x = cells[key].x; var y = cells[key].y; var mapping = "i" + getMapping(key, showBigMonsters) + ".src"; if (alllieux[key]) { alllieux[key].remove(); // Supprimer de cells si la cellule est vide après filtrage var mapping = getMapping(key, showBigMonsters); // Recalculer mapping après suppression if (mapping === "0000") { // Adaptez "0000" si nécessaire delete cells[key]; } } if (mapping in images) { // Vérifier si l'image existe alllieux[key] = R.image(images[mapping], x, y, carre - 1, carre - 1); // Attacher les gestionnaires d'événements pour les tooltips (function (st, key) { st[0].onload = function () { attachTooltipEvents(st, key); }; })(alllieux[key], key); } } }); // Appeler initializeTooltips lors du chargement initial de la page $(document).ready(function() { initializeTooltips(); }); // Images //ancienne adresse $("<img src=\"http://images.gobland.fr/addons/GGVue2D/0001.jpg\" id=\"i0001\" style=\"display:none;\" />").insertBefore(div); $("<img src=\"https://i.ibb.co/Dz9gDV3/0001.png\" id=\"i0001\" style=\"display:none;\" />").insertBefore(div); $("<img src=\"https://i.ibb.co/8P46Rjy/0010.png\" id=\"i0010\" style=\"display:none;\" />").insertBefore(div); $("<img src=\"https://i.ibb.co/QcGCGDb/0011.png\" id=\"i0011\" style=\"display:none;\" />").insertBefore(div); $("<img src=\"https://i.ibb.co/KwzFZvN/0100.png\" id=\"i0100\" style=\"display:none;\" />").insertBefore(div); $("<img src=\"https://i.ibb.co/XZjcdh7/0101.png\" id=\"i0101\" style=\"display:none;\" />").insertBefore(div); $("<img src=\"https://i.ibb.co/S56vt5R/0110.png\" id=\"i0110\" style=\"display:none;\" />").insertBefore(div); $("<img src=\"https://i.ibb.co/s1Jtrnk/0111.png\" id=\"i0111\" style=\"display:none;\" />").insertBefore(div); $("<img src=\"https://i.ibb.co/N3WcT1f/1000.png\" id=\"i1000\" style=\"display:none;\" />").insertBefore(div); $("<img src=\"https://i.ibb.co/PNvwHwZ/1001.png\" id=\"i1001\" style=\"display:none;\" />").insertBefore(div); $("<img src=\"https://i.ibb.co/vwcwq8y/1010.png\" id=\"i1010\" style=\"display:none;\" />").insertBefore(div); $("<img src=\"https://i.ibb.co/n6L9kYJ/1011.png\" id=\"i1011\" style=\"display:none;\" />").insertBefore(div); $("<img src=\"https://i.ibb.co/yFrybj2/1100.png\" id=\"i1100\" style=\"display:none;\" />").insertBefore(div); $("<img src=\"https://i.ibb.co/44QQsYw/1101.png\" id=\"i1101\" style=\"display:none;\" />").insertBefore(div); $("<img src=\"https://i.ibb.co/58Y158g/1110.png\" id=\"i1110\" style=\"display:none;\" />").insertBefore(div); $("<img src=\"https://i.ibb.co/wzsbGdL/1111.png\" id=\"i1111\" style=\"display:none;\" />").insertBefore(div); $("<img src=\"https://i.ibb.co/hRDDnZM/1200.png\" id=\"i1200\" style=\"display:none;\" />").insertBefore(div); $("<img src=\"https://i.ibb.co/gdm3cNW/1201.png\" id=\"i1201\" style=\"display:none;\" />").insertBefore(div); $("<img src=\"https://i.ibb.co/zrwHfBK/1210.png\" id=\"i1210\" style=\"display:none;\" />").insertBefore(div); $("<img src=\"https://i.ibb.co/fC7GWvd/1211.png\" id=\"i1211\" style=\"display:none;\" />").insertBefore(div); $("<img src=\"https://i.ibb.co/LxnJvjS/0200.png\" id=\"i0200\" style=\"display:none;\" />").insertBefore(div); $("<img src=\"https://i.ibb.co/WWDrSHy/0201.png\" id=\"i0201\" style=\"display:none;\" />").insertBefore(div); $("<img src=\"https://i.ibb.co/T4FnVMk/0210.png\" id=\"i0210\" style=\"display:none;\" />").insertBefore(div); $("<img src=\"https://i.ibb.co/wgHgjjC/0211.png\" id=\"i0211\" style=\"display:none;\" />").insertBefore(div); $("<img src=\"https://i.ibb.co/9ZKxpfP/1300.png\" id=\"i1300\" style=\"display:none;\" />").insertBefore(div); $("<img src=\"https://i.ibb.co/C6KwVnJ/1301.png\" id=\"i1301\" style=\"display:none;\" />").insertBefore(div); $("<img src=\"https://i.ibb.co/NFZVP34/1310.png\" id=\"i1310\" style=\"display:none;\" />").insertBefore(div); $("<img src=\"https://i.ibb.co/Sd2KRDg/0300.png\" id=\"i0300\" style=\"display:none;\" />").insertBefore(div); $("<img src=\"https://i.ibb.co/yhmsDKs/0301.png\" id=\"i0301\" style=\"display:none;\" />").insertBefore(div); $("<img src=\"https://i.ibb.co/r5P0BPV/0310.png\" id=\"i0310\" style=\"display:none;\" />").insertBefore(div); $("<img src=\"https://i.ibb.co/3Wnk7zT/0311.png\" id=\"i0311\" style=\"display:none;\" />").insertBefore(div); $("<img src=\"https://i.ibb.co/61rWLLL/0400.png\" id=\"i0400\" style=\"display:none;\" />").insertBefore(div); $("<img src=\"https://i.ibb.co/vxCmWFw/0401.png\" id=\"i0401\" style=\"display:none;\" />").insertBefore(div); $("<img src=\"https://i.ibb.co/tczccQC/0410.png\" id=\"i0410\" style=\"display:none;\" />").insertBefore(div); $("<img src=\"https://i.ibb.co/mGq9y8f/0411.png\" id=\"i0411\" style=\"display:none;\" />").insertBefore(div); $("<img src=\"https://i.ibb.co/FnxBk2g/1410.png\" id=\"i1410\" style=\"display:none;\" />").insertBefore(div); $("<img src=\"https://i.ibb.co/ZXZQxht/1411.png\" id=\"i1411\" style=\"display:none;\" />").insertBefore(div); $("<img src=\"https://i.ibb.co/kSrPcdd/1401.png\" id=\"i1401\" style=\"display:none;\" />").insertBefore(div); $("<img src=\"https://i.ibb.co/T8y0bM2/1400.png\" id=\"i1400\" style=\"display:none;\" />").insertBefore(div); $("<img src=\"https://i.ibb.co/FnxBk2g/1410.png\" id=\"i1410\" style=\"display:none;\" />").insertBefore(div); $("<img src=\"https://i.ibb.co/tJ8jHpq/0500.png\" id=\"i0500\" style=\"display:none;\" />").insertBefore(div); $("<img src=\"https://i.ibb.co/WFWVSF5/0501.png\" id=\"i0501\" style=\"display:none;\" />").insertBefore(div); $("<img src=\"https://i.ibb.co/JtSNYrd/0510.png\" id=\"i0510\" style=\"display:none;\" />").insertBefore(div); $("<img src=\"https://i.ibb.co/gdKT4Ph/0511.png\" id=\"i0511\" style=\"display:none;\" />").insertBefore(div); $("<img src=\"https://i.ibb.co/FX99SN7/1500.png\" id=\"i1500\" style=\"display:none;\" />").insertBefore(div); $("<img src=\"https://i.ibb.co/KWSLbzc/1501.png\" id=\"i1501\" style=\"display:none;\" />").insertBefore(div); $("<img src=\"https://i.ibb.co/9212GsW/1510.png\" id=\"i1510\" style=\"display:none;\" />").insertBefore(div); $("<img src=\"https://i.ibb.co/qx85SyM/1511.png\" id=\"i1511\" style=\"display:none;\" />").insertBefore(div); $("<img src=\"https://i.ibb.co/0qyL5mX/0600.png\" id=\"i0600\" style=\"display:none;\" />").insertBefore(div); $("<img src=\"https://i.ibb.co/f9gzMtm/0601.png\" id=\"i0601\" style=\"display:none;\" />").insertBefore(div); $("<img src=\"https://i.ibb.co/FYjyxXh/0610.png\" id=\"i0610\" style=\"display:none;\" />").insertBefore(div); $("<img src=\"https://i.ibb.co/jv47Q2W/0611.png\" id=\"i0611\" style=\"display:none;\" />").insertBefore(div); $("<img src=\"https://i.ibb.co/R7Dwjxy/1600.png\" id=\"i1600\" style=\"display:none;\" />").insertBefore(div); $("<img src=\"https://i.ibb.co/Dpksj9V/1601.png\" id=\"i1601\" style=\"display:none;\" />").insertBefore(div); $("<img src=\"https://i.ibb.co/mhcfSqt/1610.png\" id=\"i1610\" style=\"display:none;\" />").insertBefore(div); $("<img src=\"https://i.ibb.co/d0rb5QW/1611.png\" id=\"i1611\" style=\"display:none;\" />").insertBefore(div); $("<img src=\"https://i.ibb.co/SXbmrNws/1701.png\" id=\"i1701\" style=\"display:none;\" />").insertBefore(div); $("<img src=\"https://i.ibb.co/5XtTZS5V/0710.png\" id=\"i1710\" style=\"display:none;\" />").insertBefore(div); $("<img src=\"https://i.ibb.co/N6c76tnC/1711.png\" id=\"i1711\" style=\"display:none;\" />").insertBefore(div); $("<img src=\"https://i.ibb.co/GQ0BvM0g/0700.png\" id=\"i0700\" style=\"display:none;\" />").insertBefore(div); $("<img src=\"https://i.ibb.co/5g3Xr5Q8/0701.png\" id=\"i0701\" style=\"display:none;\" />").insertBefore(div); $("<img src=\"https://i.ibb.co/kspdj1kv/0711.png\" id=\"i0711\" style=\"display:none;\" />").insertBefore(div); $("<img src=\"https://i.ibb.co/4Zn39Jq5/1700.png\" id=\"i1700\" style=\"display:none;\" />").insertBefore(div); $("<img src=\"https://i.ibb.co/5XtTZS5V/0710.png\" id=\"i0710\" style=\"display:none;\" />").insertBefore(div); var images = { "0001": i0001.src, "0010": i0010.src, "0011": i0011.src, "0100": i0100.src, "0101": i0101.src, "0110": i0110.src, "0111": i0111.src, "1000": i1000.src, "1001": i1001.src, "1010": i1010.src, "1011": i1011.src, "1100": i1100.src, "1101": i1101.src, "1110": i1110.src, "1111": i1111.src, "1200": i1200.src, "1201": i1201.src, "1210": i1210.src, "1211": i1211.src, "0200": i0200.src, "0201": i0201.src, "0210": i0210.src, "0211": i0211.src, "1300": i1300.src, "1301": i1301.src, "1310": i1310.src, "0300": i0300.src, "0301": i0301.src, "0310": i0310.src, "0311": i0311.src, "0400": i0400.src, "0401": i0401.src, "0410": i0410.src, "0411": i0411.src, "1400": i1400.src, "1401": i1401.src, "1410": i1410.src, "1411": i1411.src, "0500": i0500.src, "0501": i0501.src, "0510": i0510.src, "0511": i0511.src, "1500": i1500.src, "1501": i1501.src, "1510": i1510.src, "1511": i1511.src, "0600": i0600.src, "0601": i0601.src, "0610": i0610.src, "0611": i0611.src, "1600": i1600.src, "1601": i1601.src, "1610": i1610.src, "1611": i1611.src, "1700": i1700.src, "1701": i1701.src, "1710": i1710.src, "1711": i1711.src, "0700": i0700.src, "0701": i0701.src, "0710": i0701.src, "0711": i0711.src }; //initialisation de la vue2d //============================================================= // D r a w //============================================================= function build2DView() { Raphael.fn.drawGrid = function (x, y, w, h, wv, hv, color) { color = color || "#000"; 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], rowHeight = h / hv, columnWidth = w / wv; for (var i = 1; i < hv; i++) { path = path.concat(["M", Math.round(x) + .5, Math.round(y + i * rowHeight) + .5, "H", Math.round(x + w) + .5]); } for (i = 1; i < wv; i++) { path = path.concat(["M", Math.round(x + i * columnWidth) + .5, Math.round(y) + .5, "V", Math.round(y + h) + .5]); } return this.path(path.join(",")).attr({stroke: color}); }; R = Raphael("vue2D", width, height); // Draw the grid R.drawGrid(offset, offset, nbCase*carre, nbCase*carre, nbCase, nbCase, "#000"); // Draw legend for X-axis and Y-axis for( var i = 0 ; i < nbCase ; i++ ) { // X coordinates top/bottom R.text( Math.round(offset+(i+.5)*carre), 10, (xmin+i).toString() ).attr(txt); R.text( Math.round(offset+(i+.5)*carre), coordOffset, (xmin+i).toString() ).attr(txt); // Y coordinates R.text( 10, Math.round(offset+(i+.5)*carre), (ymax-i).toString() ).attr(txt); } // Add to the list the current Goblin x = _PX * carre + offset + 1; y = _PX * carre + offset + 1; var key = (x + Dx) + Math.abs(y + Dy) * nbCase + 1; cells[key] = { x: x, y: y, realx: _X, realy: _Y }; cells[key][_N] = { gob: [nom + " (" + num + ")\n"], monster: [], violetMonster: [], redMonster: [], orangeMonster: [], yellowMonster: [], place: [], object: [], plant: [], mechanicalCreature: [] }; var creatures = $('#TCREATURES').find("table"); $("tbody tr", creatures).each(function (index, tr) { var lines = $('td', tr).map(function (index, td) { return $(td).text(); }); if (typeof lines[0] != "undefined") { x = (_PX + parseInt(lines[6]) - _X) * carre + offset + 1; y = (_PX - parseInt(lines[7]) + _Y) * carre + offset + 1; var key = (x + Dx) + Math.abs(y + Dy) * nbCase + 1; var lvl = lines[8].toString(); if (!(key in cells)) { cells[key] = { x: x, y: y, realx: lines[6], realy: lines[7] }; cells[key][lvl] = { gob: [], monster: [], violetMonster: [], redMonster: [], orangeMonster: [], yellowMonster: [], place: [], object: [], plant: [], mechanicalCreature: [] }; } if (!(lvl in cells[key])) { cells[key][lvl] = { gob: [], monster: [], violetMonster: [], redMonster: [], orangeMonster: [], yellowMonster: [], place: [], object: [], plant: [], mechanicalCreature: [] }; } if (lines[4] === "Mentalo" || lines[4] === "Nodef" || lines[4] === "Musculeux" || lines[4] === "Vis Yonnair" || lines[4] === "Trad Scion" || lines[4] === "Zozo Giste") { cells[key][lvl]["gob"].push(lines[2] + ' - ' + lines[3]); } else if (lines[4] === "Créature mécanique" || lines[4] === "Squelette" || lines[4] === "Pierreux" || lines[4] === "Esprit-rôdeur" || lines[4] === "Pierreux") { console.log("suivant found!", lines[2]); cells[key][lvl]["mechanicalCreature"].push(lines[2] + ' - ' + lines[3]); } else if (parseInt(lines[3]) >= 50) { cells[key][lvl]["violetMonster"].push(lines[2] + ' - ' + lines[3]); } else if (parseInt(lines[3]) >= 40) { cells[key][lvl]["redMonster"].push(lines[2] + ' - ' + lines[3]); } else if (parseInt(lines[3]) >= 30) { cells[key][lvl]["orangeMonster"].push(lines[2] + ' - ' + lines[3]); } else if (parseInt(lines[3]) >= 25) { cells[key][lvl]["yellowMonster"].push(lines[2] + ' - ' + lines[3]); } else { cells[key][lvl]["monster"].push(lines[2] + ' - ' + lines[3]); } } }); var lieux = $('#TLIEUX').find("table"); $("tbody tr", lieux).each(function (index, tr) { var lines = $('td', tr).map(function (index, td) { return $(td).text(); }); if (typeof lines[0] != "undefined") { x = (_PX + parseInt(lines[4]) - _X) * carre + offset + 1; y = (_PX - parseInt(lines[5]) + _Y) * carre + offset + 1; var key = (x + Dx) + Math.abs(y + Dy) * nbCase + 1; var lvl = lines[6].toString(); if (!(key in cells)) { cells[key] = { x: x, y: y, realx: lines[4], realy: lines[5] }; cells[key][lvl] = { gob: [], monster: [], violetMonster: [], redMonster: [], orangeMonster: [], yellowMonster: [], place: [], object: [], plant: [], mechanicalCreature: [] }; } if (!(lvl in cells[key])) { cells[key][lvl] = { gob: [], monster: [], violetMonster: [], redMonster: [], orangeMonster: [], yellowMonster: [], place: [], object: [], plant: [], mechanicalCreature: [] }; } cells[key][lvl]["place"].push(lines[2]); } }); var tresors = $('#TOBJETS').find("table"); $("tbody tr", tresors).each(function (index, tr) { var lines = $('td', tr).map(function (index, td) { return $(td).text(); }); if (typeof lines[0] != "undefined") { x = (_PX + parseInt(lines[3]) - _X) * carre + offset + 1; y = (_PX - parseInt(lines[4]) + _Y) * carre + offset + 1; var key = (x + Dx) + Math.abs(y + Dy) * nbCase + 1; var lvl = lines[5].toString(); if (!(key in cells)) { cells[key] = { x: x, y: y, realx: lines[3], realy: lines[4] }; cells[key][lvl] = { gob: [], monster: [], violetMonster: [], redMonster: [], orangeMonster: [], yellowMonster: [], place: [], object: [], plant: [], mechanicalCreature: [] }; } if (!(lvl in cells[key])) { cells[key][lvl] = { gob: [], monster: [], violetMonster: [], redMonster: [], orangeMonster: [], yellowMonster: [], place: [], object: [], plant: [], mechanicalCreature: [] }; } cells[key][lvl]["object"].push(lines[2]); } }); var plantes = $('#TPLANTS').find("table"); $("tbody tr", plantes).each(function (index, tr) { var lines = $('td', tr).map(function (index, td) { return $(td).text(); }); if (typeof lines[0] != "undefined") { x = (_PX + parseInt(lines[3]) - _X) * carre + offset + 1; y = (_PX - parseInt(lines[4]) + _Y) * carre + offset + 1; var key = (x + Dx) + Math.abs(y + Dy) * nbCase + 1; var lvl = lines[5].toString(); if (!(key in cells)) { cells[key] = { x: x, y: y, realx: lines[3], realy: lines[4] }; cells[key][lvl] = { gob: [], monster: [], violetMonster: [], redMonster: [], orangeMonster: [], yellowMonster: [], place: [], object: [], plant: [], mechanicalCreature: [] }; } if (!(lvl in cells[key])) { cells[key][lvl] = { gob: [], monster: [], violetMonster: [], redMonster: [], orangeMonster: [], yellowMonster: [], place: [], object: [], plant: [], mechanicalCreature: [] }; } cells[key][lvl]["plant"].push(lines[2]); } }); alllieux = {}; for (var key in cells) { x = cells[key].x; y = cells[key].y; mapping = getMapping(key); if (mapping in images) { alllieux[key] = R.image(images[mapping], x, y, carre - 1, carre - 1); (function (st, key) { attachTooltipEvents(st, key); })(alllieux[key], key); } else { console.error("Image not found for mapping:", mapping); } } vue2DBuilt = true; } //getmapping function getMapping(k, showBigMonsters) { var result = ""; var cptGob = 0, cptMob = 0, cptPlace = 0, cptObj = 0, cptVioletMobs = 0, cptRedMobs = 0, cptorandedMobs = 0, cptyellowedMobs = 0, cptplants = 0, cptMech = 0; if ($('input[name=ckbNiveau]').is(':checked')) { if (niveau in cells[k]) { cptGob += cells[k][niveau]["gob"].length; cptMob += cells[k][niveau]["monster"].length; cptRedMobs += cells[k][niveau]["redMonster"].length; cptVioletMobs += cells[k][niveau]["violetMonster"].length; cptPlace += cells[k][niveau]["place"].length; cptObj += cells[k][niveau]["object"].length; cptplants += cells[k][niveau]["plant"].length; cptorandedMobs += cells[k][niveau]["orangeMonster"].length; cptyellowedMobs += cells[k][niveau]["yellowMonster"].length; cptMech += cells[k][niveau]["mechanicalCreature"].length; // Créatures mécaniques } } else { for (var lvl in cells[k]) { if ((lvl != "x") && (lvl != "y") && (lvl != "realx") && (lvl != "realy")) { cptGob += cells[k][lvl]["gob"].length; cptMob += cells[k][lvl]["monster"].length; cptRedMobs += cells[k][lvl]["redMonster"].length; cptVioletMobs += cells[k][lvl]["violetMonster"].length; cptPlace += cells[k][lvl]["place"].length; cptObj += cells[k][lvl]["object"].length; cptplants += cells[k][lvl]["plant"].length; cptorandedMobs += cells[k][lvl]["orangeMonster"].length; cptyellowedMobs += cells[k][lvl]["yellowMonster"].length; cptMech += cells[k][lvl]["mechanicalCreature"].length; // Créatures mécaniques } } } result += (cptGob > 0) ? "1" : "0"; // Priorité aux créatures mécaniques if ((cptMech > 0) && ($('input[name=ckbMonster]').is(':checked'))) { result += "7"; } else if ((cptplants > 0) && ($('input[name=ckbplants]').is(':checked'))) { result += "3"; } else if (showBigMonsters && $('input[name=ckbMonster]').is(':checked')) { // Simplifié pour gros monstres result += (cptRedMobs > 0) ? "2" : ((cptVioletMobs > 0) ? "6" : "0"); } else if ((cptRedMobs > 0) && ($('input[name=ckbMonster]').is(':checked'))) { result += "2"; } else if ((cptVioletMobs > 0) && ($('input[name=ckbMonster]').is(':checked'))) { result += "6"; } else if ((cptorandedMobs > 0) && ($('input[name=ckbMonster]').is(':checked'))) { result += "4"; } else if ((cptyellowedMobs > 0) && ($('input[name=ckbMonster]').is(':checked'))) { result += "5"; } else if ((cptMob > 0) && ($('input[name=ckbMonster]').is(':checked'))) { result += "1"; } else { result += "0"; } result += (($('input[name=ckbObject]').is(':checked')) && (cptObj > 0)) ? "1" : "0"; result += (($('input[name=ckbPlace]').is(':checked')) && (cptPlace > 0)) ? "1" : "0"; return result; } //======================================================================================= // Compute the global text that must be display in the popup. //======================================================================================= function compute_text(k) { var result = "X=" + cells[k].realx + ", Y=" + cells[k].realy + "\n"; var n = []; if ($('input[name=ckbNiveau]').is(':checked')) { if (niveau in cells[k]) { n.push(niveau); } } else { for (var lvl in cells[k]) { if ((lvl != "x") && (lvl != "y") && (lvl != "realx") && (lvl != "realy")) { n.push(lvl); } } } var data = ""; for (var i = 0; i < n.length; i++) { var k2 = n[i]; if (k2 in cells[k]) { // <-- Vérification importante data += getString(cells[k][k2]["gob"]); data += getString(cells[k][k2]["monster"], true); data += getString(cells[k][k2]["violetMonster"], true); data += getString(cells[k][k2]["redMonster"], true); data += getString(cells[k][k2]["orangeMonster"], true); data += getString(cells[k][k2]["yellowMonster"], true); data += getString(cells[k][k2]["place"]); data += getString(cells[k][k2]["plant"]); data += getString(cells[k][k2]["mechanicalCreature"]); // <-- mechanicalCreature ici if ($('input[name=ckbObject]').is(':checked')) { data += getString(cells[k][k2]["object"], true); } if (data != "") { result += " \nNiveau: " + k2 + "\n" + data; data = ""; } } // Fin de la condition if (k2 in cells[k]) } return result; } function getString(arr, pre) { if (typeof arr === 'undefined' || !arr ) return ""; var res = ""; if (arr.length > 0) { for (var j=0;j<arr.length;j++) { res += ((pre)?" - ":"") + arr[j] + "\n"; } } return res; } //======================================================================================= // Process the data array and generate the string to display in the popup // If compressed = true, the number of items are counted to be displayed as N x items //======================================================================================= function getString(data,compressed) { if(typeof(compressed)==='undefined') compressed = false; var result = ""; if (compressed) { var tmp = {}; for( var i=0; i < data.length; i++ ) { n = data[i]; if (!(n in tmp)) { tmp[n] = 0; } tmp[n] = tmp[n] + 1; } for( var k in tmp ) { result += "\t" + tmp[k] + " x " + k + "\n"; } } else { for( var i=0; i < data.length; i++ ) { result += "\t" + data[i] + "\n"; } } return result; } function draw_tooltip(object, show, text, x, y, carre, from) { if(show == 0) { popup.remove(); popup_txt.remove(); transparent_txt.remove(); return; } // Center X on middle of the cell. x += Math.floor(carre/2); //draw text somewhere to get its dimensions and make it transparent transparent_txt = R.text(10,10, text).attr({fill: "transparent",font: tailleTxt}); //get text dimensions to obtain tooltip dimensions var txt_box = transparent_txt.getBBox(); if (from=="topright") { // Move to bottom of the cell y += carre; // Compute position Xtext = x+5; Ytext = y+Math.floor(txt_box.height/2)+5; //draw text popup_txt = R.text(Xtext, Ytext, text).attr({fill: "black",font: tailleTxt,'text-anchor': 'start'}); var bb = popup_txt.getBBox(); // Compute path for tooltip box pathText = // 'M'ove to the 'dent' in the bubble "M" + (x) + " " + (y) + // 'v'ertically draw a line 5 pixels more than the height of the text "v" + (bb.height+5) + // 'h'orizontally draw a line 10 more than the text's width "h" + (bb.width+10) + // 'v'ertically draw a line to the bottom of the text "v" + -bb.height + // 'h'orizontally draw a line so we're 5 pixels from the left side "h" + -(bb.width+5) + // 'Z' closes the figure "Z"; } else if (from=="topleft") { // Move to bottom of the cell y += carre; // Compute position Xtext = x-(txt_box.width+5); Ytext = y+Math.floor(txt_box.height/2)+5; //draw text popup_txt = R.text(Xtext, Ytext, text).attr({fill: "black",font: tailleTxt,'text-anchor': 'start'}); var bb = popup_txt.getBBox(); // Compute path for tooltip box pathText = // 'M'ove to the 'dent' in the bubble "M" + (x) + " " + (y) + // 'v'ertically draw a line 5 pixels more than the height of the text "v" + (bb.height+5) + // 'h'orizontally draw a line 10 more than the text's width "h" + -(bb.width+10) + // 'v'ertically draw a line to the bottom of the text "v" + -bb.height + // 'h'orizontally draw a line so we're 5 pixels from the left side "h" + (bb.width+5) + // 'Z' closes the figure "Z"; } else if (from=="bottomleft") { // Compute position Xtext = x-(txt_box.width+5); Ytext = y-Math.floor(txt_box.height/2)-6; //draw text popup_txt = R.text(Xtext, Ytext, text).attr({fill: "black",font: tailleTxt,'text-anchor': 'start'}); var bb = popup_txt.getBBox(); // Compute path for tooltip box pathText = // 'M'ove to the 'dent' in the bubble "M" + (x) + " " + (y) + // 'v'ertically draw a line 5 pixels more than the height of the text "v" + -(bb.height+5) + // 'h'orizontally draw a line 10 more than the text's width "h" + -(bb.width+10) + // 'v'ertically draw a line to the bottom of the text "v" + bb.height + // 'h'orizontally draw a line so we're 5 pixels from the left side "h" + (bb.width+5) + // 'Z' closes the figure "Z"; } else // bottom right { // Compute position Xtext = x+5; Ytext = y-Math.floor(txt_box.height/2)-6; //draw text popup_txt = R.text(Xtext, Ytext, text).attr({fill: "black",font: tailleTxt,'text-anchor': 'start'}); var bb = popup_txt.getBBox(); // Compute path for tooltip box pathText = // 'M'ove to the 'dent' in the bubble "M" + (x) + " " + (y) + // 'v'ertically draw a line 5 pixels more than the height of the text "v" + -(bb.height+5) + // 'h'orizontally draw a line 10 more than the text's width "h" + (bb.width+10) + // 'v'ertically draw a line to the bottom of the text "v" + bb.height + // 'h'orizontally draw a line so we're 5 pixels from the left side "h" + -(bb.width+5) + // 'Z' closes the figure "Z"; } //draw path for tooltip box popup = R.path( pathText ).attr( {fill: "yellow"} ); //finally put the text in front popup_txt.toFront(); } }; //---------------------- ///FIN DE LA VUE 2D //---------------------- //========================================================================================================================================================================================================================== // Traitements spécifiques à la page PROFIL //========================================================================================================================================================================================================================== if ($(location).attr('href').match(/^http:\/\/(.*\.)?gobland\.fr\/ProfilPerso\.php$/i)) { var skills = {}; //fait apparaitre comp et tech et dons en couleurs dans MonProfil $('td:contains("Connaissance des Monstres")').parent().css("background-color","cefeda"); $('td:contains("Identification des Trésors")').parent().css("background-color","fec8f1"); $('td:contains("Limier")').parent().css("background-color","f9ffbc"); $('td:contains("Dur")').parent().css("background-color","f9ffbc"); //fait apparaitre "Grand Maître" en Gras dans Mon Profil $('td:contains("(Grand Maître)")').css("font-weight", "bold"); $( document ).ready(function() { displayNextLevel(); buildSkillsStats(); buildSkillsMagie(); addToolTipsTalents(); // Met en rouge le malus de concentration if (skills.CON < -1) { $('td:contains("Bonus de concentration")').css("color","red", "font-weight", "bold"); } else { $('td:contains("Bonus de concentration")').css("color","green" , "font-weight", "bold"); } }); /// INFO BULLES TALENTS (au survol de la souris sur une comp ou tech, fait le calcul si c'est possible) function addToolTipsTalents() { $('a:contains("Symphonie Intestinale")').prop('title', 'Apprenti...........ATT/ESQ/PER -' + Math.floor((skills.PV/30)) + "\n" + 'Compagnon...ATT/ESQ/PER -' + Math.floor((skills.PV/25)) + "\n" + 'Maître...............ATT/ESQ/PER -' + Math.floor((skills.PV/20)) + "\n" + 'Grand Maître..ATT/ESQ/PER -' + Math.floor((skills.PV/15))) ; $('a:contains("Afflux Sanguin")').prop('title', 'Apprenti ' + Math.floor((skills.PVMax/30) ) + 'D3' + ' (' + Math.floor((skills.PVMax/30) )*2 + ')' + "\n" + 'Compagnon ' + Math.floor((skills.PVMax/25) ) + 'D3' + ' (' + Math.floor((skills.PVMax/25) )*2 + ')' + "\n" + 'Maître ' + Math.floor((skills.PVMax/20) ) + 'D3' + ' (' + Math.floor((skills.PVMax/20) )*2 + ')' + "\n" + 'Grand Maître ' + Math.floor((skills.PVMax/15) )+ 'D3' + ' (' + Math.floor((skills.PVMax/15) )*2 + ')') ; $('a:contains("Appel des Ombres")').prop('title', 'Apprenti......' + ' MT +' + (skills.MTP/2)+ ' | ' + ' RT +0 ' + ' | ' + ' MP +0 ' + ' | ' + ' RT -' + (skills.RPP/2) + "\n" + 'Compagnon......' + ' MT +' + (skills.MTP)+ ' | ' + ' RT +0 '+ ' | ' + ' MP +0 '+ ' | ' + ' RP -' + (skills.RPP) + "\n" + 'Maître......' + ' MT +' + (skills.MTP)+ ' | ' + ' RT +' + (skills.RTP/2) + ' | ' + ' MP -' +(skills.MPP/2) + ' | ' + ' RP -' + (skills.RPP) + "\n" + 'Grand Maître......' + ' MT +' + (skills.MTP)+ ' | ' + ' RT +' + (skills.RTP)+ ' | ' + ' MP -' +(skills.MPP)+ ' | ' + ' RP -' + (skills.RPP)); $('a:contains("Appel de la Nature")').prop('title', 'Apprenti......' + ' MS +' + (skills.MSP/2)+ ' | ' + ' RS +0 ' + ' | ' + ' MC +0 ' + ' | ' + ' RC -' + (skills.RCP/2) + "\n" + 'Compagnon......' + ' MS +' + (skills.MSP)+ ' | ' + ' RS +0 '+ ' | ' + ' MC +0 '+ ' | ' + ' RC -' + (skills.RCP) + "\n" + 'Maître......' + ' MS +' + (skills.MSP)+ ' | ' + ' RS +' + (skills.RSP/2) + ' | ' + ' MC -' +(skills.MCP/2) + ' | ' + ' RC -' + (skills.RCP) + "\n" + 'Grand Maître......' + ' MS +' + (skills.MSP)+ ' | ' + ' RS +' + (skills.RSP)+ ' | ' + ' MC -' +(skills.MCP)+ ' | ' + ' RC -' + (skills.RCP)); $('a:contains("Alchimie")').prop('title', 'ATT ' + Math.floor(skills.ATT ) + 'D6' + skills.ATTP + ' (' + Math.floor(((+skills.ATT) )*3.5 + +skills.ATTP) + ')' + "\n" + '......DEG......' + "\n" + 'Apprenti...... ' + Math.floor(skills.ATT ) + 'D6' + skills.ATTP + ' (' + Math.floor(((+skills.ATT) )*3.5 + +skills.ATTP) + ')' + "\n" + 'Compagnon...... ' + Math.floor((skills.PV/25) ) + 'D3' + ' (' + Math.floor((skills.PV/25) )*3.5 + ')' + "\n" + 'Maître...... ' + Math.floor((skills.PV/20) ) + 'D3' + ' (' + Math.floor((skills.PV/20) )*3.5 + ')' + "\n" + 'Grand Maître...... ' + Math.floor((skills.PV/15) )+ 'D3' + ' (' + Math.floor((skills.PV/15) )*3.5 + ')') ; $('a:contains("Renforcement magique")').prop('title', 'Apprenti......' + ' MM +' + (skills.MMP/2)+ ' | ' + ' RM +0 ' + ' | ' + ' MR +0 ' + ' | ' + ' RR -' + (skills.RCP/2) + "\n" + 'Compagnon......' + ' MM +' + (skills.MMP)+ ' | ' + ' RM +0 '+ ' | ' + ' MR +0 '+ ' | ' + ' RR -' + (skills.RCP) + "\n" + 'Maître......' + ' MM +' + (skills.MMP)+ ' | ' + ' RM +' + (skills.RMP/2) + ' | ' + ' MR -' +(skills.MRP/2) + ' | ' + ' RR -' + (skills.RRP) + "\n" + 'Grand Maître......' + ' MM +' + (skills.MMP)+ ' | ' + ' RM +' + (skills.RMP)+ ' | ' + ' MR -' +(skills.MRP)+ ' | ' + ' RR -' + (skills.RRP)); $('a:contains("Connaissance des Monstres")').prop('title', 'portée : ' + (Math.floor((+skills.PER)+(+skills.PERM)+(+skills.PERP)))); $('a:contains("Projectile")').prop('title', 'ATT ' + Math.floor(((skills.PER/2 + skills.ATT/2)) - Math.max(0,(2/4-0))) + 'D6 +' + Math.floor(skills.PERM/2 + skills.ATTM/2 ) + '---> ' + (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" + 'DEG ' + Math.floor((skills.PER/2 + skills.ATT/2)) + 'D3 +' + (skills.ATTM/2 + skills.PERM/2 ) + '---> ' + ((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 ))) + ((((Math.floor((skills.PER/2 + skills.ATT/2)))*2 + Math.floor(skills.PERM/2 + skills.ATTM/2 )))/2)) + ')' + "\n" + 'Divisé par 2 si résisté' + "\n" + 'Portée : ' + getRange(skills.PER + skills.PERP + skills.PERM) ); //calcul de la portée du PO function getRange() { const totalPerception = +skills.PER + +skills.PERP + +skills.PERM; window.localStorage.setItem('totalPerception', totalPerception); if (totalPerception >= 1 && totalPerception <= 4) { return '1 case'; } else if (totalPerception >= 5 && totalPerception <= 9) { return '2 cases'; } else if (totalPerception >= 10 && totalPerception <= 15) { return '3 cases'; } else if (totalPerception >= 16 && totalPerception <= 22) { return '4 cases'; } else if (totalPerception >= 23 && totalPerception <= 30) { return '5 cases'; } else if (totalPerception >= 31 && totalPerception <= 39) { return '6 cases'; } else if (totalPerception >= 40 && totalPerception <= 50) { return '7 cases'; } else if (totalPerception >= 51 && totalPerception <= 62) { return '8 cases'; } else if (totalPerception >= 62 && totalPerception <= 74) { return '9 cases'; } else { return 'Out of Range'; } } ; $('a:contains("Baratin")').prop('title', 'Apprenti......' + Math.floor((1)+((skills.PER)/5 + (skills.REG)/5))+'D6' + ' (' + Math.floor(1+((skills.PER)/5 + (skills.REG)/5)*3.5) + ')' + "\n" + 'Compagnon......' + Math.floor((1)+((skills.PER)/4 + (skills.REG)/4)) +'D6' + ' (' + Math.floor(1+((skills.PER)/4 + (skills.REG)/4)*3.5) + ')' + "\n" + 'Maître ......' + Math.floor((1)+((skills.PER)/3 + (skills.REG)/3))+'D6' + ' (' + Math.floor(1+((skills.PER)/3 + (skills.REG)/3)*3.5) + ')' + "\n" + 'Grand Maître ......' + Math.floor((1)+((skills.PER)/2 + (skills.REG)/2))+'D6' + ' (' + Math.floor(1+((skills.PER)/2 + (skills.REG)/2)*3.5) + ')'); $('a:contains("Chirurgie")').prop('title', 'Apprenti...... ' + Math.floor((3/2)*skills.REG) + 'D3'+ ' (' + Math.floor((3/2)*skills.REG) *2 + ')' + "\n" + 'Compagnon...... ' + Math.floor((4/2)*skills.REG) + 'D3' + ' (' + Math.floor((4/2)*skills.REG) *2 + ')' + "\n" + 'Maître...... ' + Math.floor((5/2)*skills.REG) + 'D3' + ' (' + Math.floor((5/2)*skills.REG) *2 + ')' + "\n" + 'Grand Maître...... ' + Math.floor((6/2)*skills.REG) + 'D3' + ' (' + Math.floor((6/2)*skills.REG) *2 + ')'); $('a:contains("Soins")').prop('title', 'Apprenti...... ' + '+' + Math.floor(+skills.REG*1 + +skills.REGM) + ' PV' + "\n" + 'Compagnon...... ' + '+' + Math.floor(+skills.REG*2 + +skills.REGM) + ' PV' +"\n" + 'Maître...... ' + '+' + Math.floor(+skills.REG*3 + +skills.REGM) + ' PV' + "\n" + 'Grand Maître...... ' + '+' + Math.floor(+skills.REG*4 + +skills.REGM) + ' PV'); $('a:contains("Téléportation")').prop('title', '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" + '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" + '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" + '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)))); $('a:contains("Double Dague")').prop('title', 'Grand Maître : 1ere attaque : ' + skills.ATT+ 'D6'+ '+' + skills.ATTP*1+ '+' + +skills.ATTM + '2eme attaque : ' + Math.floor(skills.ATT-+skills.ATT*0.25) + 'D6'+ '+' + Math.floor(skills.ATTP*1*0.25)+ '+' + Math.floor(skills.ATTM*0.25) + '3eme attaque : ' + Math.floor(skills.ATT-+skills.ATT*0.5) + 'D6'+ '+' + Math.floor(skills.ATTP*1*0.5)+ '+' + Math.floor(skills.ATTM*0.5) + '4eme attaque : ' + Math.floor(skills.ATT-+skills.ATT*0.75) + 'D6'+ '+' + Math.floor(skills.ATTP*1*0.75)+ '+' + Math.floor(skills.ATTM*0.75) + 'Dégâts : ' + skills.DEG + 'D3'+ '+' + Math.floor(skills.DEGP*1.5)+ '+' + Math.floor(skills.DEGM)) ; $('a:contains("Flairer le gibier")').prop('title', 'Apprenti...... ' + 'Portée : ' + 1.5*(+skills.PER+(+skills.PERP)) + "\n" + 'Compagnon......' + 'Portée : '+ 2*(+skills.PER+(+skills.PERP)) + "\n" + 'Maître...... ' + 'Portée : ' + 2.5*(+skills.PER+(+skills.PERP)) + "\n" + 'Grand Maître...... ' + 'Portée : ' + 3*(+skills.PER+(+skills.PERP)) + "\n" ); $('a:contains("Jet de Pierres")').prop('title', 'Apprenti...... ' + 'Portée : 1' + "\n" + 'Compagnon......' + 'Portée : 2' + "\n" + 'Maître...... ' + 'Portée : 3' + "\n" + 'Grand Maître...... ' + 'Portée : 4' ); $('a:contains("Attaque Défensive")').prop('title', 'Apprenti.............. ' + 'ESQ +' + Math.floor(Math.max(skills.ESQ/3,1)) + " | ATT -1\n" + 'Compagnon....... ' + 'ESQ +' + Math.floor(Math.max(skills.ESQ/2.5,2)) + " | ATT -1\n" + 'Maître................... ' + 'ESQ +' + Math.floor(Math.max(skills.ESQ/2,3)) + " | ATT -1\n" + 'Grand Maître..... ' + 'ESQ +' + Math.floor(Math.max(skills.ESQ/1.5,4)) + " | ATT -1"); $('a:contains("Forme spectrale")').prop('title', 'Apprenti...... ' + 'ESQ +3 ARMM +1' + '.... total ARMM après conversion : ' + (Math.floor(skills.ARMP*0.15)+(+skills.ARMM)+1) + "\n" + 'Compagnon......' + 'ESQ +4 ARMM +2' + '.... total ARMM après conversion : ' + (Math.floor(skills.ARMP*0.20)+(+skills.ARMM)+2) + "\n" + 'Maître...... ' + 'ESQ +5 ARMM +3' + '.... total ARMM après conversion : ' + (Math.floor(skills.ARMP*0.25)+(+skills.ARMM)+3) + "\n" + 'Grand Maître...... ' + 'ESQ +6 ARMM +4' + '.... total ARMM après conversion : ' + (Math.floor(skills.ARMP*0.30)+(+skills.ARMM)+4)); $('a:contains("Herboriser")').prop('title', 'Apprenti...... ' + 'Portée : ' + 1.5*(+skills.PER+(+skills.PERP+(+skills.PERM))) + " (Fleur,Baie) " + "\n" + 'Compagnon......' + 'Portée : '+ 2*(+skills.PER+(+skills.PERP)+(+skills.PERM)) + ' (Fleur,Baie, Plante grasse, Champignon)' + "\n" + 'Maître...... ' + 'Portée : ' + 2.5*(+skills.PER+(+skills.PERP)+(+skills.PERM)) + ' (Fleur,Baie, Plante grasse, Champignon, Mousse)' + "\n" + 'Grand Maître...... ' + 'Portée : ' + 3*(+skills.PER+(+skills.PERP)+(+skills.PERM)) + ' (tout)'); $('a:contains("Rafale")').prop('title', 'FULL' + "\n" + 'Apprenti...... ' + 'DEG ' + skills.DEG + 'D3' + skills.DEGM + ' (pas de malus de REG)' + "\n" + 'Compagnon......' + 'DEG ' + skills.DEG + 'D3' + skills.DEGM + ' (Malus REG : ' + (Math.floor(skills.DEG/2)) + 'D3' + ')' + "\n" + 'Maître...... ' + 'DEG ' + skills.DEG + 'D3' + skills.DEGM + ' (Malus REG : ' + (Math.floor(skills.DEG)) + 'D3' + ')' + "\n" + 'Grand Maître...... ' + 'DEG ' + skills.DEG + 'D3' + skills.DEGM + ' (Malus REG : ' + (Math.floor(skills.DEG*2)) + 'D3' + ')' + "\n" + 'RES' + "\n" + 'Apprenti...... ' + 'DEG ' + (Math.floor(skills.DEG*0.3)) + 'D3' + skills.DEGM + ' (pas de malus de REG)' + "\n" + 'Compagnon......' + 'DEG ' + (Math.floor(skills.DEG*0.4)) + 'D3' + skills.DEGM + ' (pas de malus de REG)' + "\n" + 'Maître...... ' + 'DEG ' + (Math.floor(skills.DEG*0.5)) + 'D3' + skills.DEGM + ' (Malus REG : ' + (Math.floor(skills.DEG/2)) + 'D3' + ')' + "\n" + 'Grand Maître...... ' + 'DEG ' + (Math.floor(skills.DEG*0.6)) + 'D3' + skills.DEGM + ' (Malus REG : ' + (Math.floor(skills.DEG) + 'D3' + ')')) ; // DONS $('a:contains("Dans")').prop('title', 'ATTM + ' + skills.danslmil); $('a:contains("Limier")').prop('title', 'PERM + ' + skills.limier); $('a:contains("Chef")').prop('title', 'Bonus Cuisine : + ' + 5*skills.grandchef); $('a:contains("Dur à cuir")').prop('title', '+ ' + skills.duracuir*5 + ' PV'); }; function displayNextLevel() { // Sélection de la cellule contenant l'expérience var gobExperience = $('th:contains("Expérience")').parent().closest('tr'); var tdExp = $('td:first', gobExperience); var sExp = tdExp.html(); // Récupération des informations à partir du texte var regexExp = /Niveau......: (\d+) \((\d+) PI \| Niveau (\d+) : (\d+)/; var matchExp = sExp.match(regexExp); if (matchExp) { var niveau = matchExp[1]; // Récupération du niveau var nbPIActuels = matchExp[2]; // Récupération du nombre de PI actuels var nextlevel = matchExp[3]; // Récupération du niveau suivant var nextPI = matchExp[4]; // Récupération du nombre de PI var nbTrain = Math.ceil((nextPI - nbPIActuels) / (2 * nextlevel)); // Calcul du nombre d'entraînements restants window.localStorage.setItem('niveau', niveau); window.localStorage.setItem('nbPIActuels', nbPIActuels); window.localStorage.setItem('nextlevel', nextlevel); window.localStorage.setItem('nextPI', nextPI); var pExp = sExp.indexOf(")"); var sTrain = (nbTrain > 1) ? " entraînements" : " entraînement"; // Modification du contenu de la cellule avec les nouvelles informations tdExp.html(sExp.substr(0, pExp + 1) + " ---> Il te reste " + nbTrain + sTrain + sExp.substr(pExp + 1)); } var regexPX = /PX..........: (\d+)/; // Expression régulière pour récupérer PX var regexPXPerso = /PX Personnels......: (\d+)/ var regexPI = /PI..........: (\d+)/ var matchPx = sExp.match(regexPX); var matchPXPerso = sExp.match(regexPXPerso); var matchPI = sExp.match(regexPI); if (matchPx) { var PX = matchPx[1]; window.localStorage.setItem('PX', PX); } if (matchPXPerso) { var PXperso = matchPXPerso[1]; window.localStorage.setItem('PXperso', PXperso); } if (matchPI) { var PI = matchPI[1]; window.localStorage.setItem('PI', PI); } } // Recherche du texte "Date de création" dans toute la page var searchText = "Date de création"; var elementsContainingText = [...document.querySelectorAll('body, body *')].filter(element => element.textContent.includes(searchText)); // Recherche de l'élément contenant le texte spécifique var dateCreationElement; elementsContainingText.forEach(function(element) { if (element.textContent.includes(searchText)) { dateCreationElement = element; } }); // Sélection de l'élément contenant le texte var textElement = document.querySelector('.gfmm > table:nth-child(1) > tbody:nth-child(1) > tr:nth-child(1) > td:nth-child(2)'); if (textElement) { var textLines = textElement.textContent.trim().split('\n'); var dateCreationLine = textLines.find(line => line.includes('Date de création')); if (dateCreationLine) { var dateCreation = dateCreationLine.match(/\d{4}-\d{2}-\d{2}/); if (dateCreation) { console.log("Date de création:", dateCreation[0]); var DateCrea = dateCreation[0]; window.localStorage.setItem('DateCrea',DateCrea); // Utilisez dateCreation[0] comme nécessaire ici } else { console.log("Date de création non trouvée dans la dernière ligne."); } } else { console.log("Ligne contenant la date de création non trouvée."); } } else { console.log("Élément contenant le texte non trouvé."); } // Sélecteur pour cibler l'élément spécifique var selector = '.gfmm > table:nth-child(1) > tbody:nth-child(1) > tr:nth-child(1) > td:nth-child(2)'; // Récupération de l'élément correspondant au sélecteur var dateCreationElement = document.querySelector(selector); if (dateCreationElement) { var dateCreation = dateCreationElement.textContent.trim(); console.log("Date de création:", dateCreation); // Utilisez dateCreation comme nécessaire ici } else { console.log("Élément contenant la date de création non trouvé."); } function buildSkillsStats() { // Recup position et PER var gobPosition = $('th:contains("Position")').parent().closest('tr').text(); var pos = gobPosition.match(/X = ([-]*\d+) \| Y = ([-]*\d+) \| N = ([-]*\d+)/); skills.X = pos[1]; skills.Y = pos[2]; skills.N = pos[3]; var XYN = pos[1] + ', '+ pos[2] +', ' + pos[3] ; window.localStorage.setItem('XYN', XYN); var per = gobPosition.match(/Perception......: (\d+)/); skills.PER = per[1]; var perp = gobPosition.match(/Cases (\W(\d+))/); skills.PERP = perp[1]; var perm = gobPosition.match(/Cases (\W(\d+))(\W(\d+))/); skills.PERM = perm[3]; var permax = +skills.PER + +skills.PERP + +skills.PERM window.localStorage.setItem('permax', permax); // Recup de la concentration (pour la modif css plus haut) var concentration = $('th:contains("Affinités")').parent().closest('tr').text(); var conc = concentration.match(/Bonus de concentration : (\-\d+|\d+)/); skills.CON = conc[1]; // Recup de la dla var gobdla = $('th:contains("Echéance du Tour")').parent().closest('tr').text(); var dla = gobdla.match(/(\d+)-(\d+)-(\d+)/); skills.DLA = dla[1]; // Recup PV, PVMax et REG var gobSante = $('th:contains("Santé")').parent().closest('tr'); var tdSante = $('td:first', gobSante); res = tdSante.html().split(/<BR>/i); //gobSante.match(/: (\d+)([^:]+): (\d+)([^:]+): (\d+)/); skills.PV = res[0].match(/: (\d+)/)[1]; skills.PVMax = res[1].match(/: (\d+)/)[1]; var regensgob = $('td:contains("Régénération")').parent().closest('tr').text(); var reg = regensgob.match(/Régénération..: (\d+)/); skills.REG = reg[1]; var regp = regensgob.match(/D3(\W(\d+))/); skills.REGP = regp[1]; var regm = regensgob.match(/D3(\W(\d+))(\W(\d+))/); skills.REGM = regm[3]; /// recup DEG var degatsgob = $('div:contains("Dégâts")').parent().closest('tr').text(); var deg = degatsgob.match(/: (\d+)/); skills.DEG = deg[1]; var degp = degatsgob.match(/D3(\W(\d+))/); skills.DEGP = degp[1]; var degm = degatsgob.match(/D3(\W(\d+))(\W(\d+))/); skills.DEGM = degm[3]; /// recup ARM var armuresgob = $('div:contains("Armure")').parent().closest('tr').text(); var armp = armuresgob.match(/Armure.....: (\d+)/); skills.ARMP = armp[1]; var armm = armuresgob.match(/Armure.....: (\d+)(\W)(\d+)/); skills.ARMM = armm[3]; /// recup ATT var attaquesgob = $('td:contains("Attaque")').parent().closest('tr').text(); var att = attaquesgob.match(/Attaque.....: (\d+)/); skills.ATT = att[1]; var attp = attaquesgob.match(/Attaque.....: (\d+)D6(\W(\d+))/); skills.ATTP = attp[2]; var attm = attaquesgob.match(/Attaque.....: (\d+)D6(\W(\d+))(\W(\d+))/); skills.ATTM = attm[4]; /// recup ESQ var esquivesgob = $('td:contains("Esquive")').parent().closest('tr').text(); var esq = esquivesgob.match(/Esquive....: (\d+)/); skills.ESQ = esq[1]; var esqp = esquivesgob.match(/Esquive....: (\d+)D6(\W(\d+))(\W)(\d+)/); skills.ESQP = esqp[2]; var esqm = esquivesgob.match(/Esquive....: (\d+)D6(\W)(\d+)(\W(\d+))/); skills.ESQM = esqm[4]; }; function getDon(don) { try { return $('td:contains("' + don + '")').next('td').text().match(/(\d) (\W) (\d)/)[1]; } catch (err) { return null; } }; function buildSkillsMagie() { //recup dons skills.danslmil = getDon("Dans"); skills.limier = getDon("Limier"); skills.grandchef = getDon("Grand Chef"); skills.duracuir = getDon("Dur à cuir"); ///recup Magies (a finir) skills.RM = $('td.invisible:contains("(RM)")').next('td').text().match(/= ([-]*\d+)/)[1]; skills.RMP = $('td.invisible:contains("(RM)")').next('td').text().match(/(\d+)(\W(\d+))/)[1]; skills.RMM = $('td.invisible:contains("(RM)")').next('td').text().match(/(\d+)(\W(\d+))/)[2]; skills.MM = $('td.invisible:contains("(MM)")').next('td').text().match(/= ([-]*\d+)/)[1]; skills.MMP = $('td.invisible:contains("(MM)")').next('td').text().match(/(\d+)(\W(\d+))/)[1]; skills.MMM = $('td.invisible:contains("(MM)")').next('td').text().match(/(\d+)(\W(\d+))/)[2]; skills.RS = $('td.invisible:contains("(RS)")').next('td').text().match(/= ([-]*\d+)/)[1]; skills.RSP = $('td.invisible:contains("(RS)")').next('td').text().match(/(\d+)(\W(\d+))/)[1]; skills.RSM = $('td.invisible:contains("(RS)")').next('td').text().match(/(\d+)(\W(\d+))/)[2]; skills.MS = $('td.invisible:contains("(MS)")').next('td').text().match(/= ([-]*\d+)/)[1]; skills.MSP = $('td.invisible:contains("(MS)")').next('td').text().match(/(\d+)(\W(\d+))/)[1]; skills.MSM = $('td.invisible:contains("(MS)")').next('td').text().match(/(\d+)(\W(\d+))/)[2]; skills.RT = $('td.invisible:contains("(RT)")').next('td').text().match(/= ([-]*\d+)/)[1]; skills.RTP = $('td.invisible:contains("(RT)")').next('td').text().match(/(\d+)(\W(\d+))/)[1]; skills.RTM = $('td.invisible:contains("(RT)")').next('td').text().match(/(\d+)(\W(\d+))/)[2]; skills.MT = $('td.invisible:contains("(MT)")').next('td').text().match(/= ([-]*\d+)/)[1]; skills.MTP = $('td.invisible:contains("(MT)")').next('td').text().match(/(\d+)(\W(\d+))/)[1]; skills.MTM = $('td.invisible:contains("(MT)")').next('td').text().match(/(\d+)(\W(\d+))/)[2]; skills.RC = $('td.invisible:contains("(RC)")').next('td').text().match(/= ([-]*\d+)/)[1]; skills.RCP = $('td.invisible:contains("(RC)")').next('td').text().match(/(\d+)(\W(\d+))/)[1]; skills.RCM = $('td.invisible:contains("(RC)")').next('td').text().match(/(\d+)(\W(\d+))/)[2]; skills.MC = $('td.invisible:contains("(RT)")').next('td').text().match(/= ([-]*\d+)/)[1]; skills.MCP = $('td.invisible:contains("(RT)")').next('td').text().match(/(\d+)(\W(\d+))/)[1]; skills.MCM = $('td.invisible:contains("(RT)")').next('td').text().match(/(\d+)(\W(\d+))/)[2]; skills.RP = $('td.invisible:contains("(RP)")').next('td').text().match(/= ([-]*\d+)/)[1]; skills.RPP = $('td.invisible:contains("(RP)")').next('td').text().match(/(\d+)(\W(\d+))/)[1]; skills.RPM = $('td.invisible:contains("(RP)")').next('td').text().match(/(\d+)(\W(\d+))/)[2]; skills.MP = $('td.invisible:contains("(MP)")').next('td').text().match(/= ([-]*\d+)/)[1]; skills.MPP = $('td.invisible:contains("(MP)")').next('td').text().match(/(\d+)(\W(\d+))/)[1]; skills.MPM = $('td.invisible:contains("(MP)")').next('td').text().match(/(\d+)(\W(\d+))/)[2]; skills.RR = $('td.invisible:contains("(RR)")').next('td').text().match(/= ([-]*\d+)/)[1]; skills.RRP = $('td.invisible:contains("(RR)")').next('td').text().match(/(\d+)(\W(\d+))/)[1]; skills.RRM = $('td.invisible:contains("(RR)")').next('td').text().match(/(\d+)(\W(\d+))/)[2]; //manque MR }; ///fonction pour récup les ordres des Suivants et les afficher directement dans la section Suivant dans Profil. function httpGet(url) { return new Promise((resolve, reject) => { const xhr = new XMLHttpRequest(); xhr.open("GET", url); xhr.onload = () => { if (xhr.status === 200) { resolve(xhr.responseText); } else { reject(xhr.statusText); } }; xhr.onerror = () => reject(xhr.statusText); xhr.send(); }); } // Fonction pour récupérer les valeurs stockées dans le localStorage function getFollowersNumbers() { return localStorage.getItem('followersnumbers'); } function fetchFollowersInfo() { const followersNumbers = getFollowersNumbers(); if (followersNumbers) { const baseUrl = 'http://games.gobland.fr/fo_orders.php?IdFO='; const numbersArray = JSON.parse(followersNumbers); // Parse le tableau JSON des numéros const followersNames = localStorage.getItem('followersnames') || ''; const namesArray = JSON.parse(followersNames); // Parse le tableau JSON des noms const followersData = []; numbersArray.forEach((number, index) => { const sanitizedNumber = number.replace(/['"\[\]]/g, ''); const url = baseUrl + sanitizedNumber; httpGet(url) .then(responseText => { const parser = new DOMParser(); const htmlDoc = parser.parseFromString(responseText, "text/html"); const xpath = "//html/body/div[3]/div/table/tbody/tr[2]/td[2]/form/table/tbody/tr[4]/td"; const element = htmlDoc.evaluate(xpath, htmlDoc, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue; if (element) { const texte = element.textContent.trim(); followersData.push({ number: sanitizedNumber, name: namesArray[index], movements: texte }); } else { console.log("Élément non trouvé sur la page", url); } if (index === numbersArray.length - 1) { displayFollowersInfo(followersData); } }) .catch(error => { console.error("Erreur lors de la récupération de la page", url, ":", error); if (index === numbersArray.length - 1) { displayFollowersInfo(followersData); } }); }); } else { console.log("Pas de numéro de suivants. Visitez (une seule fois) votre page suivant pour récupérer les infos."); } } function displayFollowersInfo(followersData) { const insertionPoint = document.querySelector(".gfmm > table:nth-child(1) > tbody:nth-child(1) > tr:nth-child(9) > td:nth-child(2)"); if (insertionPoint) { followersData.forEach(follower => { const movements = follower.movements.split(';').filter(Boolean); const suivantName = follower.name || ''; movements.forEach(movement => { const formattedMovement = movement.trim(); const isStop = formattedMovement === 'stop()'; const span = document.createElement('span'); span.innerHTML = `<b>${suivantName}</b> - <i>${formattedMovement}</i>`; span.querySelector('b').style.fontWeight = 'bold'; span.querySelector('i').style.fontStyle = 'italic'; if (isStop) { span.style.color = 'red'; } insertionPoint.appendChild(span); insertionPoint.appendChild(document.createElement('br')); }); }); } else { console.log('prix spécialité', specialtyPrices); } } fetchFollowersInfo(); } /// Affichage des carats const regMinerai = /^(\D*)(\d+)(\D*)$/ const qualites = { 'Médiocre': 2, 'Moyenne': 2.75, 'Normale': 3.5, 'Bonne': 4.25, 'Exceptionnelle': 5 }; $( document ).ready(function() { $('a:contains("taille")').each(function() { arr = this.text.match(regMinerai); carats = arr[2] * qualites[arr[3].split(' ')[3]]; this.text = arr[0] + ' [Carats = ' + carats + ']' }) }); /// Décocher par défaut la case activer sa DLA sur la page de Log-In piqué a Seishin (function() { 'use strict'; $('input[type=checkbox][name=aDLA]').prop( "checked", false); })(); // Décocher par défaut le vestaire piqué a Seishin (function() { 'use strict'; $('input[type=checkbox][name=VESTIAIRE]').prop( "checked", false ); })(); ///fonction RemplaceText () pour remplacer le texte et ajouter des icones dans Gobland (inspiré par Lordslair)) if ($(location).attr('href').match(/http:\/\/(.*\.)?gobland\.fr\/Vue\.php/i)) { const words = { // icones monstres 'Abishaii Multicolore' : 'Abishaii Multicolore 👁️👁️ 💉', 'Abishaii Blanc' : 'Abishaii Blanc 👁️ 💉', 'Abishaii Bleu' : 'Abishaii Bleu 👁️ 💉', 'Abishaii Noir' : 'Abishaii Noir 👁️ 💉', 'Abishaii Rouge' : 'Abishaii Rouge 👁️ 💉', 'Abishaii Vert' : 'Abishaii Vert 👁️ 💉', 'Ankheg': 'Ankheg 🙈', 'Ame-en-peine' : 'Ame-en-peine 👁️', 'Amibe Géante' : 'Amibe Géante 🙈 🚨', 'Anaconda des Catacombes' : 'Anaconda des Catacombes 🙈', 'Araignée Géante' : 'Araignée Géante 🙈' , 'Arbre à gobelins' : 'Arbre à gobelins 🙈', 'Automate' : 'Automate 👁️👁️', 'Barghest' : 'Barghest 👁️👁️', 'Babélien' : 'Babélien 🙈', 'Basilic' : 'Basilic 🙈 🚨', 'Béhir' : 'Béhir 👁️ 🚨', 'Boggart' : 'Boggart 🙈', 'Bondin' : 'Bondin 🙈 ', 'Brontoscorpion' : 'Brontoscorpion 🙈', 'Bulette' : 'Bulette 👁️', 'Cattis' : 'Cattis 👁️👁️' , 'Caillouteux' : 'Caillouteux 🙈', 'Cerbère' : 'Cerbère 👁️👁️👁️ 💉💉', 'Centaure' : 'Centaure 🙈' , 'Chauve-souris Géante' : 'Chauve-souris Géante 🙈', 'Chimère' : 'Chimère 👁️👁️ 🚨' , 'Cockatrice' : 'Cockatrice 🙈 🚨', 'Colosse de pierre' : 'Colosse de pierre 👁️👁️👁️', 'Crapaud démoniaque' : 'Crapaud démoniaque 👁️', 'Crapaud Géant' : 'Crapaud Géant 🙈', 'Croquemitaine' : 'Croquemitaine 🙈', 'Cyclope' : 'Cyclope 🙈', 'Danseur de Mort' : 'Danseur de Mort 👁️', 'Diablotin' : 'Diablotin 👁️', 'Dao' : 'Dao 👁️👁️', 'Dumb' : 'Dumb 🙈', 'Djinn' : 'Djinn 👁️👁️', 'Dragon' : 'Dragon 🔥', 'Dryade' : 'Dryade 👁️👁️👁️', 'Effrit' : 'Effrit 🔥 ', 'Elémentaire de Terre' : 'Elémentaire de Terre 👁️ 🔥', "Elémentaire d'Eau" : "Elémentaire d'Eau 👁️ 🔥", 'Elémentaire de Feu' : 'Elémentaire de Feu 👁️ 🔥', 'Elfe' : 'Elfe 🙈', 'Ent' : 'Ent 👁️👁️', 'Erinyes' : 'Erinyes 👁️ 🚨', 'Escargot' : 'Escargot 🙈', 'Ettercap' : 'Ettercap 🙈', 'Ettin' : 'Ettin 🙈', 'Eusmilus' : 'Eusmilus 🙈', 'Fantôme' : 'Fantôme 🙈', 'Feu follet' : 'Feu follet 🙈 🔥', 'Fongoïde' : 'Fongoïde 🙈', 'Furgolin' : 'Furgolin 🙈', 'Fungus Géant' : 'Fungus Géant 👁️', 'Fungus Violet' : 'Fungus Violet 👁️👁️', 'Galopin' : 'Galopin 🙈', 'Géant des Collines' : 'Géant des Collines 🙈', 'Géant du Feu' : 'Géant du Feu 🙈', 'Géant des Nuages' : 'Géant des Nuages 👁️', 'Géant des Tempêtes' : 'Géant des Tempêtes 👁️', 'Géant du Froid' : 'Géant du Froid 👁️', 'Géant de Pierre' : 'Géant de Pierre 👁️', 'Gnoll' : 'Gnoll 🙈', 'Gnome de pierre' : 'Gnome de pierre 👁️', 'Gelée ocre' : 'Gelée ocre 🙈 🚨', 'Glouton' : 'Glouton 🙈', 'Glouton Sanguinaire' : 'Glouton Sanguinaire 🙈', 'Gnome Artificier' : 'Gnome Artificier 🙈', 'Goblours' : 'Goblours 🙈', 'Golem de Fer' : 'Golem de Fer 🙈', 'Golem de Pierre' : 'Golem de Pierre 🙈', 'Gorille démoniaque' : 'Gorille démoniaque 🙈 🚨', 'Gorgone' : 'Gorgone 👁️ 🚨', 'Goule' : 'Goule 👁️', 'Gremlins' : 'Gremlins 🙈', 'Grouilleux' : 'Grouilleux 🙈', 'Griffon' : 'Griffon 👁️', 'Guêpe géante' : 'Guêpe géante 👁️ 💉', 'Harpie' : 'Harpie 🙈', 'Hellrot' : 'Hellrot 👁️👁️', 'Homme-Lézard' : 'Homme-Lézard 🙈', 'Homothérium' : 'Homothérium 👁️', 'Horreur chasseresse' : 'Horreur chasseresse 👁️👁️', 'Hippopotame furieux' : 'Hippopotame furieux 🙈', 'Hippogriffe' : 'Hippogriffe 👁️', 'Halfelin' : 'Halfelin 🙈', 'Hurleur' : 'Hurleur 🙈 🚨', 'Incube' : 'Incube 👁️', 'Illithid' : 'Illithid 👁️👁️👁️', 'Kappa' : 'Kappa 🙈', 'Kobold' : 'Kobold 🙈', 'Lacodon' : 'Lacodon 🙈 🚨', 'Lapin Sanguinaire' : 'Lapin Sanguinaire 🙈', 'Larbin démoniaque' : 'Larbin démoniaque 👁️', 'Légion-en-peine' : 'Légion-en-peine 👁️👁️ 😵', 'Lémure' : 'Lémure 👁️', 'Lézard Géant' : 'Lézard Géant 🙈', 'Licorne' : 'Licorne 🙈 🚨', 'Limace Géante' : ' Limace Géante 🙈 🚨', 'Loup-garou' : 'Loup-garou 🙈', 'Lutin' : 'Lutin 🙈 💉', 'Macrauchenia' : 'Macrauchenia 🙈' , 'Mante religieuse géante' : 'Mante religieuse géante 🙈 🚨', 'Manticore' : 'Manticore 🙈', 'Marid' : 'Marid 👁️👁️', 'Marmotte' : 'Marmotte 🙈' , 'Méduse' : 'Méduse 🙈 🚨', 'Meganeura' : 'Meganeura 🙈', 'Megantereon' : 'Megantereon 🙈', 'Méphite Aérien' : 'Méphite Aérien 🙈 🔥', 'Méphite de Feu' : 'Méphite de Feu 🙈 🔥', 'Méphite Aqueux' : 'Méphite Aqueux 🙈 🔥' , 'Méphite de Glace' : 'Méphite de Glace 🙈 🔥', 'Méphite de Verre' : 'Méphite de Verre 🙈 🔥', 'Méphite Magmatique' : 'Méphite Magmatique 🙈 🔥', 'Méphite Sulfureux' : 'Méphite Sulfureux 🙈 🔥', 'Mille-pattes géant' : 'Mille-pattes géant 👁️ ', 'Mimique' : 'Mimique 🙈 🚨', 'Minotaure' : 'Minotaure 🙈', 'Molosse Satanique' : 'Molosse Satanique 👁️ 🔥', 'Momie' : 'Momie 👁️ ', 'Monstre Rouilleur' : 'Monstre Rouilleur 🙈', 'Naga' : 'Naga 🙈 ', 'Nécrophage' : 'Nécrophage 🙈 💉', "Nuage d'insectes" : "Nuage d'insectes 🙈", 'Nuée de Vermines' : 'Nuée de Vermines 🙈', 'Ombre' : 'Ombre 👁️', 'Ondine' : 'Ondine 👁️ 🔥', 'Oni' : 'Oni 👁️👁️ 😵 🚨', 'Oiseau-Tonnerre' : 'Oiseau-Tonnerre 🙈', 'Onyx' : 'Onyx 🙈', 'Orque Noir' : 'Orque Noir 🙈', 'Otyugh' : 'Otyugh 🙈', 'Ours hibou' : 'Ours hibou 👁️ ', 'Ours des Montagnes' : 'Ours des Montagnes 🙈', 'Orque': 'Orque 🙈', 'Plante Carnivore' : 'Plante Carnivore 👁️', 'Pégase' : 'Pégase 🙈', 'Pseudo-Dragon' : 'Pseudo-Dragon 🙈', 'Rakshah' : 'Rakshah 👁️👁️', 'Rat-garou' : 'Rat-garou 🙈', 'Rat Géant' : 'Rat Géant 🙈', 'Rocketeux' : 'Rocketeux 🙈', 'Sagouin' : 'Sagouin 🙈', 'Scarabée Géant' : 'Scarabée Géant 🙈 💉', 'Shai' : 'Shai 👁️👁️ 🔥', 'Sphinx' : 'Sphinx 👁️👁️', 'Slaad' : 'Slaad 🙈', 'Salamandre' : 'Salamandre 👁️ 🔥', 'Strige': 'Strige 🙈', 'Squelette' : 'Squelette 👁️', 'Spectre' : 'Spectre 👁️', 'Sprigan' : 'Sprigan 🙈', 'Sylphide' : 'Sylphide 👁️ 🔥', 'Taureau démoniaque' : 'Taureau démoniaque 👁️👁️ 🚨', 'Tertre errant' : 'Tertre errant 👁️ 🚨', 'Thri-kreen' : 'Thri-kreen 🙈', 'Tigre à Dents de Sabre' : 'Tigre à Dents de Sabre 🙈', 'Tigre-garou' : 'Tigre-garou 🙈', 'Titan' : 'Titan 🙈', 'Tortue Carnivore' : 'Tortue Carnivore 🙈', 'Tutoki': 'Tutoki 🙈 🚨', 'Troglodyte' : 'Troglodyte 👁️', 'Troll' : 'Troll 👁️', 'Vampire \\b' : 'Vampire 👁️👁️ 😵', 'Vampire Archaïque' : 'Vampire Archaïque 👁️👁️ 😵', 'Viverne' : 'Viverne 🙈 💉💉', 'Ver Géant Carnivore' : 'Ver Géant Carnivore 🙈', 'Worg' : 'Worg 🙈', 'Yéti' : 'Yéti 🙈 🚨', 'Zombi' : 'Zombi 👁️', }; const tagsWhitelist = ['PRE', 'BLOCKQUOTE', 'CODE', 'INPUT', 'BUTTON', 'TEXTAREA']; function prepareRegex(string) { return string.replace(/(\({2}|([\[\]\^\&\$\.\?\/\\\+\{\}])|\)$)/g, '\\$1'); } function getTooltipText(icon) { switch (icon) { case 'Ankheg 🙈': case 'Amibe Géante 🙈': case 'Anaconda des Catacombes 🙈': case 'Araignée Géante 🙈' : case 'Arbre à gobelins 🙈': case 'Babélien 🙈': case 'Basilic 🙈': case 'Boggart 🙈': case 'Bondin 🙈': case 'Caillouteux 🙈': case 'Centaure 🙈' : case 'Chauve-souris Géante 🙈': case 'Cockatrice 🙈': case 'Crapaud Géant 🙈': case 'Croquemitaine 🙈': case 'Cyclope 🙈': case 'Dumb 🙈': case 'Elfe 🙈': case 'Escargot 🙈': case 'Ettin 🙈': case 'Eusmilus 🙈': case 'Fantôme 🙈': case 'Fongoïde 🙈': case 'Furgolin 🙈': case 'Galopin 🙈': case 'Géant des Collines 🙈': case 'Géant du Feu 🙈' : case 'Gnoll 🙈': case 'Gelée ocre 🙈': case 'Glouton 🙈': case 'Glouton Sanguinaire 🙈': case 'Gnome Artificier ': case 'Goblours 🙈': case 'Golem de Fer 🙈': case 'Golem de Pierre 🙈': case 'Gorille démoniaque 🙈': case 'Gremlins 🙈': case 'Grouilleux 🙈': case 'Harpie 🙈': case 'Homme-Lézard 🙈': case 'Hippopotame furieux 🙈': case 'Halfelin 🙈': case 'Hurleur 🙈': case 'Kappa 🙈': case 'Kobold 🙈': case 'Lacodon 🙈': case 'Lapin Sanguinaire 🙈': case 'Lézard Géant 🙈': case 'Licorne 🙈': case 'Limace Géante 🙈': case 'Loup-garou 🙈': case 'Macrauchenia 🙈': case 'Mante religieuse géante 🙈': case 'Manticore 🙈': case 'Marmotte 🙈': case 'Méduse 🙈': case 'Meganeura 🙈': case 'Megantereon 🙈': case 'Mimique 🙈': case 'Minotaure 🙈': case 'Monstre Rouilleur 🙈': case 'Naga 🙈': case "Nuage d'insectes 🙈": case 'Nuée de Vermines 🙈': case 'Oiseau-Tonnerre 🙈': case 'Onyx 🙈': case 'Orque Noir 🙈': case 'Otyugh 🙈': case 'Ours des Montagnes 🙈': case 'Orque 🙈': case 'Pégase 🙈': case 'Pseudo-Dragon 🙈': case 'Rat-garou 🙈': case 'Rat Géant 🙈': case 'Rocketeux 🙈': case 'Sagouin 🙈': case 'Slaad 🙈': case 'Sprigan 🙈': case 'Strige 🙈': case 'Thri-kreen 🙈': case 'Tigre à Dents de Sabre 🙈': case 'Tigre-garou 🙈': case 'Titan 🙈': case 'Tortue Carnivore 🙈': case 'Tutoki 🙈': case 'Ver Géant Carnivore 🙈': case 'Worg 🙈': case 'Yéti 🙈': return "Ne voit pas le caché"; case 'Ame-en-peine 👁️': case 'Béhir 👁️': case 'Bulette 👁️': case 'Crapaud démoniaque 👁️': case 'Danseur de Mort 👁️': case 'Diablotin 👁️': case 'Erinyes 👁️': case 'Fungus Géant 👁️': case 'Géant des Nuages 👁️': case 'Géant des Tempêtes 👁️': case 'Géant du Froid 👁️': case 'Géant de Pierre 👁️': case 'Gnome de pierre 👁️': case 'Gorgone 👁️': case 'Goule 👁️': case 'Griffon 👁️': case 'Homothérium 👁️': case 'Hippogriffe 👁️': case 'Incube 👁️': case 'Larbin démoniaque 👁️': case 'Lémure 👁️': case 'Mille-pattes géant 👁️': case 'Momie 👁️': case 'Ombre 👁️': case 'Ours hibou 👁️': case 'Plante Carnivore 👁️': case 'Squelette 👁️': case 'Spectre 👁️': case 'Tertre errant 👁️': case 'Troglodyte 👁️': case 'Troll 👁️': case 'Zombi 👁️': return "Voit très partiellement le caché"; case 'Automate 👁️👁️': case 'Barghest 👁️👁️': case 'Cattis 👁️👁️': case 'Chimère 👁️👁️': case 'Dao 👁️👁️': case 'Djinn 👁️👁️': case 'Ent 👁️👁️': case 'Hellrot 👁️👁️': case 'Horreur chasseresse 👁️👁️': case 'Marid 👁️👁️': case 'Rakshah 👁️👁️': case 'Sphinx 👁️👁️': case 'Taureau démoniaque 👁️👁️': case 'Fungus Violet 👁️👁️': return "Voit partiellement le caché"; case 'Colosse de pierre 👁️👁️👁️': case 'Dryade 👁️👁️👁️': case 'Illithid 👁️👁️👁️': return "Voit completement le caché"; case 'Oni 👁️👁️ 😵': case 'Légion-en-peine 👁️👁️ 😵': case 'Vampire 👁️👁️ 😵': case 'Vampire Archaïque 👁️👁️ 😵': return "Voit partiellement le caché et Drain d'énergie"; case 'Dragon 🔥': case 'Effrit 🔥 ': return "Dégats de zone"; case 'Abishaii Blanc 👁️ 💉': case 'Abishaii Bleu 👁️ 💉': case 'Abishaii Noir 👁️ 💉': case 'Abishaii Rouge 👁️ 💉': case 'Abishaii Vert 👁️ 💉': case 'Guêpe géante 👁️ 💉': return "Voit très partiellement le caché et venin"; case 'Lutin 🙈 💉': case 'Scarabée Géant 🙈 💉': case 'Nécrophage 🙈 💉': return "Ne voit pas le caché et venin"; case 'Méphite Aérien 🙈 🔥': case 'Méphite de Feu 🙈 🔥': case 'Méphite Aqueux 🙈 🔥' : case 'Méphite de Glace 🙈 🔥': case 'Méphite de Verre 🙈 🔥': case 'Méphite Magmatique 🙈 🔥': case 'Méphite Sulfureux 🙈 🔥': return "Ne voit pas le caché et dégats de zone"; case 'Elémentaire de Terre 👁️ 🔥': case 'Molosse Satanique 👁️ 🔥': case 'Ondine 👁️ 🔥': case 'Salamandre 👁️ 🔥': case 'Sylphide 👁️ 🔥': case 'Elémentaire de Terre 👁️ 🔥': case "Elémentaire d'Eau 👁️ 🔥": case 'Elémentaire de Feu 👁️ 🔥': return "Voit très partiellement le caché et dégats de zone"; case 'Shai 👁️👁️ 🔥': return "Voit partiellement le caché et dégats de zone"; case 'Viverne 🙈 💉💉': return "Ne voit pas le caché et venin virulent"; case 'Feu follet 🙈 🔥': return "Ne voit pas le caché et dégats de zone et venin virulent"; case 'Cerbère 👁️👁️👁️ 💉💉': return "Voit completement le caché et venin virulent"; case 'Abishaii Multicolore 👁️👁️ 💉': return "Voit partiellement le caché et venin"; } } $(document).ready(function() { 'use strict'; var regexs = [], replacements = [], rIsRegexp = /^\/(.+)\/([gim]+)?$/, word, text, texts, i, userRegexp; for (word in words) { if (typeof word === 'string' && words.hasOwnProperty(word)) { userRegexp = word.match(rIsRegexp); // Ajout des expressions régulières et des remplacements if (userRegexp) { regexs.push(new RegExp(userRegexp[1], 'g')); } else { regexs.push(new RegExp(prepareRegex(word).replace(/\\?\*/g, function(fullMatch) { return fullMatch === '\\*' ? '*' : '[^ ]*'; }), 'g')); } replacements.push(words[word]); } } // Sélecteur pour toutes les cellules de la cinquième colonne var cells = document.querySelectorAll('#TCREATURES > center:nth-child(1) > table:nth-child(1) > tbody:nth-child(1) > tr > td:nth-child(5)'); // Boucle à travers toutes les cellules de la cinquième colonne cells.forEach(function(cell) { var cellContent = cell.textContent; var originalContent = cell.innerHTML; regexs.forEach(function(value, index) { var replacementIcon = replacements[index]; var tooltipText = getTooltipText(replacementIcon); cellContent = cellContent.replace(value, function(match) { // Ajout du tooltip avec la signification de l'icône return `<span title="${tooltipText}">${replacementIcon}</span>`; }); }); cell.innerHTML = cellContent; // Ajout de la classe 'monster-column' pour empêcher le retour à la ligne cell.classList.add('monster-column'); // Ajout des styles CSS directement ici cell.style.whiteSpace = 'nowrap'; }); // Création du bouton "Légende" var legendButton = document.createElement('button'); legendButton.textContent = 'Légende'; legendButton.style.display = 'block'; legendButton.style.margin = 'auto'; legendButton.addEventListener('click', function(event) { event.stopPropagation(); // Empêche la propagation de l'événement de clic // Création de la fenêtre modale pour afficher la légende var modal = document.createElement('div'); modal.style.position = 'fixed'; modal.style.top = '0'; modal.style.left = '0'; modal.style.width = '100%'; modal.style.height = '100%'; modal.style.backgroundColor = 'rgba(0, 0, 0, 0.5)'; modal.style.display = 'flex'; modal.style.alignItems = 'center'; modal.style.justifyContent = 'center'; // Contenu de la légende var legendContent = document.createElement('div'); legendContent.style.backgroundColor = 'rgb(255,235,205)'; legendContent.style.padding = '20px'; legendContent.style.borderRadius = '5px'; // Ajout de chaque élément de la légende var legendItems = { '🥰': 'créatures amies', '🙈': 'ne voit pas le caché', '👁️': 'voit très partiellement le caché', '👁️👁️': 'voit partiellement le caché', '👁️👁️👁️': 'voit complètement le caché', '💉': 'venin', '🔥': 'PV-', '😵': 'drain d\'énergie', '🚨': 'enlève de l\'esquive' }; for (var emoji in legendItems) { var legendItem = document.createElement('div'); legendItem.textContent = `${emoji}: ${legendItems[emoji]}`; legendContent.appendChild(legendItem); } //ajout des textes surlignés en couleur var highlightText4 = document.createElement('div'); highlightText4.textContent = 'Gobelin'; highlightText4.style.backgroundColor = "#ccccff" ; highlightText4.style.color = 'black'; highlightText4.style.padding = '5px'; highlightText4.style.borderRadius = '5px'; highlightText4.style.marginTop = '10px'; // Ajout du texte surligné à la légende legendContent.appendChild(highlightText4); // Création de l'élément pour le texte "Niveau supérieur à 35" var highlightText = document.createElement('div'); highlightText.textContent = 'Monstre lvl supérieur à 39'; highlightText.style.backgroundColor = '#f55442'; highlightText.style.color = 'white'; highlightText.style.padding = '5px'; highlightText.style.borderRadius = '5px'; highlightText.style.marginTop = '10px'; // Ajout du texte surligné à la légende legendContent.appendChild(highlightText); var highlightText2 = document.createElement('div'); highlightText2.textContent = 'Monstre lvl supérieur à 29'; highlightText2.style.backgroundColor = '#f59c42'; highlightText2.style.color = 'white'; highlightText2.style.padding = '5px'; highlightText2.style.borderRadius = '5px'; highlightText2.style.marginTop = '10px'; // Ajout du texte surligné à la légende legendContent.appendChild(highlightText2); var highlightText3 = document.createElement('div'); highlightText3.textContent = 'Monstre lvl supérieur à 25'; highlightText3.style.backgroundColor = '#f5b342'; highlightText3.style.color = 'white'; highlightText3.style.padding = '5px'; highlightText3.style.borderRadius = '5px'; highlightText3.style.marginTop = '10px'; // Ajout du texte surligné à la légende legendContent.appendChild(highlightText3); var highlightText5 = document.createElement('div'); highlightText5.textContent = 'Vieilles créatures'; highlightText5.style.backgroundColor = '#c791b1'; highlightText5.style.color = 'white'; highlightText5.style.padding = '5px'; highlightText5.style.borderRadius = '5px'; highlightText5.style.marginTop = '10px'; // Ajout du texte surligné à la légende legendContent.appendChild(highlightText5); var highlightText6 = document.createElement('div'); highlightText6.textContent = 'Suivant/Créature controlé par un Gob'; highlightText6.style.backgroundColor = '#ffadde'; highlightText6.style.color = 'black'; highlightText6.style.padding = '5px'; highlightText6.style.borderRadius = '5px'; highlightText6.style.marginTop = '10px'; // Ajout du texte surligné à la légende legendContent.appendChild(highlightText6); // Création de l'élément pour l'espace var space = document.createElement('div'); space.style.height = '10px'; // Vous pouvez ajuster la hauteur selon vos besoins // Ajout de l'espace à la légende legendContent.appendChild(space); // Bouton pour fermer la fenêtre modale var closeButton = document.createElement('button'); closeButton.textContent = 'Fermer'; closeButton.addEventListener('click', function() { document.body.removeChild(modal); }); legendContent.appendChild(closeButton); modal.appendChild(legendContent); // Ajout de la fenêtre modale à la page document.body.appendChild(modal); }); // Sélection de l'élément à côté duquel vous voulez placer le bouton "Légende" var referenceElement = document.querySelector('html body div#content div#identite table.gf tbody tr td.gfmm h1'); // Création d'un conteneur pour les boutons var buttonContainer = document.createElement('div'); buttonContainer.style.marginTop = '10px'; // Ajout du bouton "Légende" à ce conteneur buttonContainer.appendChild(legendButton); // Insérer le conteneur des boutons sous l'élément de référence referenceElement.parentNode.insertBefore(buttonContainer, referenceElement.nextSibling); }); }; if ($(location).attr('href').match(/http:\/\/(.*\.)?gobland\.fr\/Vue\.php|http:\/\/(.*\.)?gobland\.fr\/ProfilPerso\.php/i)) { const words = { // Clan et CM '((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))' : '🥰', // méchants '((50|104|151691|270|267))' : '🔴', // Icônes équipement 'Potion' : 'Potion 🧪', 'Parchemin' : 'Parchemin 📜📜📜📜📜📜📜alerte📜📜📜📜📜📜📜📜📜📜', 'CT| Canines de Trõll' : ' CT 💰', 'Anneau' : 'Anneau 💍 ', 'Bouclier' : 'Bouclier 🛡️', 'Corps' : 'Corps ☠️', 'Arme 1 Main' : 'Arme 1 main 🗡️', 'Outil' : "Outil 🔧", 'Nourriture' : 'Nouriture 🍔', 'Rondin' : 'Rondin 🪵', // Dans Mon Profil 'Santé' : 'Santé ❤️', 'Echéance du Tour' : 'Echéance du Tour⏱️', 'Combat' : 'Combat ⚔️', 'Affinités' : 'Affinités ✨', 'Position' : 'Position 🧭', 'Description' : 'Description 📜', 'Expérience' : 'Expérience 🇽🇵', 'Actions programmées': 'Actions programmées ⏰', 'Empathie' : 'Empathie 🫂', 'Sociale' : 'Sociale 🫂', 'Flux Obscur' : 'Flux Obscur ⚫', 'Voile Obscur' : 'Voile Obscur ⚫', 'Magie' : 'Magie 🪄', 'Psychique' : 'Psychique 🧠', 'Physique' : 'Physique 💪', 'Corporelle' : 'Corporelle💪', 'Technologie' : 'Technologie ⚙️', // Diverses icônes 'Baguette' : 'Baguette 🪄 ', 'Escalier' : 'Escalier 🪜 ', //'Baie' : 'Baie 🫐', //'Arbre' : 'Arbre 🌳', //'Fleur' : 'Fleur 🌷', 'Zone de ténèbres' : 'Zone de ténèbres 🌫️', 'Porte' : 'Porte 🚪', '':'' }; const tagsWhitelist = ['PRE', 'BLOCKQUOTE', 'CODE', 'INPUT', 'BUTTON', 'TEXTAREA']; function prepareRegex(string) { return string.replace(/(\({2}|([\[\]\^\&\$\.\?\/\\\+\{\}])|\)$)/g, '\\$1'); } function isTagOk(tag) { return tagsWhitelist.indexOf(tag) === -1; } function enhanceText() { 'use strict'; // enclenchement des remplacements et ajouts d'icones var regexs = [], replacements = [], rIsRegexp = /^\/(.+)\/([gim]+)?$/, word, text, texts, i, userRegexp; for (word in words) { if ( typeof word === 'string' && words.hasOwnProperty(word) ) { userRegexp = word.match(rIsRegexp); // add the search/needle/query if (userRegexp) { regexs.push(new RegExp(userRegexp[1], 'g')); } else { regexs.push( new RegExp(prepareRegex(word).replace(/\\?\*/g, function (fullMatch) { return fullMatch === '\\*' ? '*' : '[^ ]*'; }), 'g') ); } replacements.push(words[word]); } } texts = document.evaluate('//body//text()[ normalize-space(.) != "" ]', document, null, 6, null); for (i = 0; text = texts.snapshotItem(i); i += 1) { if ( tagsWhitelist.indexOf(text.parentNode.tagName) ) { regexs.forEach(function (value, index) { text.data = text.data.replace( value, replacements[index] ); }); } } }; $( document ).ready(function() { enhanceText(); }); };