Omoggle Mog Master (Passcode Protected)

Passcode-protected menu with Always Mog feature + visual enhancements

スクリプトをインストールするには、Tampermonkey, GreasemonkeyViolentmonkey のような拡張機能のインストールが必要です。

You will need to install an extension such as Tampermonkey to install this script.

スクリプトをインストールするには、TampermonkeyViolentmonkey のような拡張機能のインストールが必要です。

スクリプトをインストールするには、TampermonkeyUserscripts のような拡張機能のインストールが必要です。

このスクリプトをインストールするには、Tampermonkeyなどの拡張機能をインストールする必要があります。

このスクリプトをインストールするには、ユーザースクリプト管理ツールの拡張機能をインストールする必要があります。

(ユーザースクリプト管理ツールは設定済みなのでインストール!)

このスタイルをインストールするには、Stylusなどの拡張機能をインストールする必要があります。

このスタイルをインストールするには、Stylus などの拡張機能をインストールする必要があります。

このスタイルをインストールするには、Stylus tなどの拡張機能をインストールする必要があります。

このスタイルをインストールするには、ユーザースタイル管理用の拡張機能をインストールする必要があります。

このスタイルをインストールするには、ユーザースタイル管理用の拡張機能をインストールする必要があります。

このスタイルをインストールするには、ユーザースタイル管理用の拡張機能をインストールする必要があります。

(ユーザースタイル管理ツールは設定済みなのでインストール!)

このスクリプトの質問や評価の投稿はこちら通報はこちらへお寄せください
// ==UserScript==
// @name         Omoggle Mog Master (Passcode Protected)
// @namespace    http://tampermonkey.net/
// @version      2.0
// @description  Passcode-protected menu with Always Mog feature + visual enhancements
// @author       Assistant
// @match        https://www.omoggle.com/*
// @match        https://omoggle.com/*
// @grant        GM_setValue
// @grant        GM_getValue
// @grant        GM_deleteValue
// @license      MIT
// ==/UserScript==

