TerriX Executor v2.7

Automated Pro-Play Suite. Introduces GodBot v1.0 for testing automated win-path strategies.

Vous devrez installer une extension telle que Tampermonkey, Greasemonkey ou Violentmonkey pour installer ce script.

Vous devrez installer une extension telle que Tampermonkey pour installer ce script.

Vous devrez installer une extension telle que Tampermonkey ou Violentmonkey pour installer ce script.

Vous devrez installer une extension telle que Tampermonkey ou Userscripts pour installer ce script.

Vous devrez installer une extension telle que Tampermonkey pour installer ce script.

Vous devrez installer une extension de gestionnaire de script utilisateur pour installer ce script.

(J'ai déjà un gestionnaire de scripts utilisateur, laissez-moi l'installer !)

Vous devrez installer une extension telle que Stylus pour installer ce style.

Vous devrez installer une extension telle que Stylus pour installer ce style.

Vous devrez installer une extension telle que Stylus pour installer ce style.

Vous devrez installer une extension du gestionnaire de style pour utilisateur pour installer ce style.

Vous devrez installer une extension du gestionnaire de style pour utilisateur pour installer ce style.

Vous devrez installer une extension du gestionnaire de style pour utilisateur pour installer ce style.

(J'ai déjà un gestionnaire de style utilisateur, laissez-moi l'installer!)

// ==UserScript==
// @name         TerriX Executor v2.7
// @namespace    http://tampermonkey.net/
// @version      2.7.1
// @description  Automated Pro-Play Suite. Introduces GodBot v1.0 for testing automated win-path strategies.
// @author       Assistant
// @match        *://territorial.io/*
// @match        *://everythingtt.github.io/TerriX-Client/*
// @grant        none
// @run-at       document-start
// ==/UserScript==

