Drawaria Mario Mod

Adds Mario-like movement to Drawaria with fly mode, metal mode, star mode, big mode, fire mode, and ice mode, and a draggable menu

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

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

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。

您需要先安装用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         Drawaria Mario Mod
// @namespace    http://tampermonkey.net/
// @version      1.1
// @description  Adds Mario-like movement to Drawaria with fly mode, metal mode, star mode, big mode, fire mode, and ice mode, and a draggable menu
// @author       You
// @match        https://drawaria.online/*
// @grant        none
// @license      MIT
// ==/UserScript==

(function() {
    'use strict';

    // Game Constants
    const GRAVITY = 0.5; // Simulates gravity (adjust as needed)
    const MAX_SPEED = 10; // Units/second
    const MIN_SPEED = 2; // Units/second
    const JUMP_HEIGHT = 15; // Units
    const FLY_DURATION = 420 * 60; // Frames (7 minutes at 60 FPS)
    const WING_IMAGE_URL = 'https://img1.picmix.com/output/stamp/thumb/0/4/3/0/2470340_d6215.gif';
    const FLY_SOUND_URL = 'https://www.myinstants.com/media/sounds/mario-64-wing-cap.mp3';
    const METAL_SOUND_URL = 'https://www.myinstants.com/media/sounds/mario-64-metal-cap.mp3';
    const STAR_SOUND_URL = 'https://www.myinstants.com/media/sounds/mario-64-star-power.mp3';
    const BIG_SOUND_URL = 'https://www.myinstants.com/media/sounds/mario-mega-mushroom.mp3';
    const FIRE_SOUND_URL = 'https://www.myinstants.com/media/sounds/mario-fire-power.mp3';
    const ICE_SOUND_URL = 'https://www.myinstants.com/media/sounds/mario-ice-power.mp3';

    // Avatar Properties
    let avatarX = 50;
    let avatarY = 50;
    let avatarVX = 0; // Horizontal velocity
    let avatarVY = 0; // Vertical velocity
    let isJumping = false;
    let isFlying = false;
    let isMetal = false;
    let isStar = false;
    let isBig = false;
    let isFire = false;
    let isIce = false;
    let flyFrames = 0;
    let flyModeActivated = false;
    let metalModeActivated = false;
    let starModeActivated = false;
    let bigModeActivated = false;
    let fireModeActivated = false;
    let iceModeActivated = false;
    let lastFireTime = 0;
    let starHue = 0;

    // Keyboard State
    const keys = {};

    // Audio Elements
    const flySound = new Audio(FLY_SOUND_URL);
    flySound.loop = true;

    const metalSound = new Audio(METAL_SOUND_URL);
    metalSound.loop = true;

    const starSound = new Audio(STAR_SOUND_URL);
    starSound.loop = true;

    const bigSound = new Audio(BIG_SOUND_URL);
    bigSound.loop = true;

    const fireSound = new Audio(FIRE_SOUND_URL);
    fireSound.loop = true;

    const iceSound = new Audio(ICE_SOUND_URL);
    iceSound.loop = true;

    // Wing Element
    const wingElement = document.createElement('img');
    wingElement.src = WING_IMAGE_URL;
    wingElement.style.position = 'absolute';
    wingElement.style.display = 'none';
    wingElement.style.width = '100px'; // Increase the size of the wings
    wingElement.style.height = '100px';
    wingElement.style.transform = 'translate(-50%, -50%)'; // Center the wings
    document.body.appendChild(wingElement);

    // Create Menu
    const menu = document.createElement('div');
    menu.style.position = 'absolute';
    menu.style.top = '50px';
    menu.style.left = '50px';
    menu.style.width = '300px';
    menu.style.background = 'radial-gradient(circle, #fff, #ccc, #999)';
    menu.style.borderRadius = '10px';
    menu.style.boxShadow = '0 0 10px rgba(0, 0, 0, 0.5)';
    menu.style.zIndex = 1000;
    menu.style.overflow = 'hidden';
    document.body.appendChild(menu);

    // Menu Toggle Symbol
    const menuToggleSymbol = document.createElement('div');
    menuToggleSymbol.style.textAlign = 'center';
    menuToggleSymbol.style.cursor = 'pointer';
    menuToggleSymbol.style.fontSize = '20px';
    menuToggleSymbol.style.marginBottom = '10px';
    menuToggleSymbol.textContent = '▼';
    menu.appendChild(menuToggleSymbol);

    // Menu Header
    const menuHeader = document.createElement('div');
    menuHeader.style.background = 'linear-gradient(to right, white, grey)';
    menuHeader.style.padding = '10px';
    menuHeader.style.textAlign = 'center';
    menuHeader.style.cursor = 'move';
    menuHeader.textContent = 'Drawaria Mario Mod';
    menu.appendChild(menuHeader);

    // Menu Options Container
    const menuOptions = document.createElement('div');
    menuOptions.style.display = 'none'; // Initially hidden
    menu.appendChild(menuOptions);

    // Fly Mode Button
    const flyButton = document.createElement('button');
    flyButton.textContent = 'Activate Fly Mode';
    flyButton.style.display = 'block';
    flyButton.style.margin = '10px';
    flyButton.style.padding = '10px';
    flyButton.style.background = 'linear-gradient(to bottom, #4CAF50, white)';
    flyButton.style.color = 'black';
    flyButton.style.border = 'none';
    flyButton.style.borderRadius = '5px';
    flyButton.style.cursor = 'pointer';
    flyButton.style.boxShadow = '0 4px 6px rgba(0, 0, 0, 0.1)';
    flyButton.style.transition = 'background 0.3s, transform 0.3s';
    flyButton.style.fontFamily = 'Arial, sans-serif';
    flyButton.style.fontSize = '16px';
    flyButton.style.fontWeight = 'bold';
    menuOptions.appendChild(flyButton);

    // Metal Mode Button
    const metalButton = document.createElement('button');
    metalButton.textContent = 'Activate Metal Mode';
    metalButton.style.display = 'block';
    metalButton.style.margin = '10px';
    metalButton.style.padding = '10px';
    metalButton.style.background = 'linear-gradient(to bottom, #FF9800, white)';
    metalButton.style.color = 'black';
    metalButton.style.border = 'none';
    metalButton.style.borderRadius = '5px';
    metalButton.style.cursor = 'pointer';
    metalButton.style.boxShadow = '0 4px 6px rgba(0, 0, 0, 0.1)';
    metalButton.style.transition = 'background 0.3s, transform 0.3s';
    metalButton.style.fontFamily = 'Arial, sans-serif';
    metalButton.style.fontSize = '16px';
    metalButton.style.fontWeight = 'bold';
    menuOptions.appendChild(metalButton);

    // Star Mode Button
    const starButton = document.createElement('button');
    starButton.textContent = 'Activate Star Mode';
    starButton.style.display = 'block';
    starButton.style.margin = '10px';
    starButton.style.padding = '10px';
    starButton.style.background = 'linear-gradient(to bottom, #FFD700, white)';
    starButton.style.color = 'black';
    starButton.style.border = 'none';
    starButton.style.borderRadius = '5px';
    starButton.style.cursor = 'pointer';
    starButton.style.boxShadow = '0 4px 6px rgba(0, 0, 0, 0.1)';
    starButton.style.transition = 'background 0.3s, transform 0.3s';
    starButton.style.fontFamily = 'Arial, sans-serif';
    starButton.style.fontSize = '16px';
    starButton.style.fontWeight = 'bold';
    menuOptions.appendChild(starButton);

    // Big Mode Button
    const bigButton = document.createElement('button');
    bigButton.textContent = 'Activate Big Mode';
    bigButton.style.display = 'block';
    bigButton.style.margin = '10px';
    bigButton.style.padding = '10px';
    bigButton.style.background = 'linear-gradient(to bottom, #FF69B4, white)';
    bigButton.style.color = 'black';
    bigButton.style.border = 'none';
    bigButton.style.borderRadius = '5px';
    bigButton.style.cursor = 'pointer';
    bigButton.style.boxShadow = '0 4px 6px rgba(0, 0, 0, 0.1)';
    bigButton.style.transition = 'background 0.3s, transform 0.3s';
    bigButton.style.fontFamily = 'Arial, sans-serif';
    bigButton.style.fontSize = '16px';
    bigButton.style.fontWeight = 'bold';
    menuOptions.appendChild(bigButton);

    // Fire Mode Button
    const fireButton = document.createElement('button');
    fireButton.textContent = 'Activate Fire Mode';
    fireButton.style.display = 'block';
    fireButton.style.margin = '10px';
    fireButton.style.padding = '10px';
    fireButton.style.background = 'linear-gradient(to bottom, #FF4500, white)';
    fireButton.style.color = 'black';
    fireButton.style.border = 'none';
    fireButton.style.borderRadius = '5px';
    fireButton.style.cursor = 'pointer';
    fireButton.style.boxShadow = '0 4px 6px rgba(0, 0, 0, 0.1)';
    fireButton.style.transition = 'background 0.3s, transform 0.3s';
    fireButton.style.fontFamily = 'Arial, sans-serif';
    fireButton.style.fontSize = '16px';
    fireButton.style.fontWeight = 'bold';
    menuOptions.appendChild(fireButton);

    // Ice Mode Button
    const iceButton = document.createElement('button');
    iceButton.textContent = 'Activate Ice Mode';
    iceButton.style.display = 'block';
    iceButton.style.margin = '10px';
    iceButton.style.padding = '10px';
    iceButton.style.background = 'linear-gradient(to bottom, #ADD8E6, white)';
    iceButton.style.color = 'black';
    iceButton.style.border = 'none';
    iceButton.style.borderRadius = '5px';
    iceButton.style.cursor = 'pointer';
    iceButton.style.boxShadow = '0 4px 6px rgba(0, 0, 0, 0.1)';
    iceButton.style.transition = 'background 0.3s, transform 0.3s';
    iceButton.style.fontFamily = 'Arial, sans-serif';
    iceButton.style.fontSize = '16px';
    iceButton.style.fontWeight = 'bold';
    menuOptions.appendChild(iceButton);

    // Stop Modes Button
    const stopModesButton = document.createElement('button');
    stopModesButton.textContent = 'Stop Modes';
    stopModesButton.style.display = 'block';
    stopModesButton.style.margin = '10px';
    stopModesButton.style.padding = '10px';
    stopModesButton.style.background = 'linear-gradient(to bottom, #f44336, white)';
    stopModesButton.style.color = 'black';
    stopModesButton.style.border = 'none';
    stopModesButton.style.borderRadius = '5px';
    stopModesButton.style.cursor = 'pointer';
    stopModesButton.style.boxShadow = '0 4px 6px rgba(0, 0, 0, 0.1)';
    stopModesButton.style.transition = 'background 0.3s, transform 0.3s';
    stopModesButton.style.fontFamily = 'Arial, sans-serif';
    stopModesButton.style.fontSize = '16px';
    stopModesButton.style.fontWeight = 'bold';
    menuOptions.appendChild(stopModesButton);

    // Function to handle movement
    function updateAvatar() {
        // 1. Apply Gravity
        avatarVY += GRAVITY;

        // 2. Handle horizontal movement (keyboard input)
        if (keys['ArrowRight']) {
            avatarVX = Math.min(avatarVX + 0.5, isStar ? MAX_SPEED * 2 : isMetal ? MAX_SPEED * 1.5 : MAX_SPEED);
        } else if (keys['ArrowLeft']) {
            avatarVX = Math.max(avatarVX - 0.5, -(isStar ? MAX_SPEED * 2 : isMetal ? MAX_SPEED * 1.5 : MAX_SPEED));
        } else {
            avatarVX *= 0.9; // Friction
        }

        // 3. Handle jumping
        if (keys['ArrowUp'] && !isJumping) {
            avatarVY = -(isMetal ? JUMP_HEIGHT * 0.7 : isBig ? JUMP_HEIGHT * 0.5 : JUMP_HEIGHT);
            isJumping = true;
        }

        // 4. Handle Flight
        if (isFlying) {
            if (flyFrames > 0) {
                flyFrames--;
                if (keys['ArrowUp']) {
                    avatarVY = -JUMP_HEIGHT; // Hold jump in fly mode
                }
            } else {
                stopFlyMode();
            }
        }

        // 5. Handle Fire and Ice Modes
        if (keys[' '] && (isFire || isIce)) {
            const currentTime = Date.now();
            if (currentTime - lastFireTime >= 2000) {
                lastFireTime = currentTime;
                launchFireball(isIce);
            }
        }

        // 6. Update Avatar Position
        avatarX += avatarVX;
        avatarY += avatarVY;

        // 7. Collision Detection (simplified)
        if (avatarY > 768 - (isBig ? 100 : 50)) { // Assuming ground level is at 768 - 50
            avatarY = 768 - (isBig ? 100 : 50);
            avatarVY = 0;
            isJumping = false;
        }

        // 8. Boundary Check
        avatarX = Math.max(-900, Math.min(avatarX, 1024 + 100)); // Keep within bounds
        avatarY = Math.max(-350, Math.min(avatarY, 768 + 50));

        // 9. Update visual representation (Draw the avatar)
        drawAvatar(avatarX, avatarY);

        // Request next frame
        requestAnimationFrame(updateAvatar);
    }

    // Function to handle keyboard input
    function handleKeyDown(event) {
        keys[event.key] = true;
    }

    function handleKeyUp(event) {
        keys[event.key] = false;
    }

    // Function to draw the avatar
    function drawAvatar(x, y) {
        const avatar = document.querySelector('#selfavatarimage');
        if (avatar) {
            avatar.style.transform = `translate(${x}px, ${y}px)`;
            avatar.style.border = 'none'; // Make border transparent
            avatar.style.boxShadow = 'none'; // Make box-shadow transparent
            if (isFlying) {
                wingElement.style.display = 'block';
                // Position wings behind the avatar
                const avatarRect = avatar.getBoundingClientRect();
                wingElement.style.left = `${avatarRect.left + window.scrollX + (avatarRect.width - wingElement.offsetWidth) / 2}px`;
                wingElement.style.top = `${avatarRect.top + window.scrollY + (avatarRect.height - wingElement.offsetHeight) / 2}px`;
            } else {
                wingElement.style.display = 'none';
            }
            if (isMetal) {
                avatar.style.filter = 'grayscale(100%) brightness(150%)';
            } else if (isStar) {
                starHue = (starHue + 1) % 360;
                avatar.style.filter = `hue-rotate(${starHue}deg) brightness(150%)`;
            } else if (isBig) {
                avatar.style.transform = `translate(${x}px, ${y}px) scale(2)`;
            } else if (isFire) {
                avatar.style.filter = 'brightness(150%) sepia(100%) saturate(500%) hue-rotate(-10deg)';
            } else if (isIce) {
                avatar.style.filter = 'brightness(150%) sepia(100%) saturate(500%) hue-rotate(180deg)';
            } else {
                avatar.style.filter = 'none';
                avatar.style.transform = `translate(${x}px, ${y}px)`;
            }
        }
    }

    // Function to launch a fireball
    function launchFireball(isIce) {
        const avatar = document.querySelector('#selfavatarimage');
        if (avatar) {
            const fireball = document.createElement('img');
            fireball.src = isIce ? 'https://i.gifer.com/origin/d6/d6abed6047c79b8073fda9af7ba85358_w200.gif' : 'https://media.tenor.com/_dUxi3qy-KIAAAAj/fire-fireball.gif';
            fireball.style.position = 'absolute';
            fireball.style.width = '50px';
            fireball.style.height = '50px';
            fireball.style.left = `${avatar.offsetLeft + avatar.offsetWidth / 2}px`;
            fireball.style.top = `${avatar.offsetTop + avatar.offsetHeight / 2}px`;
            document.body.appendChild(fireball);

            let fireballX = avatar.offsetLeft + avatar.offsetWidth / 2;
            let fireballY = avatar.offsetTop + avatar.offsetHeight / 2;
            let fireballVX = 5; // Fireball speed to the right
            let fireballVY = 0;
            const gravity = 0.5;

            function moveFireball() {
                fireballX += fireballVX;
                fireballY += fireballVY;
                fireballVY += gravity;

                // Bounce off the ground
                if (fireballY > 768 - 25) {
                    fireballY = 768 - 25;
                    fireballVY = -fireballVY * 0.8; // Reduce velocity on bounce
                }

                // Remove fireball if it goes off screen
                if (fireballX < -50 || fireballX > 1024 + 50 || fireballY > 768 + 50) {
                    document.body.removeChild(fireball);
                } else {
                    fireball.style.left = `${fireballX}px`;
                    fireball.style.top = `${fireballY}px`;
                    requestAnimationFrame(moveFireball);
                }
            }

            moveFireball();
        }
    }

    // Function to activate fly mode
    function activateFlyMode() {
        stopOtherModes();
        isFlying = true;
        flyFrames = FLY_DURATION;
        flyModeActivated = true;
        flySound.play();
    }

    // Function to stop fly mode
    function stopFlyMode() {
        isFlying = false;
        wingElement.style.display = 'none';
        flySound.pause();
        flySound.currentTime = 0;
        flyModeActivated = false;
    }

    // Function to activate metal mode
    function activateMetalMode() {
        stopOtherModes();
        isMetal = true;
        metalModeActivated = true;
        metalSound.play();
    }

    // Function to stop metal mode
    function stopMetalMode() {
        isMetal = false;
        metalSound.pause();
        metalSound.currentTime = 0;
        metalModeActivated = false;
    }

    // Function to activate star mode
    function activateStarMode() {
        stopOtherModes();
        isStar = true;
        starModeActivated = true;
        starSound.play();
    }

    // Function to stop star mode
    function stopStarMode() {
        isStar = false;
        starSound.pause();
        starSound.currentTime = 0;
        starModeActivated = false;
    }

    // Function to activate big mode
    function activateBigMode() {
        stopOtherModes();
        isBig = true;
        bigModeActivated = true;
        bigSound.play();
    }

    // Function to stop big mode
    function stopBigMode() {
        isBig = false;
        bigSound.pause();
        bigSound.currentTime = 0;
        bigModeActivated = false;
    }

    // Function to activate fire mode
    function activateFireMode() {
        stopOtherModes();
        isFire = true;
        fireModeActivated = true;
        fireSound.play();
    }

    // Function to stop fire mode
    function stopFireMode() {
        isFire = false;
        fireSound.pause();
        fireSound.currentTime = 0;
        fireModeActivated = false;
    }

    // Function to activate ice mode
    function activateIceMode() {
        stopOtherModes();
        isIce = true;
        iceModeActivated = true;
        iceSound.play();
    }

    // Function to stop ice mode
    function stopIceMode() {
        isIce = false;
        iceSound.pause();
        iceSound.currentTime = 0;
        iceModeActivated = false;
    }

    // Function to stop all modes
    function stopAllModes() {
        stopFlyMode();
        stopMetalMode();
        stopStarMode();
        stopBigMode();
        stopFireMode();
        stopIceMode();
    }

    // Function to stop other modes
    function stopOtherModes() {
        stopFlyMode();
        stopMetalMode();
        stopStarMode();
        stopBigMode();
        stopFireMode();
        stopIceMode();
    }

    // Function to toggle menu options visibility
    function toggleMenuOptions() {
        if (menuOptions.style.display === 'none') {
            menuOptions.style.display = 'block';
            menuToggleSymbol.textContent = '▲';
            menu.style.height = '500px'; // Expand menu height
        } else {
            menuOptions.style.display = 'none';
            menuToggleSymbol.textContent = '▼';
            menu.style.height = 'auto'; // Collapse menu height
        }
    }

    // Make the menu draggable
    let isDragging = false;
    let offsetX, offsetY;

    menuHeader.addEventListener('mousedown', (e) => {
        isDragging = true;
        offsetX = e.clientX - menu.offsetLeft;
        offsetY = e.clientY - menu.offsetTop;
    });

    document.addEventListener('mousemove', (e) => {
        if (isDragging) {
            menu.style.left = `${e.clientX - offsetX}px`;
            menu.style.top = `${e.clientY - offsetY}px`;
        }
    });

    document.addEventListener('mouseup', () => {
        isDragging = false;
    });

    // Event listeners for keyboard input
    document.addEventListener('keydown', handleKeyDown);
    document.addEventListener('keyup', handleKeyUp);

    // Event listener for fly mode button
    flyButton.addEventListener('click', activateFlyMode);

    // Event listener for metal mode button
    metalButton.addEventListener('click', activateMetalMode);

    // Event listener for star mode button
    starButton.addEventListener('click', activateStarMode);

    // Event listener for big mode button
    bigButton.addEventListener('click', activateBigMode);

    // Event listener for fire mode button
    fireButton.addEventListener('click', activateFireMode);

    // Event listener for ice mode button
    iceButton.addEventListener('click', activateIceMode);

    // Event listener for stop modes button
    stopModesButton.addEventListener('click', stopAllModes);

    // Event listener for menu toggle symbol
    menuToggleSymbol.addEventListener('click', toggleMenuOptions);

    // Start the game loop
    updateAvatar();

})();