Greasy Fork

Contador de tropas

Muestra tropas defensivas u ofensivas con imágenes actualizadas y permite copiar el listado filtrado en un formato específico para mensajes en Grepolis.

// ==UserScript==
// @name         Contador de tropas
// @namespace    http://tampermonkey.net/
// @version      3.5
// @license MIT
// @description  Muestra tropas defensivas u ofensivas con imágenes actualizadas y permite copiar el listado filtrado en un formato específico para mensajes en Grepolis.
// @author       Tu Nombre
// @match        https://*.grepolis.com/game/*
// @grant        GM_addStyle
// @grant        GM_setClipboard
// ==/UserScript==

(function() {
    'use strict';

    const uw = unsafeWindow;

    // CSS para la ventana
    GM_addStyle(`
        #GTM_button {
            margin-bottom: 3px;
            cursor: pointer;
        }
        #GTM_window {
            display: none;
            width: 600px;
            z-index: 1100;
            position: absolute;
            top: 100px;
            left: 30vw;
            text-align: center;
            background-color: #f0e6d6;
            border: 2px solid black;
            border-radius: 10px;
            padding: 10px;
        }
        #GTM_close {
            float: right;
            margin-top: -20px;
            cursor: pointer;
            font-size: 18px;
        }
        .GTM_unit {
            display: inline-block;
            margin: 5px;
            text-align: center;
        }
        .GTM_unit img {
            width: 40px;
            height: 40px;
            display: block;
            margin: 0 auto;
        }
        .GTM_unit span {
            display: block;
            margin-top: 5px;
            font-weight: bold;
        }
        .GTM_total {
            font-weight: bold;
            color: red;
            margin-top: 10px;
        }
        #GTM_message_button {
            margin-top: 10px;
            cursor: pointer;
            padding: 5px 10px;
            background-color: #4CAF50;
            color: white;
            border: none;
            border-radius: 5px;
            font-size: 14px;
        }
        #GTM_message_button:hover {
            background-color: #45a049;
        }
        #GTM_filters {
            margin-bottom: 10px;
        }
        .GTM_filter_button {
            cursor: pointer;
            padding: 5px 10px;
            background-color: #4CAF50;
            color: white;
            border: none;
            border-radius: 5px;
            font-size: 14px;
            margin-right: 5px;
        }
        .GTM_filter_button.active {
            background-color: #45a049;
        }
        .GTM_filter_button:hover {
            background-color: #45a049;
        }
    `);

    // Mapeo de unidades defensivas y ofensivas con sus nombres en español e imágenes actualizadas
    const defensiveUnits = {
        "sword": { name: "Espadachín", img: "https://imgur.com/SUCgJU3.png" },
        "archer": { name: "Arquero", img: "https://i.imgur.com/xLOtNgs.png" },
        "hoplite": { name: "Hoplita", img: "https://imgur.com/fjjL6GT.png" },
        "chariot": { name: "Carro", img: "https://i.imgur.com/GpLHnv3.png" },
        "bireme": { name: "Birreme", img: "https://i.imgur.com/kLQCM99.png" },
        "trireme": { name: "Trirreme", img: "https://i.imgur.com/0YlGkCP.png" },
        "fire_ship": { name: "Brulote", img: "https://i.imgur.com/JNfJ3h0.png" }
    };

    const offensiveUnits = {
        "slinger": { name: "Hondero", img: "https://imgur.com/SEgKJTm.png" },
        "rider": { name: "Caballero", img: "https://imgur.com/mFnNJ0E.png" },
        "catapult": { name: "Catapulta", img: "https://i.imgur.com/oFEOsXo.png" },
        "harpy": { name: "Arpía", img: "https://i.imgur.com/PA4uFbi.png" },
        "griffin": { name: "Grifo", img: "https://i.imgur.com/EHb10e5.png" },
        "manticore": { name: "Mantícora", img: "https://i.imgur.com/ttR3Q8x.png" },
        "hydra": { name: "Hidra", img: "https://i.imgur.com/bQTnQv1.png" },
        "flame_ship": { name: "Lanzallamas", img: "https://i.imgur.com/43NVBNT.png" },
        "attack_ship": { name: "Nave Incendiaria", img: "https://i.imgur.com/Y5WorTq.png" },
        "trireme": { name: "Trirreme", img: "https://i.imgur.com/0YlGkCP.png" }
    };

    let currentFilter = 'defensive';

    // Función para extraer la información de las tropas según el filtro
    function getTroopData() {
        let troopData = {};
        try {
            const player_towns = uw.ITowns.towns;
            for (let townId in player_towns) {
                if (player_towns.hasOwnProperty(townId)) {
                    const town = player_towns[townId];
                    const units = town.units();
                    for (let unit in units) {
                        if (units.hasOwnProperty(unit) && units[unit] > 0) {
                            const unitList = currentFilter === 'defensive' ? defensiveUnits : offensiveUnits;
                            if (unitList[unit]) {
                                if (!troopData[unit]) troopData[unit] = 0;
                                troopData[unit] += units[unit];
                            }
                        }
                    }
                }
            }
        } catch (e) {
            console.error("Error while fetching troop data:", e);
        }
        return troopData;
    }

    // Función para generar el mensaje de texto
    function generateMessageText(troopData) {
        let messageText = 'Tengo las siguientes tropas:\n';
        const unitList = currentFilter === 'defensive' ? defensiveUnits : offensiveUnits;
        for (let unit in unitList) {
            if (troopData.hasOwnProperty(unit)) {
                messageText += `${unitList[unit].name}: ${troopData[unit]}\n`;
            }
        }
        return messageText;
    }

    // Función para copiar el texto al portapapeles
    function copyToClipboard(troopData) {
        const messageText = generateMessageText(troopData);
        GM_setClipboard(messageText, 'text');
        alert('El texto ha sido copiado al portapapeles.');
    }

    // Función para mostrar la ventana con las tropas
    function displayTroopManager() {
        let troopData = getTroopData();
        let troopHtml = '';
        const unitList = currentFilter === 'defensive' ? defensiveUnits : offensiveUnits;

        for (let unit in unitList) {
            if (troopData.hasOwnProperty(unit)) {
                troopHtml += `
                    <div class="GTM_unit">
                        <img src="${unitList[unit].img}" alt="${unitList[unit].name}">
                        <span>${unitList[unit].name}</span>
                        <span>${troopData[unit]}</span>
                    </div>`;
            }
        }

        let windowHtml = `
            <div id="GTM_window">
                <span id="GTM_close">✖</span>
                <h2>Grepolis Troop Manager</h2>
                <div id="GTM_filters">
                    <button id="GTM_defensive_button" class="GTM_filter_button active">Tropas Defensivas</button>
                    <button id="GTM_offensive_button" class="GTM_filter_button">Tropas Ofensivas</button>
                </div>
                <div>${troopHtml}</div>
                <button id="GTM_message_button">Copiar en Portapapeles</button>
            </div>`;

        // Eliminar ventana previa si existe
        const existingWindow = document.getElementById('GTM_window');
        if (existingWindow) existingWindow.remove();

        // Añadir la nueva ventana al cuerpo del documento
        document.body.insertAdjacentHTML('beforeend', windowHtml);

        // Mostrar la ventana
        document.getElementById('GTM_window').style.display = 'block';

        // Funcionalidad del botón de cierre
        document.getElementById('GTM_close').addEventListener('click', function() {
            document.getElementById('GTM_window').style.display = 'none';
        });

        // Funcionalidad del botón de copiar en portapapeles
        document.getElementById('GTM_message_button').addEventListener('click', function() {
            copyToClipboard(troopData);
        });

        // Funcionalidad de los botones de filtro
        document.getElementById('GTM_defensive_button').addEventListener('click', function() {
            currentFilter = 'defensive';
            updateFilterButtons();
            displayTroopManager();
        });

        document.getElementById('GTM_offensive_button').addEventListener('click', function() {
            currentFilter = 'offensive';
            updateFilterButtons();
            displayTroopManager();
        });
    }

    // Función para actualizar los botones de filtro
    function updateFilterButtons() {
        document.getElementById('GTM_defensive_button').classList.toggle('active', currentFilter === 'defensive');
        document.getElementById('GTM_offensive_button').classList.toggle('active', currentFilter === 'offensive');
    }

    // Función para añadir el botón de Troop Manager a la interfaz principal
    function addButton() {
        const buttonHtml = `<li id="GTM_button"><span class="content_wrapper"><span class="button_wrapper"><span class="button"><span class="icon"></span></span></span><span class="name_wrapper"><span class="name">Troops</span></span></span></li>`;
        const menu = document.querySelector("#ui_box > div.nui_main_menu > div.middle > div.content > ul");
        menu.insertAdjacentHTML('beforeend', buttonHtml);

        // Añadir evento al botón
        document.getElementById('GTM_button').addEventListener('click', displayTroopManager);
    }

    // Iniciar el script después de que la página cargue
    window.addEventListener('load', function() {
        addButton();
    });
})();