(function() {
    'use strict';

    // --- 1. SCRIPT LIBRARY (The GodBot Core) ---
    const SCRIPT_LIB = {
        GodBot: `/* GodBot v1.0: Automated Strategy Engine */
if(!window.godbot_loop) {
    window.godbot_loop = setInterval(() => {
        const G = window.G;
        if (!G || !G.b8 || !G.ag) return;
        
        const myId = G.aD.ep;
        const myTroops = G.ag.h7[myId];
        const myPixels = G.gt[myId];
        
        // 1. Check if we are alive
        if (G.ag.mz[myId] === 0) return;

        // 2. Expansion Phase (Neutral Land)
        const neutralId = G.aD.f2;
        if (myTroops > (myPixels * 2.5)) { // Only attack if above Interest Floor
            console.log("GodBot: Expanding...");
            G.b8.hV.hc(250, neutralId); // 25% Wave
        }

        // 3. Combat Phase (Neighbor Scan)
        if (myTroops > (myPixels * 5)) { // High Aggression Threshold
            let targetId = -1;
            let minPixels = Infinity;

            for (let i = 0; i < G.aD.f2; i++) {
                if (i !== myId && G.ag.mz[i] !== 0) {
                    if (G.ag.gt[i] < minPixels && G.ag.gt[i] > 0) {
                        minPixels = G.ag.gt[i];
                        targetId = i;
                    }
                }
            }

            if (targetId !== -1) {
                console.log("GodBot: Aggressing Weakest Enemy: " + G.ag.zU[targetId]);
                G.b8.hV.hc(150, targetId); // 15% Precise Poke
            }
        }
        
        // 4. Auto-Diplomacy (Peace Voting)
        if (myPixels > (G.aD.kA * 0.51)) { // If we own >51% of land
             G.b8.hV.ht(1); // Vote Peace
        }

    }, 1200);
    alert("GodBot v1.0 [ALPHA] Started. Win logic initialized.");
} else { clearInterval(window.godbot_loop); window.godbot_loop = null; alert("GodBot Stopped."); }`,

        ThreatRadar: `/* Ship Detection */
if(!window.radar_loop) {
    window.radar_loop = setInterval(() => {
        const { bN, aD } = window.G;
        const myId = aD.ep;
        for(let i=0; i < bN.y.mG; i++) {
            if((bN.y.mK[i] >> 3) === myId) {
                document.getElementById('tx-header').style.background = 'red';
                setTimeout(() => document.getElementById('tx-header').style.background = '', 200);
            }
        }
    }, 500);
    alert("Radar Enabled");
} else { clearInterval(window.radar_loop); window.radar_loop = null; alert("Radar Disabled"); }`
    };

    // --- 2. UI STYLES ---
    const style = document.createElement('style');
    style.innerHTML = `
        #tx-wrapper { position: fixed; top: 0; left: 0; width: 0; height: 0; z-index: 2147483647; font-family: 'system-ui', sans-serif; }
        #tx-gui {
            position: fixed; top: 100px; left: 100px; width: 680px; height: 480px;
            background: rgba(0, 0, 0, 0.95); border: 1.8px solid white; 
            display: none; flex-direction: column; color: white; box-shadow: 10px 10px 0px rgba(0,0,0,0.5);
        }
        #tx-header { padding: 12px 20px; background: rgba(30, 30, 30, 1); display: flex; justify-content: space-between; cursor: move; border-bottom: 1.8px solid white; font-weight: bold; }
        #tx-body { display: flex; flex: 1; overflow: hidden; }
        #tx-sidebar { width: 160px; background: rgba(15, 15, 15, 1); border-right: 1.8px solid white; padding: 15px; display: flex; flex-direction: column; gap: 10px; }
        #tx-main { flex: 1; display: flex; flex-direction: column; padding: 15px; background: #000; }
        #tx-editor { flex: 1; background: #050505; color: #00ff00; border: 1.5px solid #333; padding: 15px; font-family: 'Consolas', monospace; resize: none; outline: none; font-size: 13px; }
        .tx-btn { padding: 8px; background: rgba(50, 50, 50, 0.9); border: 1.8px solid white; color: white; cursor: pointer; font-size: 11px; font-weight: bold; }
        .tx-btn:hover { background: #444; border-color: #00ff00; }
        .tx-btn.active { background: #006400; }
        #tx-toggle { position: fixed; top: 0; left: 50%; transform: translateX(-50%); padding: 5px 30px; background: #005000; color: white; border: 1.8px solid white; border-top: none; border-radius: 0 0 10px 10px; cursor: pointer; font-weight: bold; z-index: 1000003; font-size: 10px;}
        .script-item { background: #111; border: 1.8px solid white; padding: 10px; display: flex; justify-content: space-between; align-items: center; margin-bottom: 5px;}
        
        .bar-row { display: flex; align-items: center; gap: 10px; height: 28px; width: 100%; flex-shrink: 0; }
        .bar-rank { width: 35px; font-size: 12px; color: #777; font-weight: bold; text-align: right; }
        .bar-name { width: 140px; font-size: 12px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; color: #eee; }
        .bar-track { flex: 1; background: #111; height: 16px; border: 1px solid #333; position: relative; }
        .bar-fill { height: 100%; width: 0%; background: #2e7d32; transition: width 0.4s ease; border-right: 2px solid #fff; }
        .bar-val { position: absolute; right: 5px; font-size: 10px; color: white; line-height: 16px; font-weight: bold;}
        .me-row { color: #ffd700 !important; }
        .me-row .bar-fill { background: #ffd700; border: 1px solid white; }
    `;
    document.documentElement.appendChild(style);

    // --- 3. LOGIC & UI ---
    const build = () => {
        const wrapper = document.createElement('div');
        wrapper.id = 'tx-wrapper';
        wrapper.innerHTML = `
            <div id="tx-toggle">TERRIX MENU</div>
            <div id="tx-gui">
                <div id="tx-header"><span>TERRIX <span style="color:#00ff00">PRO</span></span> <span id="tx-close" style="cursor:pointer">✕</span></div>
                <div id="tx-body">
                    <div id="tx-sidebar">
                        <button class="tx-btn active" id="nav-editor">EDITOR</button>
                        <button class="tx-btn" id="nav-chart">POWER INDEX</button>
                        <button class="tx-btn" id="nav-scripts">GOD BOT</button>
                        <button class="tx-btn" style="margin-top:auto; border-color:#3a47ff" onclick="window.open('https://everythingtt.github.io/TerriX-Client/Territorial.io.html')">🚀 CLIENT</button>
                        <button class="tx-btn" id="tx-hook" style="background:#4b3214">INJECT HOOK</button>
                    </div>
                    <div id="tx-main">
                        <textarea id="tx-editor" spellcheck="false">/* TerriX Code Executor */</textarea>
                        <div id="tx-chart" style="display:none; flex-direction:column; gap:5px; overflow-y:auto;"></div>
                        <div id="tx-scripts" style="display:none; flex-direction:column; gap:5px; overflow-y:auto;">
                            <div class="script-item"><span style="color:gold; font-weight:bold;">GodBot v1.0</span><button class="tx-btn" onclick="tx_load('GodBot')">LOAD</button></div>
                            <div class="script-item"><span>Ship Radar</span><button class="tx-btn" onclick="tx_load('ThreatRadar')">LOAD</button></div>
                        </div>
                    </div>
                </div>
                <div style="padding: 10px 20px; background: #0a0a0a; display: flex; justify-content: space-between; border-top: 1.8px solid white;">
                    <button class="tx-btn" style="background:#008000; border:none; padding: 5px 20px;" id="tx-execute">EXECUTE</button>
                    <div id="tx-stat" style="font-size: 10px; color: #555;">STATUS: <span style="color:#f44">OFFLINE</span></div>
                </div>
            </div>
        `;
        document.documentElement.appendChild(wrapper);

        const gui = document.getElementById('tx-gui');
        document.getElementById('tx-toggle').onclick = () => gui.style.display = gui.style.display === 'flex' ? 'none' : 'flex';
        document.getElementById('tx-close').onclick = () => gui.style.display = 'none';

        const tabs = [document.getElementById('tx-editor'), document.getElementById('tx-chart'), document.getElementById('tx-scripts')];
        const navs = ['nav-editor', 'nav-chart', 'nav-scripts'];

        navs.forEach((id, i) => {
            document.getElementById(id).onclick = () => {
                navs.forEach(n => document.getElementById(n).classList.remove('active'));
                tabs.forEach(t => t.style.display = 'none');
                document.getElementById(id).classList.add('active');
                tabs[i].style.display = i === 0 ? 'block' : 'flex';
            };
        });

        document.getElementById('tx-hook').onclick = function() {
            if (window.G) {
                this.innerText = "HOOKED"; this.style.background = "green";
                document.getElementById('tx-stat').innerHTML = "HOOKED: <span style='color:lime'>ACTIVE</span>";
            } else alert("Error: Use TerriX Client for GodBot features.");
        };

        document.getElementById('tx-execute').onclick = () => { try { eval(document.getElementById('tx-editor').value); } catch(e) { alert(e); } };
        window.tx_load = (k) => { document.getElementById('tx-editor').value = SCRIPT_LIB[k]; document.getElementById('nav-editor').click(); };

        let d = false, x, y;
        document.getElementById('tx-header').onmousedown = (e) => { d = true; x = e.clientX - gui.offsetLeft; y = e.clientY - gui.offsetTop; };
        window.onmousemove = (e) => { if (d) { gui.style.left = (e.clientX - x) + 'px'; gui.style.top = (e.clientY - y) + 'px'; } };
        window.onmouseup = () => d = false;
    };

    build();

    // --- 4. LEADERBOARD ---
    const bars = {};
    setInterval(() => {
        const container = document.getElementById('tx-chart');
        if (!container || container.style.display !== 'flex' || !window.G) return;
        const { ag, aD } = window.G;
        let players = [];
        for (let i = 0; i < 512; i++) {
            if (ag.gt[i] > 0) {
                const score = (ag.gt[i] * 10) + (ag.h7[i] / 50);
                players.push({ id: i, name: ag.zU[i] || "Bot", val: score, isMe: i === aD.ep });
            }
        }
        players.sort((a, b) => b.val - a.val);
        const top = players.slice(0, 15);
        const max = top[0]?.val || 1;

        top.forEach((p, idx) => {
            if (!bars[p.id]) {
                const r = document.createElement('div');
                r.className = 'bar-row';
                r.innerHTML = `<div class="bar-rank"></div><div class="bar-name"></div><div class="bar-track"><div class="bar-fill"></div><span class="bar-val"></span></div>`;
                container.appendChild(r);
                bars[p.id] = r;
            }
            const r = bars[p.id];
            r.style.display = 'flex'; r.style.order = idx;
            r.className = p.isMe ? 'bar-row me-row' : 'bar-row';
            r.querySelector('.bar-rank').innerText = "#" + (idx + 1);
            r.querySelector('.bar-name').innerText = p.name;
            r.querySelector('.bar-fill').style.width = (p.val / max * 100) + '%';
            r.querySelector('.bar-val').innerText = Math.floor(p.val).toLocaleString();
        });
        Object.keys(bars).forEach(id => { if (!top.find(p => p.id == id)) bars[id].style.display = 'none'; });
    }, 500);

})();