NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript==
// @name Super Metroid Map Rando Generation Randomizer
// @namespace https://openuserjs.org/users/miketrethewey
// @version 1.0.1
// @description Randomizes the form options in SM Map Rando
// @author Minnie A. Trethewey
// @match https://maprando.com/generate*
// @match https://dev.maprando.com/generate*
// @require https://code.jquery.com/jquery-3.7.1.slim.min.js
// @copyright 2023, miketrethewey (https://openuserjs.org/users/miketrethewey)
// @license MIT
// @grant none
// ==/UserScript==
// ==OpenUserJS==
// @author miketrethewey
// ==/OpenUserJS==
(function() {
let ignoredOptions = [
// QOL
// Map
"Item markers",
"Map stations always visible on map",
"Guaranteed early save station",
// End game
"Mother Brain fight (phases 2 and 3)",
"Supers do double damage to Mother Brain",
"Hyper Beam gives all movement items",
"Refill energy for escape",
"Enemies cleared during escape",
// Faster transitions
"Fast elevators",
"Fast doors",
"Fast pause menu",
// Samus control
"Respin",
"Lenient Space Jump",
"Momentum conservation",
// Other
"All items spawn at start of game",
"Acid Chozo usable without Space Jump",
"Enemy drops are buffed",
// Other Options
"Wall jump",
"E-Tank energy refill",
"Area assignment",
"Item dots after collection",
"Area transition markers on map",
"Maps revealed from start",
"Ultra-low quality of life",
"Race mode"
];
// Select a random option
function randomizeOption(inputs) {
let randomize = true;
if(randomize) {
// Get a random number within the size of the available options
let randomID = Math.floor(Math.random() * (inputs.length - 1));
// If we chose the selected option, return -1 to indicate that
if(inputs[randomID].checked) {
randomID = -1;
} else {
// If we chose something other than the selection option, choose it
inputs[randomID].checked = true;
}
return randomID;
}
}
// List the options and indicate what is selected
function buildOptionList(inputs, randomID) {
let msg = "";
for (let input of inputs) {
// If it's checked
// If it's something other than what was initially selected
// Add a square bracket
// Else, if it's what was initially selected
// Add an asterisk
if(input.checked) {
msg += randomID !== -1 ? "[" : "*";
}
msg += (input.value);
if(input.checked) {
msg += randomID !== -1 ? "]" : "*";
}
msg += ",";
}
return msg;
}
function doTheThing() {
let passedOptions = [];
let skippedOptions = [];
// Cycle through .form-group
let formGroups = $(".form-group");
for (let formGroup of formGroups) {
let modals = $(formGroup).find(".modal");
// If it's got a modal (in this case, a ? help dialogue)
if(modals.length) {
let labels = $(formGroup).find("label");
let inputs = $(formGroup).find("input");
let optionSections = $(formGroup).find(".mt-0");
// If it's got styled options
if(optionSections.length) {
for (let optionSection of optionSections) {
// If it's got a <label>
if(labels) {
let msg = "";
let label = labels[0].innerText;
// If it's got <input>s
if(inputs) {
// If it's not something we're ignoring
if(ignoredOptions.indexOf(labels[0].innerText) == -1) {
// Save that we looked at it
passedOptions.push(label);
msg += (labels[0].innerText) + ": ";
// Pick a random option
let randomID = randomizeOption(inputs);
// List the options
msg += buildOptionList(inputs, randomID);
} else {
// Save that we skipped it
skippedOptions.push(label);
}
}
console.log(msg);
}
}
} else if(inputs.length) {
if(inputs[0].type == "radio") {
let msg = "";
let label = labels[0].innerText;
// If it's not something we're ignoring
if(ignoredOptions.indexOf(labels[0].innerText) == -1) {
// Save that we looked at it
passedOptions.push(label);
msg += (labels[0].innerText) + ": ";
// Pick a random option
let randomID = randomizeOption(inputs);
// List the options
msg += buildOptionList(inputs, randomID);
} else {
// Save that we skipped it
skippedOptions.push(label);
}
console.log(msg);
}
}
}
}
console.log(passedOptions);
console.log(skippedOptions);
}
// Build a button to Randomize settings
let button = document.createElement("button");
button.className = "btn btn-primary my-3";
button.style = "float:right";
button.innerText = "Randomize Settings!";
button.onclick = doTheThing;
// Add it to the header
let headers = null;
let header = null;
headers = document.getElementsByTagName("h3");
header = headers[0];
header.appendChild(button);
})();