Greasy Fork is available in English.

Scratch Ultra Modifier Pro Plus

The ultimate modification script for Scratch with advanced block colors, Turbo, Speed of Light modes, AI-powered tutorials, and a super complex, draggable, and modern GUI with working API integration.

// ==UserScript==
// @name         Scratch Ultra Modifier Pro Plus
// @namespace    http://tampermonkey.net/
// @version      5.0
// @description  The ultimate modification script for Scratch with advanced block colors, Turbo, Speed of Light modes, AI-powered tutorials, and a super complex, draggable, and modern GUI with working API integration.
// @author       YourName
// @match        https://scratch.mit.edu/projects/*
// @grant        GM_addStyle
// @grant        GM_xmlhttpRequest
// @connect      api.example.com  // Replace with the actual API domain
// @require      https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min.js
// @require      https://cdnjs.cloudflare.com/ajax/libs/gsap/3.9.1/gsap.min.js
// ==/UserScript==

(function() {
    'use strict';

    let isGuiOpen = false;
    let isTurboEnabled = false;
    let isSpeedOfLightEnabled = false;
    let tutorialsLoaded = false;
    let currentTutorialPage = 0;
    const tutorialPages = [];

    // Function to change block colors
    function changeBlockColors() {
        const blockOuterColor = '#1E90FF';
        const blockInnerColor = '#FFD700';
        const blockBorderColor = '#8B0000';

        $('svg.blocklySvg g.blocklyDraggable .blocklyPath').each(function() {
            $(this).css({
                'fill': blockOuterColor,
                'stroke': blockBorderColor,
                'stroke-width': '3px'
            });
        });

        $('svg.blocklySvg g.blocklyDraggable .blocklyPathLight').each(function() {
            $(this).css('fill', blockInnerColor);
        });

        $('svg.blocklySvg g.blocklyDraggable .blocklyPath').each(function() {
            const gradientId = `gradient-${Math.random().toString(36).substr(2, 9)}`;
            $(this).css('fill', `url(#${gradientId})`);

            $('svg defs').append(`
                <linearGradient id="${gradientId}" x1="0%" y1="0%" x2="100%" y2="100%">
                    <stop offset="0%" style="stop-color:${blockOuterColor};stop-opacity:1" />
                    <stop offset="100%" style="stop-color:${blockInnerColor};stop-opacity:1" />
                </linearGradient>
            `);
        });

        console.log('Block colors changed successfully.');
    }

    // Function to enable Turbo Mode
    function enableTurboMode() {
        if (Scratch.vm) {
            Scratch.vm.setTurboMode(true);
            isTurboEnabled = true;
            alert("Turbo Mode Enabled! Your project is now running at maximum speed.");
        } else {
            alert("Failed to enable Turbo Mode. Please try again.");
        }
    }

    // Function to enable Speed of Light Mode
    function enableSpeedOfLightMode() {
        if (Scratch.vm) {
            Scratch.vm.runtime._stepTime = 0.1;
            isSpeedOfLightEnabled = true;
            alert("Speed of Light Mode Enabled! Hold on, your FPS is going through the roof!");
        } else {
            alert("Failed to enable Speed of Light Mode. Please try again.");
        }
    }

    // Function to fetch tutorials from an API
    function fetchTutorials() {
        if (tutorialsLoaded) return;

        GM_xmlhttpRequest({
            method: 'GET',
            url: 'https://api.example.com/tutorials', // Replace with your actual API endpoint
            onload: function(response) {
                if (response.status === 200) {
                    const data = JSON.parse(response.responseText);
                    tutorialPages.push(...data.tutorials);
                    tutorialsLoaded = true;
                    displayTutorialPage(0);
                } else {
                    alert('Failed to load tutorials. Please try again later.');
                }
            },
            onerror: function() {
                alert('Failed to load tutorials. Network error.');
            }
        });
    }

    // Function to display a tutorial page
    function displayTutorialPage(index) {
        if (index < 0 || index >= tutorialPages.length) return;

        currentTutorialPage = index;
        $('#tutorialContent').html(tutorialPages[index]);
        $('#tutorialContent').show();
    }

    // Function to create and display popups
    function displayPopup(message) {
        const popup = $('<div>', {
            text: message,
            css: {
                'background-color': '#333',
                'color': '#FFF',
                'padding': '15px',
                'border-radius': '10px',
                'position': 'fixed',
                'top': '20px',
                'right': '20px',
                'z-index': 10000,
                'box-shadow': '0 0 15px rgba(0, 0, 0, 0.5)',
                'font-family': 'Comic Sans MS, sans-serif'
            }
        }).appendTo('body');

        gsap.to(popup, {
            duration: 3,
            opacity: 0,
            onComplete: () => popup.remove()
        });
    }

    // Function to create and display GUI
    function createGUI() {
        // Main container for GUI
        const guiContainer = $('<div>', { id: 'customGuiContainer' }).appendTo('body');

        // Title and close button
        const titleBar = $('<div>', {
            css: {
                'display': 'flex',
                'justify-content': 'space-between',
                'align-items': 'center',
                'padding': '10px',
                'background-color': '#FFD700',
                'border-radius': '10px 10px 0 0',
                'cursor': 'move'
            }
        }).appendTo(guiContainer);

        $('<h1>', {
            text: 'Scratch Ultra Modifier Pro Plus',
            css: {
                'font-family': 'Comic Sans MS, sans-serif',
                'color': '#1E90FF',
                'margin': 0
            }
        }).appendTo(titleBar);

        const closeButton = $('<button>', {
            text: 'X',
            click: () => guiContainer.hide(),
            css: createButtonStyle('#FF4500', '#FFF')
        }).appendTo(titleBar);

        // Buttons for GUI functionality
        const changeColorButton = createGuiButton('Change Block Colors', changeBlockColors);
        guiContainer.append(changeColorButton);

        const turboButton = createGuiButton('Enable Turbo Mode', enableTurboMode);
        guiContainer.append(turboButton);

        const speedButton = createGuiButton('Enable Speed of Light Mode', enableSpeedOfLightMode);
        guiContainer.append(speedButton);

        const tutorialsButton = createGuiButton('Show Tutorials', fetchTutorials);
        guiContainer.append(tutorialsButton);

        // Tutorial content area
        const tutorialContent = $('<div>', {
            id: 'tutorialContent',
            css: {
                'background-color': '#FFF7E6',
                'border': '2px solid #FF5733',
                'border-radius': '10px',
                'padding': '15px',
                'margin-top': '20px',
                'font-family': 'Comic Sans MS, sans-serif',
                'max-height': '300px',
                'overflow-y': 'auto'
            }
        }).appendTo(guiContainer);

        const tutorialCloseButton = $('<button>', {
            text: 'X',
            click: () => tutorialContent.hide(),
            css: createButtonStyle('#FF4500', '#FFF', '5px')
        }).appendTo(tutorialContent);

        // Navigation buttons for tutorials
        const navContainer = $('<div>', { id: 'navContainer' }).appendTo(guiContainer);

        const prevButton = $('<button>', {
            text: 'Previous',
            click: () => displayTutorialPage(currentTutorialPage - 1),
            css: createButtonStyle('#333', '#FFF', '5px')
        }).appendTo(navContainer);

        const nextButton = $('<button>', {
            text: 'Next',
            click: () => displayTutorialPage(currentTutorialPage + 1),
            css: createButtonStyle('#333', '#FFF', '5px')
        }).appendTo(navContainer);

        // Drag functionality
        let isDragging = false;
        let offset = { x: 0, y: 0 };

        titleBar.on('mousedown', (e) => {
            isDragging = true;
            offset.x = e.pageX - guiContainer.offset().left;
            offset.y = e.pageY - guiContainer.offset().top;
        });

        $(document).on('mousemove', (e) => {
            if (isDragging) {
                guiContainer.css({
                    top: e.pageY - offset.y + 'px',
                    left: e.pageX - offset.x + 'px'
                });
            }
        }).on('mouseup', () => {
            isDragging = false;
        });

        // Open/Close GUI button
        const openGuiButton = $('<button>', {
            id: 'openGuiButton',
            text: 'Open GUI',
            click: () => {
                if (isGuiOpen) {
                    guiContainer.hide();
                    openGuiButton.text('Open GUI');
                } else {
                    guiContainer.show();
                    openGuiButton.text('Close GUI');
                }
                isGuiOpen = !isGuiOpen;
            },
            css: createButtonStyle('#32CD32', '#FFF')
        }).appendTo('body');

        guiContainer.hide(); // Start with the GUI hidden

        // Additional styling for draggable functionality
        GM_addStyle(`
            #customGuiContainer {
                width: 300px;
                height: auto;
                background-color: #FFF;
                border: 2px solid #1E90FF;
                border-radius: 10px;
                position: fixed;
                top: 50px;
                right: 50px;
                z-index: 9999;
                box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.3);
            }
            #tutorialContent {
                display: none;
            }
            #navContainer button {
                margin: 5px;
            }
        `);
    }

    // Function to create a styled button
    function createGuiButton(text, onClick) {
        return $('<button>', {
            text: text,
            click: onClick,
            css: createButtonStyle('#4682B4', '#FFF')
        });
    }

    // Function to create dynamic button styles
    function createButtonStyle(bgColor, textColor, margin = '10px') {
        return {
            'background-color': bgColor,
            'color': textColor,
            'border': 'none',
            'padding': '10px 20px',
            'margin': margin,
            'border-radius': '5px',
            'cursor': 'pointer',
            'font-family': 'Comic Sans MS, sans-serif',
            'font-size': '16px',
            'transition': 'background-color 0.3s ease',
            'outline': 'none'
        };
    }

    // Initialize the script by creating the GUI
    createGUI();
})();