NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript== // @name Minesweeper Online Custom Board Presets // @namespace Violentmonkey Scripts // @match https://minesweeper.online/game/* // @grant none // @version 1.1 // @author Aerico // @license MIT // @description Adds preset board sizes to custom game options // ==/UserScript== (function () { 'use strict'; // Define preset board configurations const presets = [{ name: '16x16 (40)', width: 16, height: 16, mines: 40 }, { name: '30x16 (99)', width: 30, height: 16, mines: 99 }, { name: '30x30 (180)', width: 30, height: 30, mines: 180 }, { name: '50x50 (500)', width: 50, height: 50, mines: 500 }, { name: '70x70 (1163) - 100k', width: 70, height: 70, mines: 1163 } ]; function createPresetButton(preset) { const button = document.createElement('button'); button.textContent = preset.name; button.className = 'btn btn-default btn-sm preset-button'; button.style.marginRight = '5px'; button.style.marginBottom = '5px'; button.addEventListener('click', (e) => { e.preventDefault(); document.getElementById('custom_width').value = preset.width; document.getElementById('custom_height').value = preset.height; document.getElementById('custom_mines').value = preset.mines; // Trigger the update button click const updateBtn = document.querySelector('.btn-custom-update'); if (updateBtn) { updateBtn.click(); } }); return button; } function addPresetButtons() { // Check if buttons already exist if (document.getElementById('preset-container')) return; // Find the custom level block const customLevelBlock = document.getElementById('CustomLevelBlock'); if (!customLevelBlock) return; // Create container for preset buttons const presetContainer = document.createElement('div'); presetContainer.id = 'preset-container'; presetContainer.style.marginTop = '10px'; presetContainer.style.marginBottom = '10px'; // Add a label const label = document.createElement('label'); label.textContent = 'Presets: '; label.style.marginRight = '10px'; presetContainer.appendChild(label); // Add preset buttons presets.forEach(preset => { presetContainer.appendChild(createPresetButton(preset)); }); // Insert the preset container after the form const form = customLevelBlock.querySelector('form'); if (form) { form.parentNode.insertBefore(presetContainer, form.nextSibling); } } // Watch for changes to the game content function initObserver() { const observer = new MutationObserver((mutations) => { mutations.forEach((mutation) => { if (mutation.type === 'childList' || mutation.type === 'subtree') { const customLevelBlock = document.getElementById('CustomLevelBlock'); if (customLevelBlock && customLevelBlock.offsetParent !== null) { addPresetButtons(); } } }); }); // Observe the entire document for changes observer.observe(document.body, { childList: true, subtree: true }); } // Initial setup function init() { // Add buttons immediately if custom level block exists const customLevelBlock = document.getElementById('CustomLevelBlock'); if (customLevelBlock && customLevelBlock.offsetParent !== null) { addPresetButtons(); } // Start watching for changes initObserver(); } // Start initialization init(); })();