Capybara Clicker

inf click, inf upgrades

이 스크립트를 설치하려면 Tampermonkey, Greasemonkey 또는 Violentmonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey와 같은 확장 프로그램을 설치해야 합니다.

이 스크립트를 설치하려면 Tampermonkey 또는 Violentmonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey 또는 Userscripts와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 유저 스크립트 관리자 확장 프로그램이 필요합니다.

(이미 유저 스크립트 관리자가 설치되어 있습니다. 설치를 진행합니다!)

Advertisement:

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

(이미 유저 스타일 관리자가 설치되어 있습니다. 설치를 진행합니다!)

Advertisement:

// ==UserScript==
// @name         Capybara Clicker
// @namespace    http://tampermonkey.net/
// @version      4.3
// @description  inf click, inf upgrades
// @author       Gemini
// @match        https://capybara-game.com/
// @grant        none
// @run-at       document-start
// ==/UserScript==

(function() {
    'use strict';

    // 1. Storage Keys Helper
    const UPGRADE_KEYS = [
        'upgrade_1', 'upgrade_2', 'upgrade_3', 'upgrade_4', 'upgrade_5', 
        'upgrade_6', 'upgrade_7', 'upgrade_8', 'upgrade_9', 'upgrade_10',
        'upg_1', 'upg_2', 'upg_3', 'upg_4', 'upg_5', 'upg_6', 'upg_7', 'upg_8'
    ];

    // Read existing storage or provide reasonable defaults if empty
    let currentLevel = localStorage.getItem('upgrade_1') || '999';
    let currentCash = localStorage.getItem('number_capybaras') || '100000000000';
    let currentClicks = localStorage.getItem('number_click') || '1000';

    // 2. LocalStorage Interceptor Engine
    const originalGetItem = Storage.prototype.getItem;
    const originalSetItem = Storage.prototype.setItem;

    Storage.prototype.getItem = function(key) {
        // Intercept values live as the game requests them
        if (key === 'number_capybaras') return originalGetItem.call(localStorage, 'number_capybaras') || currentCash;
        if (key === 'capyparas_earned') return originalGetItem.call(localStorage, 'capyparas_earned') || currentCash;
        if (key === 'number_click') return originalGetItem.call(localStorage, 'number_click') || currentClicks;

        // Auto unlock achievements and skins
        if (key.startsWith('achiev_') || key.startsWith('skin_')) {
            return '1';
        }

        // Target upgrades via wildcard search
        if (key.toLowerCase().includes('upgrade') || key.toLowerCase().includes('upg')) {
            return originalGetItem.call(localStorage, 'upgrade_1') || currentLevel;
        }

        return originalGetItem.apply(this, arguments);
    };

    Storage.prototype.setItem = function(key, value) {
        return originalSetItem.apply(this, arguments);
    };

    // 3. Inject GUI
    function injectGUI() {
        if (document.getElementById('capy-god-menu')) return;

        const menu = document.createElement('div');
        menu.id = 'capy-god-menu';
        menu.style = `
            position: fixed; top: 15px; left: 15px; width: 280px;
            background: rgba(10, 10, 10, 0.98); color: #fff; font-family: system-ui, -apple-system, sans-serif;
            border: 2px solid #ffcc00; border-radius: 10px; z-index: 10000000;
            box-shadow: 0 0 20px rgba(255, 204, 0, 0.4); font-size: 13px; overflow: hidden;
        `;

        menu.innerHTML = `
            <div id="capy-drag-header" style="background: linear-gradient(90deg, #ffcc00, #ff6600); padding: 12px; cursor: move; font-weight: bold; text-align: center; letter-spacing: 1px; color: #000;">
                👑 OpenSource Capybara Clicker
            </div>
            <div style="padding: 15px; display: flex; flex-direction: column; gap: 12px;">
                
                <div>
                    <label style="display: block; margin-bottom: 4px; color: #ffcc00; font-weight: bold;">All Upgrades Level:</label>
                    <input type="number" id="target-level-input" value="${currentLevel}" style="width: 100%; padding: 6px; background: #222; border: 1px solid #444; color: #fff; border-radius: 4px; font-family: monospace; font-size: 14px; box-sizing: border-box;">
                </div>

                <div>
                    <label style="display: block; margin-bottom: 4px; color: #aaa;">Capybara Balance:</label>
                    <input type="text" id="target-cash-input" value="${currentCash}" style="width: 100%; padding: 6px; background: #222; border: 1px solid #444; color: #fff; border-radius: 4px; font-family: monospace; font-size: 14px; box-sizing: border-box;">
                </div>

                <div>
                    <label style="display: block; margin-bottom: 4px; color: #aaa;">Total Clicks:</label>
                    <input type="number" id="target-clicks-input" value="${currentClicks}" style="width: 100%; padding: 6px; background: #222; border: 1px solid #444; color: #fff; border-radius: 4px; font-family: monospace; font-size: 14px; box-sizing: border-box;">
                </div>

                <button id="btn-apply" style="background: #ffcc00; color: #000; border: none; padding: 10px; border-radius: 4px; cursor: pointer; font-weight: bold; width: 100%; margin-top: 5px; transition: 0.2s;">
                    Apply modifications & Reload
                </button>
            </div>
        `;

        document.body.appendChild(menu);

        const levelInput = document.getElementById('target-level-input');
        const cashInput = document.getElementById('target-cash-input');
        const clicksInput = document.getElementById('target-clicks-input');
        const applyBtn = document.getElementById('btn-apply');

        applyBtn.addEventListener('click', () => {
            const typedLevel = levelInput.value.trim() || "0";
            const typedCash = cashInput.value.trim() || "0";
            const typedClicks = clicksInput.value.trim() || "0";

            localStorage.setItem('number_capybaras', typedCash);
            localStorage.setItem('capyparas_earned', typedCash);
            localStorage.setItem('number_click', typedClicks);

            UPGRADE_KEYS.forEach(k => {
                localStorage.setItem(k, typedLevel);
            });

            window.location.reload();
        });

        // Window Dragging Controls
        let isDragging = false, startX, startY, initialX, initialY;
        const header = document.getElementById('capy-drag-header');
        
        header.addEventListener('mousedown', (e) => {
            isDragging = true;
            startX = e.clientX; startY = e.clientY;
            initialX = menu.offsetLeft; initialY = menu.offsetTop;
        });
        
        document.addEventListener('mousemove', (e) => {
            if (!isDragging) return;
            menu.style.left = (initialX + (e.clientX - startX)) + 'px';
            menu.style.top = (initialY + (e.clientY - startY)) + 'px';
        });
        
        document.addEventListener('mouseup', () => isDragging = false);
    }

    if (document.readyState === 'loading') {
        document.addEventListener('DOMContentLoaded', injectGUI);
    } else {
        injectGUI();
    }
})();