(function() {
    'use strict';

    const PASSCODE = "Demo123";
    let isUnlocked = false;
    let mogInterval = null;
    let originalScore = null;

    // ========== CONFIGURATION (Only editable after unlock) ==========
    let CONFIG = {
        autoQueue: true,
        queueDelaySecs: 1.2,
        alwaysMog: true,        // ALWAYS make you mog them (your score > their score)
        mogBuffer: 1.5,         // Your score will be opponent's score + this amount
        visualSpoof: true,      // Spoof your displayed score to look higher
        customScore: 9.5,       // Your custom displayed score if visualSpoof is on
        autoSkipLow: false,      // Auto-skip matches where opponent score is below X
        skipThreshold: 6.0,
        godMode: false,          // Experimental: attempt to intercept rating requests
    };
    // ================================================================

    // Create passcode modal
    function createPasscodeModal() {
        const modal = document.createElement('div');
        modal.id = 'omoggle-passcode-modal';
        modal.innerHTML = `
            <div style="
                position: fixed;
                top: 0;
                left: 0;
                width: 100%;
                height: 100%;
                background: rgba(0,0,0,0.9);
                backdrop-filter: blur(8px);
                z-index: 10000;
                display: flex;
                justify-content: center;
                align-items: center;
                font-family: 'Segoe UI', Arial, sans-serif;
            ">
                <div style="
                    background: linear-gradient(135deg, #1a1a2e 0%, #16213e 100%);
                    border-radius: 20px;
                    padding: 40px;
                    width: 320px;
                    text-align: center;
                    border: 1px solid rgba(255,215,0,0.3);
                    box-shadow: 0 20px 60px rgba(0,0,0,0.5);
                ">
                    <div style="font-size: 48px; margin-bottom: 10px;">👑</div>
                    <h2 style="color: gold; margin: 0 0 10px 0;">Omoggle Mog Master</h2>
                    <p style="color: #aaa; font-size: 12px; margin-bottom: 25px;">Enter passcode to access secret menu</p>
                    <input type="password" id="mog-passcode-input" placeholder="Enter Passcode" style="
                        width: 100%;
                        padding: 12px;
                        background: rgba(255,255,255,0.1);
                        border: 1px solid rgba(255,215,0,0.5);
                        border-radius: 8px;
                        color: white;
                        font-size: 14px;
                        text-align: center;
                        margin-bottom: 15px;
                        outline: none;
                    ">
                    <button id="mog-submit-btn" style="
                        width: 100%;
                        padding: 12px;
                        background: linear-gradient(90deg, gold, #ff8c00);
                        border: none;
                        border-radius: 8px;
                        color: #1a1a2e;
                        font-weight: bold;
                        cursor: pointer;
                        font-size: 14px;
                        transition: transform 0.2s;
                    ">UNLOCK 🔓</button>
                    <p style="color: #666; font-size: 11px; margin-top: 20px;">Hint: ${PASSCODE[0]}***${PASSCODE.slice(-2)}</p>
                </div>
            </div>
        `;
        document.body.appendChild(modal);

        const input = document.getElementById('mog-passcode-input');
        const button = document.getElementById('mog-submit-btn');

        const checkPasscode = () => {
            if (input.value === PASSCODE) {
                modal.remove();
                isUnlocked = true;
                createMogMenu();
                startMogFeatures();
                saveUnlockState();
            } else {
                input.style.borderColor = '#ff4444';
                input.style.animation = 'shake 0.3s ease-in-out';
                setTimeout(() => {
                    input.style.animation = '';
                }, 300);
            }
        };

        button.addEventListener('click', checkPasscode);
        input.addEventListener('keypress', (e) => {
            if (e.key === 'Enter') checkPasscode();
        });

        // Add shake animation
        const style = document.createElement('style');
        style.textContent = `
            @keyframes shake {
                0%, 100% { transform: translateX(0); }
                25% { transform: translateX(-5px); }
                75% { transform: translateX(5px); }
            }
        `;
        document.head.appendChild(style);
    }

    // Save unlock state (lasts until page refresh)
    function saveUnlockState() {
        try {
            GM_setValue('omoggle_unlocked', 'true');
        } catch(e) { /* ignore if GM functions not available */ }
    }

    // Create the mog menu HTML
    function createMogMenu() {
        const menu = document.createElement('div');
        menu.id = 'mog-master-menu';
        menu.innerHTML = `
            <div style="
                position: fixed;
                top: 80px;
                right: 10px;
                z-index: 9999;
                width: 280px;
                background: linear-gradient(135deg, #0f0f1a 0%, #1a1a2e 100%);
                border-radius: 16px;
                border: 1px solid rgba(255,215,0,0.4);
                box-shadow: 0 8px 32px rgba(0,0,0,0.4);
                font-family: 'Segoe UI', Arial, sans-serif;
                color: white;
                backdrop-filter: blur(10px);
            ">
                <div style="
                    padding: 15px;
                    border-bottom: 1px solid rgba(255,215,0,0.2);
                    background: rgba(255,215,0,0.1);
                    border-radius: 16px 16px 0 0;
                    display: flex;
                    align-items: center;
                    justify-content: space-between;
                ">
                    <div>
                        <span style="font-size: 20px;">👑 MOG MASTER</span>
                        <span style="font-size: 11px; margin-left: 8px; background: gold; color: black; padding: 2px 6px; border-radius: 10px;">UNLOCKED</span>
                    </div>
                    <button id="mog-menu-minimize" style="background: none; border: none; color: white; cursor: pointer; font-size: 18px;">−</button>
                </div>
                <div id="mog-menu-content" style="padding: 15px;">
                    <!-- Toggle: Always Mog -->
                    <div style="margin-bottom: 15px; background: rgba(255,255,255,0.05); padding: 10px; border-radius: 10px;">
                        <label style="display: flex; align-items: center; justify-content: space-between; cursor: pointer;">
                            <span><strong style="color: gold;">⚡ ALWAYS MOG</strong><br><span style="font-size: 10px; opacity: 0.7;">You will ALWAYS score higher</span></span>
                            <input type="checkbox" id="mog-toggle-alwaysmog" ${CONFIG.alwaysMog ? 'checked' : ''} style="width: 18px; height: 18px;">
                        </label>
                        <div id="mog-buffer-control" style="margin-top: 10px; ${!CONFIG.alwaysMog ? 'display: none;' : ''}">
                            <span style="font-size: 11px;">Mog Buffer: +${CONFIG.mogBuffer}</span>
                            <input type="range" id="mog-buffer-slider" min="0.5" max="3.0" step="0.1" value="${CONFIG.mogBuffer}" style="width: 100%; margin-top: 5px;">
                        </div>
                    </div>

                    <!-- Auto Queue -->
                    <div style="margin-bottom: 12px; display: flex; justify-content: space-between; align-items: center;">
                        <span>🤖 Auto Queue</span>
                        <input type="checkbox" id="mog-toggle-autoqueue" ${CONFIG.autoQueue ? 'checked' : ''}>
                    </div>

                    <!-- Visual Spoof -->
                    <div style="margin-bottom: 12px;">
                        <div style="display: flex; justify-content: space-between; align-items: center;">
                            <span>🎨 Visual Score Spoof</span>
                            <input type="checkbox" id="mog-toggle-visualspoof" ${CONFIG.visualSpoof ? 'checked' : ''}>
                        </div>
                        <div id="mog-spoof-control" style="margin-top: 8px; ${!CONFIG.visualSpoof ? 'display: none;' : ''}">
                            <input type="number" id="mog-custom-score" value="${CONFIG.customScore}" step="0.1" min="1" max="10" style="width: 100%; padding: 5px; background: #333; color: white; border: 1px solid gold; border-radius: 5px;">
                        </div>
                    </div>

                    <!-- Auto Skip Low Scores -->
                    <div style="margin-bottom: 12px;">
                        <div style="display: flex; justify-content: space-between; align-items: center;">
                            <span>⏭️ Auto Skip Low (< ${CONFIG.skipThreshold})</span>
                            <input type="checkbox" id="mog-toggle-autoskip" ${CONFIG.autoSkipLow ? 'checked' : ''}>
                        </div>
                        <div id="mog-skip-control" style="margin-top: 5px; ${!CONFIG.autoSkipLow ? 'display: none;' : ''}">
                            <input type="range" id="mog-skip-threshold" min="1" max="10" step="0.1" value="${CONFIG.skipThreshold}" style="width: 100%;">
                        </div>
                    </div>

                    <!-- Status / Stats -->
                    <div style="margin-top: 15px; padding-top: 10px; border-top: 1px solid rgba(255,255,255,0.1); font-size: 11px;">
                        <div id="mog-stats">📊 Ready to MOG</div>
                    </div>
                </div>
            </div>
        `;
        document.body.appendChild(menu);

        // Add event listeners
        document.getElementById('mog-toggle-alwaysmog')?.addEventListener('change', (e) => {
            CONFIG.alwaysMog = e.target.checked;
            document.getElementById('mog-buffer-control').style.display = CONFIG.alwaysMog ? 'block' : 'none';
            if (CONFIG.alwaysMog) startMogging();
            else stopMogging();
        });

        document.getElementById('mog-buffer-slider')?.addEventListener('input', (e) => {
            CONFIG.mogBuffer = parseFloat(e.target.value);
            document.querySelector('#mog-buffer-control span').innerText = `Mog Buffer: +${CONFIG.mogBuffer}`;
        });

        document.getElementById('mog-toggle-autoqueue')?.addEventListener('change', (e) => {
            CONFIG.autoQueue = e.target.checked;
        });

        document.getElementById('mog-toggle-visualspoof')?.addEventListener('change', (e) => {
            CONFIG.visualSpoof = e.target.checked;
            document.getElementById('mog-spoof-control').style.display = CONFIG.visualSpoof ? 'block' : 'none';
            if (CONFIG.visualSpoof) startVisualSpoof();
        });

        document.getElementById('mog-custom-score')?.addEventListener('change', (e) => {
            CONFIG.customScore = parseFloat(e.target.value);
        });

        document.getElementById('mog-toggle-autoskip')?.addEventListener('change', (e) => {
            CONFIG.autoSkipLow = e.target.checked;
            document.getElementById('mog-skip-control').style.display = CONFIG.autoSkipLow ? 'block' : 'none';
        });

        document.getElementById('mog-skip-threshold')?.addEventListener('input', (e) => {
            CONFIG.skipThreshold = parseFloat(e.target.value);
            document.querySelector('#mog-skip-control input').previousSibling.textContent = `Auto Skip Low (< ${CONFIG.skipThreshold.toFixed(1)})`;
        });

        document.getElementById('mog-menu-minimize')?.addEventListener('click', () => {
            const content = document.getElementById('mog-menu-content');
            if (content.style.display === 'none') {
                content.style.display = 'block';
                document.getElementById('mog-menu-minimize').textContent = '−';
            } else {
                content.style.display = 'none';
                document.getElementById('mog-menu-minimize').textContent = '+';
            }
        });
    }

    // CORE MOG FUNCTION: Intercept and modify PSL score display
    function startMogging() {
        if (mogInterval) clearInterval(mogInterval);

        mogInterval = setInterval(() => {
            if (!CONFIG.alwaysMog) return;

            // Find opponent's score and your score elements
            const scoreElements = document.querySelectorAll('[class*="score"], [class*="rating"], [class*="psl"]');
            let scores = [];

            scoreElements.forEach(el => {
                const text = el.innerText || el.textContent;
                const match = text?.match(/(\d+(?:\.\d+)?)/);
                if (match && parseFloat(match[1]) >= 1 && parseFloat(match[1]) <= 10) {
                    scores.push({ element: el, value: parseFloat(match[1]), text: text });
                }
            });

            // Typically there are 2 scores visible (yours and opponent's)
            if (scores.length >= 2) {
                // Sort by position or find which is opponent's (usually left/right)
                let yourScoreElem = null;
                let oppScoreElem = null;
                let yourScoreVal = null;
                let oppScoreVal = null;

                // Strategy: The lower score is usually the loser's
                const sorted = [...scores].sort((a,b) => a.value - b.value);
                
                // Assume you want to be the higher score
                if (CONFIG.alwaysMog) {
                    // Force your score to be displayed as higher
                    for (let i = 0; i < scores.length; i++) {
                        const score = scores[i];
                        // Find which element likely represents "your" score
                        const parentText = score.element.closest('div')?.innerText || '';
                        if (parentText.toLowerCase().includes('you') || parentText.toLowerCase().includes('your')) {
                            yourScoreElem = score.element;
                            yourScoreVal = score.value;
                        } else {
                            oppScoreElem = score.element;
                            oppScoreVal = score.value;
                        }
                    }

                    // If we couldn't identify, assume the lower is opponent's
                    if (!oppScoreElem && sorted.length >= 2) {
                        oppScoreElem = sorted[0].element;
                        oppScoreVal = sorted[0].value;
                        yourScoreElem = sorted[1].element;
                        yourScoreVal = sorted[1].value;
                    }

                    if (oppScoreElem && yourScoreElem) {
                        const newYourScore = (oppScoreVal + CONFIG.mogBuffer).toFixed(1);
                        if (parseFloat(newYourScore) > yourScoreVal) {
                            // Override the displayed score
                            const originalText = yourScoreElem.innerText;
                            const newText = originalText.replace(/\d+(?:\.\d+)?/, newYourScore);
                            yourScoreElem.innerText = newText;
                            updateMogStats(`MOGGED! ${oppScoreVal} → ${newYourScore}`);
                        }
                    }
                }
            }
        }, 500);
    }

    function stopMogging() {
        if (mogInterval) {
            clearInterval(mogInterval);
            mogInterval = null;
        }
    }

    function updateMogStats(message) {
        const statsDiv = document.getElementById('mog-stats');
        if (statsDiv) {
            statsDiv.innerHTML = `👑 ${message}`;
            setTimeout(() => {
                if (statsDiv.innerHTML.includes(message)) {
                    statsDiv.innerHTML = '📊 Active - MOG Mode ON';
                }
            }, 2000);
        }
    }

    function startVisualSpoof() {
        const observer = new MutationObserver(() => {
            if (!CONFIG.visualSpoof) return;

            const scoreSelectors = ['[class*="score"]', '[class*="rating"]', 'div', 'span'];
            scoreSelectors.forEach(selector => {
                document.querySelectorAll(selector).forEach(el => {
                    if (el.children.length > 0) return;
                    const text = el.innerText;
                    if (!text) return;

                    // Find your score (usually higher one or marked "you")
                    const scoreMatch = text.match(/(\d+(?:\.\d+)?)/);
                    if (scoreMatch && parseFloat(scoreMatch[1]) >= 1 && parseFloat(scoreMatch[1]) <= 10) {
                        const parent = el.closest('div');
                        if (parent && parent.innerText.toLowerCase().includes('you')) {
                            const newText = text.replace(scoreMatch[1], CONFIG.customScore.toFixed(1));
                            if (newText !== text) el.innerText = newText;
                        }
                    }
                });
            });
        });
        observer.observe(document.body, { childList: true, subtree: true, characterData: true });
    }

    function startAutoQueue() {
        setInterval(() => {
            if (CONFIG.autoQueue) {
                const buttons = document.querySelectorAll('button');
                for (const btn of buttons) {
                    if (btn.innerText.toLowerCase().includes('find new match') || 
                        btn.innerText.toLowerCase().includes('next')) {
                        btn.click();
                        break;
                    }
                }
            }
        }, CONFIG.queueDelaySecs * 1000);
    }

    function checkAutoSkip() {
        if (!CONFIG.autoSkipLow) return;

        const observer = new MutationObserver(() => {
            const pageText = document.body.innerText;
            const scoreMatch = pageText.match(/(?:opponent|their|theirs?)\s*score:?\s*(\d+(?:\.\d+)?)/i);
            if (scoreMatch && parseFloat(scoreMatch[1]) < CONFIG.skipThreshold) {
                // Find and click next button
                const nextBtn = Array.from(document.querySelectorAll('button')).find(btn => 
                    btn.innerText.toLowerCase().includes('next') || 
                    btn.innerText.toLowerCase().includes('skip')
                );
                if (nextBtn) nextBtn.click();
                updateMogStats(`Auto-skipped low score: ${scoreMatch[1]}`);
            }
        });
        observer.observe(document.body, { childList: true, subtree: true });
    }

    function startMogFeatures() {
        if (CONFIG.alwaysMog) startMogging();
        if (CONFIG.autoQueue) startAutoQueue();
        if (CONFIG.visualSpoof) startVisualSpoof();
        if (CONFIG.autoSkipLow) checkAutoSkip();
        
        updateMogStats('MOG MODE ACTIVATED 🔥');
    }

    // Initialize - show passcode modal first
    function init() {
        // Check if already unlocked from previous session
        try {
            const wasUnlocked = GM_getValue('omoggle_unlocked');
            if (wasUnlocked === 'true') {
                isUnlocked = true;
                createMogMenu();
                startMogFeatures();
                return;
            }
        } catch(e) {}
        
        createPasscodeModal();
    }

    init();
})();