From da6c44a1cfb3d2a51b272cc1d72a783147576dc9 Mon Sep 17 00:00:00 2001 From: Chris Wilson Date: Thu, 3 Dec 2020 18:27:32 -0500 Subject: [PATCH] Working on player-settings update --- WebHostLib/__init__.py | 9 +- WebHostLib/static/assets/playerSettings.js | 104 + ...player-settings.js => weightedSettings.js} | 30 +- WebHostLib/static/static/playerSettings.json | 2211 ++++------------- .../static/static/weightedSettings.json | 1878 ++++++++++++++ ...yerSettings.yaml => weightedSettings.yaml} | 0 WebHostLib/static/styles/playerSettings.css | 100 + ...ayer-settings.css => weightedSettings.css} | 46 +- WebHostLib/templates/playerSettings.html | 79 +- WebHostLib/templates/weightedSettings.html | 72 + setup.py | 2 +- 11 files changed, 2716 insertions(+), 1815 deletions(-) create mode 100644 WebHostLib/static/assets/playerSettings.js rename WebHostLib/static/assets/{player-settings.js => weightedSettings.js} (91%) create mode 100644 WebHostLib/static/static/weightedSettings.json rename WebHostLib/static/static/{playerSettings.yaml => weightedSettings.yaml} (100%) create mode 100644 WebHostLib/static/styles/playerSettings.css rename WebHostLib/static/styles/{player-settings.css => weightedSettings.css} (63%) create mode 100644 WebHostLib/templates/weightedSettings.html diff --git a/WebHostLib/__init__.py b/WebHostLib/__init__.py index 4942dfef..c392990b 100644 --- a/WebHostLib/__init__.py +++ b/WebHostLib/__init__.py @@ -85,10 +85,15 @@ def tutorial(lang='en'): @app.route('/player-settings') -def player_settings(): +def player_settings_simple(): return render_template("playerSettings.html") +@app.route('/weighted-settings') +def player_settings(): + return render_template("weightedSettings.html") + + @app.route('/seed/') def viewSeed(seed: UUID): seed = Seed.get(id=seed) @@ -148,4 +153,4 @@ def favicon(): from WebHostLib.customserver import run_server_process from . import tracker, upload, landing, check, generate, downloads, api # to trigger app routing picking up on it -app.register_blueprint(api.api_endpoints) \ No newline at end of file +app.register_blueprint(api.api_endpoints) diff --git a/WebHostLib/static/assets/playerSettings.js b/WebHostLib/static/assets/playerSettings.js new file mode 100644 index 00000000..1ede58ae --- /dev/null +++ b/WebHostLib/static/assets/playerSettings.js @@ -0,0 +1,104 @@ +window.addEventListener('load', () => { + fetchSettingData().then((settingData) => { + createDefaultSettings(settingData); + buildUI(settingData); + populateSettings(); + }); +}); + +const fetchSettingData = () => new Promise((resolve, reject) => { + const ajax = new XMLHttpRequest(); + ajax.onreadystatechange = () => { + if (ajax.readyState !== 4) { return; } + if (ajax.status !== 200) { + reject(ajax.responseText); + return; + } + try{ resolve(JSON.parse(ajax.responseText)); } + catch(error){ reject(error); } + }; + ajax.open('GET', `${window.location.origin}/static/static/playerSettings.json` ,true); + ajax.send(); +}); + +const createDefaultSettings = (settingData) => { + if (!localStorage.getItem('playerSettings')) { + const newSettings = {}; + for (let roSetting of Object.keys(settingData.readOnly)){ + newSettings[roSetting] = settingData.readOnly[roSetting]; + } + for (let gameOption of Object.keys(settingData.gameOptions)){ + newSettings[gameOption] = settingData.gameOptions[gameOption].defaultValue; + } + for (let romOption of Object.keys(settingData.romOptions)){ + newSettings[romOption] = settingData.romOptions[romOption].defaultValue; + } + localStorage.setItem('playerSettings', JSON.stringify(newSettings)); + } +}; + +const buildUI = (settingData) => { + // Game Options + const leftGameOpts = {}; + const rightGameOpts = {}; + Object.keys(settingData.gameOptions).forEach((key, index) => { + if (index % 2 === 0) { leftGameOpts[key] = settingData.gameOptions[key]; } + else { rightGameOpts[key] = settingData.gameOptions[key]; } + }); + document.getElementById('game-options-left').appendChild(buildOptionsTable(leftGameOpts)); + document.getElementById('game-options-right').appendChild(buildOptionsTable(rightGameOpts)); + + // ROM Options + const leftRomOpts = {}; + const rightRomOpts = {}; + Object.keys(settingData.romOptions).forEach((key, index) => { + if (index % 2 === 0) { leftRomOpts[key] = settingData.romOptions[key]; } + else { rightRomOpts[key] = settingData.romOptions[key]; } + }); + document.getElementById('rom-options-left').appendChild(buildOptionsTable(leftRomOpts)); + document.getElementById('rom-options-right').appendChild(buildOptionsTable(rightRomOpts)); +}; + +const buildOptionsTable = (settings) => { + const table = document.createElement('table'); + const tbody = document.createElement('tbody'); + + Object.keys(settings).forEach((setting) => { + const tr = document.createElement('tr'); + + // td Left + const tdl = document.createElement('td'); + const label = document.createElement('label'); + label.setAttribute('for', setting); + label.setAttribute('data-tooltip', settings[setting].description); + label.innerText = `${settings[setting].friendlyName}:`; + tdl.appendChild(label); + tr.appendChild(tdl); + + // td Right + const tdr = document.createElement('td'); + const select = document.createElement('select'); + settings[setting].options.forEach((opt) => { + const option = document.createElement('option'); + option.setAttribute('value', opt.value); + option.innerText = opt.name; + select.appendChild(option); + }); + tdr.appendChild(select); + tr.appendChild(tdr); + tbody.appendChild(tr); + }); + + table.appendChild(tbody); + return table; +}; + +const populateSettings = () => { + // TODO +}; + +const updateSetting = (key, setting) => { + const options = JSON.parse(localStorage.getItem('playerSettings')); + options[key] = setting; + localStorage.setItem('playerSettings', JSON.stringify(options)); +}; diff --git a/WebHostLib/static/assets/player-settings.js b/WebHostLib/static/assets/weightedSettings.js similarity index 91% rename from WebHostLib/static/assets/player-settings.js rename to WebHostLib/static/assets/weightedSettings.js index c8292390..8dced389 100644 --- a/WebHostLib/static/assets/player-settings.js +++ b/WebHostLib/static/assets/weightedSettings.js @@ -1,16 +1,16 @@ let spriteData = null; window.addEventListener('load', () => { - const gameSettings = document.getElementById('player-settings'); + const gameSettings = document.getElementById('weighted-settings'); Promise.all([fetchPlayerSettingsYaml(), fetchPlayerSettingsJson(), fetchSpriteData()]).then((results) => { // Load YAML into object const sourceData = jsyaml.safeLoad(results[0], { json: true }); // Update localStorage with three settings objects. Preserve original objects if present. for (let i=1; i<=3; i++) { - const localSettings = JSON.parse(localStorage.getItem(`playerSettings${i}`)); + const localSettings = JSON.parse(localStorage.getItem(`weightedSettings${i}`)); const updatedObj = localSettings ? Object.assign(sourceData, localSettings) : sourceData; - localStorage.setItem(`playerSettings${i}`, JSON.stringify(updatedObj)); + localStorage.setItem(`weightedSettings${i}`, JSON.stringify(updatedObj)); } // Parse spriteData into useful sets @@ -47,7 +47,7 @@ const fetchPlayerSettingsYaml = () => new Promise((resolve, reject) => { } resolve(ajax.responseText); }; - ajax.open('GET', `${window.location.origin}/static/static/playerSettings.yaml` ,true); + ajax.open('GET', `${window.location.origin}/static/static/weightedSettings.yaml` ,true); ajax.send(); }); @@ -61,7 +61,7 @@ const fetchPlayerSettingsJson = () => new Promise((resolve, reject) => { } resolve(ajax.responseText); }; - ajax.open('GET', `${window.location.origin}/static/static/playerSettings.json`, true); + ajax.open('GET', `${window.location.origin}/static/static/weightedSettings.json`, true); ajax.send(); }); @@ -82,7 +82,7 @@ const fetchSpriteData = () => new Promise((resolve, reject) => { const handleOptionChange = (event) => { if(!event.target.matches('.setting')) { return; } const presetNumber = document.getElementById('preset-number').value; - const settings = JSON.parse(localStorage.getItem(`playerSettings${presetNumber}`)) + const settings = JSON.parse(localStorage.getItem(`weightedSettings${presetNumber}`)) const settingString = event.target.getAttribute('data-setting'); document.getElementById(settingString).innerText = event.target.value; if(getSettingValue(settings, settingString) !== false){ @@ -106,7 +106,7 @@ const handleOptionChange = (event) => { } // Save the updated settings object bask to localStorage - localStorage.setItem(`playerSettings${presetNumber}`, JSON.stringify(settings)); + localStorage.setItem(`weightedSettings${presetNumber}`, JSON.stringify(settings)); }else{ console.warn(`Unknown setting string received: ${settingString}`) } @@ -114,7 +114,7 @@ const handleOptionChange = (event) => { const populateSettings = () => { const presetNumber = document.getElementById('preset-number').value; - const settings = JSON.parse(localStorage.getItem(`playerSettings${presetNumber}`)) + const settings = JSON.parse(localStorage.getItem(`weightedSettings${presetNumber}`)) const settingsInputs = Array.from(document.querySelectorAll('.setting')); settingsInputs.forEach((input) => { const settingString = input.getAttribute('data-setting'); @@ -147,13 +147,13 @@ const getSettingValue = (settings, keyString) => { const exportSettings = () => { const presetNumber = document.getElementById('preset-number').value; - const settings = JSON.parse(localStorage.getItem(`playerSettings${presetNumber}`)); + const settings = JSON.parse(localStorage.getItem(`weightedSettings${presetNumber}`)); const yamlText = jsyaml.safeDump(settings, { noCompatMode: true }).replaceAll(/'(\d+)':/g, (x, y) => `${y}:`); download(`${settings.description}.yaml`, yamlText); }; const resetToDefaults = () => { - [1, 2, 3].forEach((presetNumber) => localStorage.removeItem(`playerSettings${presetNumber}`)); + [1, 2, 3].forEach((presetNumber) => localStorage.removeItem(`weightedSettings${presetNumber}`)); location.reload(); }; @@ -225,7 +225,7 @@ const buildUI = (settings) => { tbody.setAttribute('id', 'sprites-tbody'); const currentPreset = document.getElementById('preset-number').value; - const playerSettings = JSON.parse(localStorage.getItem(`playerSettings${currentPreset}`)); + const playerSettings = JSON.parse(localStorage.getItem(`weightedSettings${currentPreset}`)); // Manually add a row for random sprites addSpriteRow(tbody, playerSettings, 'random'); @@ -369,7 +369,7 @@ const addSpriteRow = (tbody, playerSettings, spriteName) => { const addSpriteOption = (event) => { const presetNumber = document.getElementById('preset-number').value; - const playerSettings = JSON.parse(localStorage.getItem(`playerSettings${presetNumber}`)); + const playerSettings = JSON.parse(localStorage.getItem(`weightedSettings${presetNumber}`)); const spriteName = event.target.getAttribute('data-sprite'); console.log(event.target); console.log(spriteName); @@ -381,7 +381,7 @@ const addSpriteOption = (event) => { // Add option to playerSettings object playerSettings.rom.sprite[event.target.getAttribute('data-sprite')] = 50; - localStorage.setItem(`playerSettings${presetNumber}`, JSON.stringify(playerSettings)); + localStorage.setItem(`weightedSettings${presetNumber}`, JSON.stringify(playerSettings)); // Add to #sprite-options-table const tbody = document.getElementById('sprites-tbody'); @@ -390,12 +390,12 @@ const addSpriteOption = (event) => { const removeSpriteOption = (event) => { const presetNumber = document.getElementById('preset-number').value; - const playerSettings = JSON.parse(localStorage.getItem(`playerSettings${presetNumber}`)); + const playerSettings = JSON.parse(localStorage.getItem(`weightedSettings${presetNumber}`)); const spriteName = event.target.getAttribute('data-sprite'); // Remove option from playerSettings object delete playerSettings.rom.sprite[spriteName]; - localStorage.setItem(`playerSettings${presetNumber}`, JSON.stringify(playerSettings)); + localStorage.setItem(`weightedSettings${presetNumber}`, JSON.stringify(playerSettings)); // Remove from #sprite-options-table const tr = document.getElementById(event.target.getAttribute('data-row-id')); diff --git a/WebHostLib/static/static/playerSettings.json b/WebHostLib/static/static/playerSettings.json index e6ee539f..9c031b49 100644 --- a/WebHostLib/static/static/playerSettings.json +++ b/WebHostLib/static/static/playerSettings.json @@ -1,1878 +1,657 @@ { - "gameOptions": { - "description": { - "keyString": "description", - "friendlyName": "Description", - "inputType": "text", - "description": "A short description of this preset. Useful if you have multiple files", - "defaultValue": "Preset Name" + "readOnly": { + "description": "Generated by MultiWorld website", + "triforce_pieces_mode": "available", + "triforce_pieces_available": 30, + "triforce_pieces_required": 20, + "shuffle_prizes": "none", + "timer": "none", + "glitch_boots": "on", + "key_drop_shuffle": "off", + "experimental": "off", + "debug": "off" }, - "name": { - "keyString": "name", - "friendlyName": "Player Name", - "inputType": "text", - "description": "Displayed in-game. Spaces will be replaced with underscores.", - "defaultValue": "Your Name" - }, - "glitches_required": { - "keyString": "glitches_required", - "friendlyName": "Glitches Required", - "description": "Determine the logic required to complete the seed.", - "inputType": "range", - "subOptions": { - "none": { - "keyString": "glitches_required.none", - "friendlyName": "None", - "description": "No glitches required.", - "defaultValue": 50 - }, - "minor_glitches": { - "keyString": "glitches_required.minor_glitches", - "friendlyName": "Minor Glitches", - "description": "Puts fake flipper, water-walk, super bunny, etc into logic", - "defaultValue": 0 - }, - "overworld_glitches": { - "keyString": "glitches_required.overworld_glitches", - "friendlyName": "Overworld Glitches", - "description": "Assumes the player has knowledge of both overworld major glitches (boots clips, mirror clips) and minor glitches (fake flipper, super bunny shenanigans, water walk and etc.)", - "defaultValue": 0 - }, - "no_logic": { - "keyString": "glitches_required.no_logic", - "friendlyName": "No Logic", - "description": "Your items are placed with no regard to any logic. Your Fire Rod could be on your Trinexx.", - "defaultValue": 0 - } + "generalOptions": { + "name": "Player" + }, + "gameOptions": { + "glitches_required":{ + "type": "select", + "friendlyName": "Glitches Required", + "description": "Choose which glitches will be considered in-logic", + "defaultValue": "none", + "options": [ + { + "name": "None", + "value": "none" + }, + { + "name": "Minor Glitches", + "value": "minor_glitches" + }, + { + "name": "Overworld Glitches", + "value": "overworld_glitches" + }, + { + "name": "No Logic", + "value": "no_logic" } - }, + ] + }, "dark_room_logic": { - "keyString": "dark_room_logic", + "type": "select", "friendlyName": "Dark Room Logic", - "description": "Logic to use for dark rooms.", - "inputType": "range", - "subOptions": { - "lamp": { - "keyString": "dark_room_logic.lamp", - "friendlyName": "Lamp Required", - "description": "The lamp is required for dark rooms to be considered in logic.", - "defaultValue": 50 + "description": "Choose your logical access to dark rooms", + "defaultValue": "lamp", + "options": [ + { + "name": "Lamp Required", + "value": "lamp" }, - "torches": { - "keyString": "dark_room_logic.torches", - "friendlyName": "Lamp or Torches", - "description": "In addition to the lamp, a fire rod and accessible torches may put dark rooms into logic.", - "defaultValue": 0 + { + "name": "Torches Lightable", + "value": "torches" }, - "none": { - "keyString": "dark_room_logic.none", - "friendlyName": "Always in Logic", - "description": "Dark rooms are always considered in logic, which may require you to navigate rooms in complete darkness.", - "defaultValue": 0 + { + "name": "Always In-Logic", + "value": "none" } - } + ] }, - "map_shuffle": { - "keyString": "map_shuffle", - "friendlyName": "Map Shuffle", - "description": "Shuffle dungeon maps into the world and other dungeons, including other players' worlds.", - "inputType": "range", - "subOptions": { - "off": { - "keyString": "map_shuffle.off", - "friendlyName": "Off", - "description": "Disable map shuffle.", - "defaultValue": 50 + "dungeon_items": { + "type": "select", + "friendlyName": "Dungeon Item Shuffle", + "description": "Choose which dungeon items you want shuffled", + "defaultValue": "none", + "options": [ + { + "name": "None", + "value": "none" }, - "on": { - "keyString": "map_shuffle.on", - "friendlyName": "On", - "description": "Enable map shuffle.", - "defaultValue": 0 + { + "name": "Map & Compass", + "value": "mc" + }, + { + "name": "Small Keys Only", + "value": "s" + }, + { + "name": "Big Keys Only", + "value": "b" + }, + { + "name": "Full Keysanity", + "value": "mscb" } - } - }, - "compass_shuffle": { - "keyString": "compass_shuffle", - "friendlyName": "Compass Shuffle", - "description": "Shuffle compasses into the world and other dungeons, including other players' worlds", - "inputType": "range", - "subOptions": { - "off": { - "keyString": "compass_shuffle.off", - "friendlyName": "Off", - "description": "Disable compass shuffle.", - "defaultValue": 50 - }, - "on": { - "keyString": "compass_shuffle.on", - "friendlyName": "On", - "description": "Enable compass shuffle.", - "defaultValue": 0 - } - } - }, - "smallkey_shuffle": { - "keyString": "smallkey_shuffle", - "friendlyName": "Small Key Shuffle", - "description": "Shuffle small keys into the world and other dungeons, including other players' worlds.", - "inputType": "range", - "subOptions": { - "on": { - "keyString": "smallkey_shuffle.on", - "friendlyName": "On", - "description": "Enable small key shuffle.", - "defaultValue": 0 - }, - "off": { - "keyString": "smallkey_shuffle.off", - "friendlyName": "Off", - "description": "Disable small key shuffle.", - "defaultValue": 50 - }, - "universal": { - "keyString": "smallkey_shuffle.universal", - "friendlyName": "Universal", - "description": "Allows small keys to be used in any dungeon and adds keys to shops so you can buy more.", - "defaultValue": 0 - } - } - }, - "bigkey_shuffle": { - "keyString": "bigkey_shuffle", - "friendlyName": "Big Key Shuffle", - "description": "Shuffle big keys into the world and other dungeons, including other players' worlds.", - "inputType": "range", - "subOptions": { - "on": { - "keyString": "bigkey_shuffle.on", - "friendlyName": "On", - "description": "Enable big key shuffle.", - "defaultValue": 0 - }, - "off": { - "keyString": "bigkey_shuffle.off", - "friendlyName": "Off", - "description": "Disable big key shuffle.", - "defaultValue": 50 - } - } - }, - "local_keys": { - "keyString": "local_keys", - "friendlyName": "Local Keys", - "description": "Keep small keys and big keys local to your world.", - "inputType": "range", - "subOptions": { - "on": { - "keyString": "local_keys.on", - "friendlyName": "On", - "description": "Enable local keys.", - "defaultValue": 0 - }, - "off": { - "keyString": "local_keys.off", - "friendlyName": "Off", - "description": "Disable local keys.", - "defaultValue": 50 - } - } - }, - "dungeon_counters": { - "keyString": "dungeon_counters", - "friendlyName": "Dungeon Counters", - "description": "Determines when to show an on-screen counter for dungeon items.", - "inputType": "range", - "subOptions": { - "on": { - "keyString": "dungeon_counters.on", - "friendlyName": "Always On", - "description": "Always display amount of items checked in a dungeon.", - "defaultValue": 0 - }, - "pickup": { - "keyString": "dungeon_counters.pickup", - "friendlyName": "With Compass", - "description": "Show when compass is picked up.", - "defaultValue": 0 - }, - "default": { - "keyString": "dungeon_counters.default", - "friendlyName": "With Compass if Shuffled", - "description": "Show when the compass is picked up, if the compass was shuffled.", - "defaultValue": 0 - }, - "off": { - "keyString": "dungeon_counters.off", - "friendlyName": "Always Off", - "description": "Never show dungeon counters.", - "defaultValue": 50 - } - } + ] }, "accessibility": { - "keyString": "accessibility", - "friendlyName": "Location Access", - "description": "Determines how much of the game is guaranteed to be reachable.", - "inputType": "range", - "subOptions": { - "items": { - "keyString": "accessibility.items", - "friendlyName": "All Items", - "description": "Guarantees you will be able to acquire all items, but you may not be able to access all locations.", - "defaultValue": 0 + "type": "select", + "friendlyName": "Accessibility", + "description": "Choose how much of the world will be available", + "defaultValue": "locations", + "options": [ + { + "name": "Locations Guaranteed", + "value": "locations" }, - "locations": { - "keyString": "accessibility.locations", - "friendlyName": "All Locations", - "description": "Guarantees you will be able to access all locations, and therefore all items.", - "defaultValue": 50 + { + "name": "Items Guaranteed", + "value": "items" }, - "none": { - "keyString": "accessibility.none", - "friendlyName": "Required Only", - "description": "Guarantees only that the game is beatable. You may not be able to access all locations or acquire all items.", - "defaultValue": 0 + { + "name": "Beatable Only", + "value": "none" } - } + ] }, "progressive": { - "keyString": "progressive", + "type": "select", "friendlyName": "Progressive Items", - "description": "Enable or disable the progressive acquisition of certain items (swords, shields, bow).", - "inputType": "range", - "subOptions": { - "on": { - "keyString": "progressive.on", - "friendlyName": "On", - "description": "All relevant items are acquired progressively.", - "defaultValue": 50 + "description": "Turn progressive items on or off, or randomize them", + "defaultValue": "on", + "options": [ + { + "name": "All Progressive", + "value": "on" }, - "off": { - "keyString": "progressive.off", - "friendlyName": "Off", - "description": "All relevant items are acquired non-progressively (tempered sword may be in Link's House).", - "defaultValue": 0 + { + "name": "None Progressive", + "value": "off" }, - "random": { - "keyString": "progressive.random", - "friendlyName": "Random", - "description": "The progressive nature of items is determined per-item pool. Gloves may be progressive, but swords may not be.", - "defaultValue": 0 + { + "name": "Randomize Each", + "value": "random" } - } + ] }, "entrance_shuffle": { - "keyString": "entrance_shuffle", + "type": "select", "friendlyName": "Entrance Shuffle", - "description": "Determines how often and by what rules entrances are shuffled.", - "inputType": "range", - "subOptions": { - "none": { - "keyString": "entrance_shuffle.none", - "friendlyName": "Vanilla Entrances", - "description": "Vanilla game map. All entrances and exits lead to their original locations.", - "defaultValue": 50 + "description": "Shuffles the game map. Not recommended for beginners", + "defaultValue": "none", + "options": [ + { + "name": "None", + "value": "none" }, - "dungeonssimple": { - "keyString": "entrance_shuffle.dungeonssimple", - "friendlyName": "Dungeons Simple", - "description": "Shuffle whole dungeons amongst each other. Hyrule Castle would always be one dungeon.", - "defaultValue": 0 + { + "name": "Dungeon Entrances", + "value": "dungeonssimple" }, - "dungeonsfull": { - "keyString": "entrance_shuffle.dungeonsfull", - "friendlyName": "Dungeons Full", - "description": "Shuffle any dungeon entrance with any dungeon interior, so Hyrule Castle could be four different dungeons.", - "defaultValue": 0 + { + "name": "Dungeon Interiors", + "value": "dungeonsfull" }, - "simple": { - "keyString": "entrance_shuffle.simple", - "friendlyName": "Simple Shuffle", - "description": "Entrances are grouped together before being randomized. This option uses the most strict grouping rules.", - "defaultValue": 0 + { + "name": "Simple Entrances", + "value": "simple" }, - "restricted": { - "keyString": "entrance_shuffle.restricted", - "friendlyName": "Restricted Shuffle", - "description": "Entrances are grouped together before being randomized. Grouping rules are less strict than Simple Shuffle.", - "defaultValue": 0 + { + "name": "Restricted", + "value": "restricted" }, - "full": { - "keyString": "entrance_shuffle.full", - "friendlyName": "Full Shuffle", - "description": "Entrances are grouped before being randomized. Grouping rules are less strict than Restricted Shuffle.", - "defaultValue": 0 + { + "name": "Full Shuffle", + "value": "full" }, - "crossed": { - "keyString": "entrance_shuffle.crossed", - "friendlyName": "Crossed Shuffle", - "description": "Entrances are grouped before being randomized. Grouping rules are less strict than Full Shuffle.", - "defaultValue": 0 + { + "name": "Crossed Shuffle", + "value": "crossed" }, - "insanity": { - "keyString": "entrance_shuffle.insanity", - "friendlyName": "Insanity Shuffle", - "description": "Very few entrance grouping rules are applied. Good luck.", - "defaultValue": 0 + { + "name": "Insanity Shuffle", + "value": "insanity" } - } + ] }, "goals": { - "keyString": "goals", - "friendlyName": "Goals", - "description": "Determines how much work you need to put in to save Hyrule.", - "inputType": "range", - "subOptions": { - "ganon": { - "keyString": "goals.ganon", - "friendlyName": "Defeat Ganon", - "description": "Climb Ganon's Tower, defeat Agahnim, then defeat Ganon in his lair.", - "defaultValue": 50 + "type": "select", + "friendlyName": "Goal", + "description": "Choose the condition for winning the game", + "defaultValue": "ganon", + "options": [ + { + "name": "Kill Ganon", + "value": "ganon" }, - "fast_ganon": { - "keyString": "goals.fast_ganon", - "friendlyName": "Fast Ganon", - "description": "Kill Ganon in his lair. The hole is always open, but you may still require some crystals to damage him.", - "defaultValue": 0 + { + "name": "Fast Ganon (Pyramid Always Open)", + "value": "fast_ganon" }, - "dungeons": { - "keyString": "goals.dungeons", - "friendlyName": "All Dungeons", - "description": "Defeat the boss of all dungeons, defeat Agahnim in both Castle Tower and Ganon's Tower, then defeat Ganon in his lair.", - "defaultValue": 0 + { + "name": "All Dungeons", + "value": "dungeons" }, - "pedestal": { - "keyString": "goals.pedestal", - "friendlyName": "Pedestal", - "description": "Acquire all three pendants and pull the Triforce from the Master Sword Pedestal.", - "defaultValue": 0 + { + "name": "Master Sword Pedestal", + "value": "pedestal" }, - "ganon_pedestal": { - "keyString": "goals.ganon_pedestal", - "friendlyName": "Ganon Pedestal", - "description": "Accquire all three pendants, pull the Master Sword Pedestal, then defeat Ganon in his lair.", - "defaultValue": 0 - }, - "triforce_hunt": { - "keyString": "goals.triforce_hunt", - "friendlyName": "Triforce Hunt", - "description": "Collect enough pieces of the Triforce of Courage, which has been spread around the world, then turn them in to Murahadala, who is standing outside Hyrule Castle.", - "defaultValue": 0 - }, - "local_triforce_hunt": { - "keyString": "goals.local_triforce_hunt", - "friendlyName": "Local Triforce Hunt", - "description": "Same as Triforce Hunt, but the Triforce pieces are guaranteed to be in your world.", - "defaultValue": 0 - }, - "ganon_triforce_hunt": { - "keyString": "goals.ganon_triforce_hunt", - "friendlyName": "Triforce Hunt /w Ganon", - "description": "Same as Triforce Hunt, but you need to defeat Ganon in his lair instead of talking with Murahadala.", - "defaultValue": 0 - }, - "local_ganon_triforce_hunt": { - "keyString": "goals.local_ganon_triforce_hunt", - "friendlyName": "Local Triforce hunt /w Ganon", - "description": "Same as Local Triforce Hunt, but you need to defeat Ganon in his lair instead of talking with Murahadala.", - "defaultValue": 0 + { + "name": "Triforce Hunt", + "value": "triforce_hunt" } - } - }, - "triforce_pieces_required": { - "keyString": "triforce_pieces_required", - "friendlyName": "Triforce Pieces Required", - "description": "Determines the total number of Triforce pieces required before speaking with Murahadala", - "inputType": "range", - "subOptions": { - "15": { - "keyString": "triforce_pieces_required.15", - "friendlyName": 15, - "description": "15 Triforce pieces are required before speaking with Murahadala.", - "defaultValue": 0 - }, - "20": { - "keyString": "triforce_pieces_required.20", - "friendlyName": 20, - "description": "20 Triforce pieces are required before speaking with Murahadala.", - "defaultValue": 50 - }, - "30": { - "keyString": "triforce_pieces_required.30", - "friendlyName": 30, - "description": "30 Triforce pieces are required before speaking with Murahadala.", - "defaultValue": 0 - }, - "40": { - "keyString": "triforce_pieces_required.40", - "friendlyName": 40, - "description": "40 Triforce pieces are required before speaking with Murahadala.", - "defaultValue": 0 - }, - "50": { - "keyString": "triforce_pieces_required.50", - "friendlyName": 50, - "description": "50 Triforce pieces are required before speaking with Murahadala.", - "defaultValue": 0 - } - } - }, - "triforce_pieces_mode": { - "keyString": "triforce_pieces_mode", - "friendlyName": "Triforce Piece Availability Mode", - "description": "Determines which of the following three options will be used to determine the total available triforce pieces.", - "inputType": "range", - "subOptions": { - "available": { - "keyString": "triforce_pieces_mode.available", - "friendlyName": "Exact Number", - "description": "Explicitly tell the generator how many triforce pieces to place throughout Hyrule.", - "defaultValue": 50 - }, - "extra": { - "keyString": "triforce_pieces_mode.extra", - "friendlyName": "Required Plus", - "description": "Set the number of triforce pieces in Hyrule equal to the number of required pieces plus a number specified by this option.", - "defaultValue": 0 - }, - "percentage": { - "keyString": "triforce_pieces_mode.percentage", - "friendlyName": "Percentage", - "description": "Set the number of triforce pieces in Hyrule equal to the number of required pieces plus a percentage specified by this option.", - "defaultValue": 0 - } - } - }, - "triforce_pieces_available": { - "keyString": "triforce_pieces_available", - "friendlyName": "Exact Number (Triforce Hunt)", - "description": "Only used if enabled in Triforce Piece Availability Mode.", - "inputType": "range", - "subOptions": { - "25": { - "keyString": "triforce_pieces_available.25", - "friendlyName": 25, - "description": "25 Triforce pieces will be hidden throughout Hyrule", - "defaultValue": 0 - }, - "30": { - "keyString": "triforce_pieces_available.30", - "friendlyName": 30, - "description": "30 Triforce pieces will be hidden throughout Hyrule", - "defaultValue": 50 - }, - "40": { - "keyString": "triforce_pieces_available.40", - "friendlyName": 40, - "description": "40 Triforce pieces will be hidden throughout Hyrule", - "defaultValue": 0 - }, - "50": { - "keyString": "triforce_pieces_available.50", - "friendlyName": 50, - "description": "50 Triforce pieces will be hidden throughout Hyrule", - "defaultValue": 0 - } - } - }, - "triforce_pieces_extra": { - "keyString": "triforce_pieces_extra", - "friendlyName": "Required Plus (Triforce Hunt)", - "description": "Only used if enabled in Triforce Piece Availability Mode.", - "inputType": "range", - "subOptions": { - "0": { - "keyString": "triforce_pieces_extra.0", - "friendlyName": 0, - "description": "No extra Triforce pieces will be hidden throughout Hyrule", - "defaultValue": 0 - }, - "5": { - "keyString": "triforce_pieces_extra.5", - "friendlyName": 5, - "description": "5 extra Triforce pieces will be hidden throughout Hyrule", - "defaultValue": 0 - }, - "10": { - "keyString": "triforce_pieces_extra.10", - "friendlyName": 10, - "description": "10 extra Triforce pieces will be hidden throughout Hyrule", - "defaultValue": 50 - }, - "15": { - "keyString": "triforce_pieces_extra.15", - "friendlyName": 15, - "description": "15 extra Triforce pieces will be hidden throughout Hyrule", - "defaultValue": 0 - }, - "20": { - "keyString": "triforce_pieces_extra.20", - "friendlyName": 20, - "description": "20 extra Triforce pieces will be hidden throughout Hyrule", - "defaultValue": 0 - } - } - }, - "triforce_pieces_percentage": { - "keyString": "triforce_pieces_percentage", - "friendlyName": "Percentage (Triforce Hunt)", - "description": "Only used if enabled in Triforce Piece Availability Mode.", - "inputType": "range", - "subOptions": { - "100": { - "keyString": "triforce_pieces_percentage.100", - "friendlyName": "0%", - "description": "No extra Triforce pieces will be hidden throughout Hyrule", - "defaultValue": 0 - }, - "150": { - "keyString": "triforce_pieces_percentage.150", - "friendlyName": "50%", - "description": "50% more triforce pieces than required will be placed throughout Hyrule.", - "defaultValue": 50 - }, - "200": { - "keyString": "triforce_pieces_percentage.200", - "friendlyName": "100%", - "description": "50% more triforce pieces than required will be placed throughout Hyrule.", - "defaultValue": 0 - } - } + ] }, "tower_open": { - "keyString": "tower_open", - "friendlyName": "GT Crystals", - "description": "Determines the number of crystals required to open Ganon's Tower.", - "inputType": "range", - "subOptions": { - "0": { - "keyString": "tower_open.0", - "friendlyName": 0, - "description": "0 Crystals are required to open Ganon's Tower.", - "defaultValue": 80 + "type": "select", + "friendlyName": "Ganon's Tower Access", + "description": "Choose how many crystals are required to open Ganon's Tower", + "defaultValue": 7, + "options": [ + { + "name": "7 Crystals", + "value": 7 }, - "1": { - "keyString": "tower_open.1", - "friendlyName": 1, - "description": "1 Crystal is required to open Ganon's Tower.", - "defaultValue": 70 + { + "name": "6 Crystals", + "value": 6 }, - "2": { - "keyString": "tower_open.2", - "friendlyName": 2, - "description": "2 Crystals are required to open Ganon's Tower.", - "defaultValue": 60 + { + "name": "5 Crystals", + "value": 5 }, - "3": { - "keyString": "tower_open.3", - "friendlyName": 3, - "description": "3 Crystals are required to open Ganon's Tower.", - "defaultValue": 50 + { + "name": "4 Crystals", + "value": 4 }, - "4": { - "keyString": "tower_open.4", - "friendlyName": 4, - "description": "4 Crystals are required to open Ganon's Tower.", - "defaultValue": 40 + { + "name": "3 Crystals", + "value": 3 }, - "5": { - "keyString": "tower_open.5", - "friendlyName": 5, - "description": "5 Crystals are required to open Ganon's Tower.", - "defaultValue": 30 + { + "name": "2 Crystals", + "value": 2 }, - "6": { - "keyString": "tower_open.6", - "friendlyName": 6, - "description": "6 Crystals are required to open Ganon's Tower.", - "defaultValue": 20 + { + "name": "1 Crystals", + "value": 1 }, - "7": { - "keyString": "tower_open.7", - "friendlyName": 7, - "description": "7 Crystals are required to open Ganon's Tower.", - "defaultValue": 10 + { + "name": "0 Crystals", + "value": 0 }, - "random": { - "keyString": "tower_open.random", - "friendlyName": "Random", - "description": "Randomly determine the number of crystals necessary to open Ganon's Tower.", - "defaultValue": 0 + { + "name": "Random", + "value": "random" } - } + ] }, "ganon_open": { - "keyString": "ganon_open", - "friendlyName": "Ganon Crystals", - "description": "Determines the number of crystals required before you are able to damage Ganon.", - "inputType": "range", - "subOptions": { - "0": { - "keyString": "ganon_open.0", - "friendlyName": 0, - "description": "0 Crystals are required to damage Ganon.", - "defaultValue": 80 + "type": "select", + "friendlyName": "Ganon Vulnerable", + "description": "Choose how many crystals are required to kill Ganon", + "defaultValue": 7, + "options": [ + { + "name": "7 Crystals", + "value": 7 }, - "1": { - "keyString": "ganon_open.1", - "friendlyName": 1, - "description": "1 Crystal is required to damage Ganon.", - "defaultValue": 70 + { + "name": "6 Crystals", + "value": 6 }, - "2": { - "keyString": "ganon_open.2", - "friendlyName": 2, - "description": "2 Crystals are required to damage Ganon.", - "defaultValue": 60 + { + "name": "5 Crystals", + "value": 5 }, - "3": { - "keyString": "ganon_open.3", - "friendlyName": 3, - "description": "3 Crystals are required to damage Ganon.", - "defaultValue": 50 + { + "name": "4 Crystals", + "value": 4 }, - "4": { - "keyString": "ganon_open.4", - "friendlyName": 4, - "description": "4 Crystals are required to damage Ganon.", - "defaultValue": 40 + { + "name": "3 Crystals", + "value": 3 }, - "5": { - "keyString": "ganon_open.5", - "friendlyName": 5, - "description": "5 Crystals are required to damage Ganon.", - "defaultValue": 30 + { + "name": "2 Crystals", + "value": 2 }, - "6": { - "keyString": "ganon_open.6", - "friendlyName": 6, - "description": "6 Crystals are required to damage Ganon.", - "defaultValue": 20 + { + "name": "1 Crystals", + "value": 1 }, - "7": { - "keyString": "ganon_open.7", - "friendlyName": 7, - "description": "7 Crystals are required to damage Ganon.", - "defaultValue": 10 + { + "name": "0 Crystals", + "value": 0 }, - "random": { - "keyString": "ganon_open.random", - "friendlyName": "Random", - "description": "Randomly determine the number of crystals necessary to damage Ganon.", - "defaultValue": 0 + { + "name": "Random", + "value": "random" } - } + ] }, "mode": { - "keyString": "mode", - "friendlyName": "Game Mode", - "description": "Determines the mode, or world state, for your game.", - "inputType": "range", - "subOptions": { - "standard": { - "keyString": "mode.standard", - "friendlyName": "Standard Mode", - "description": "Begin the game by rescuing Zelda from her cell and escorting her to the Sanctuary.", - "defaultValue": 50 + "type": "select", + "friendlyName": "World State", + "description": "Choose the state of the game world", + "defaultValue": "standard", + "options": [ + { + "name": "Standard", + "value": "standard" }, - "open": { - "keyString": "mode.open", - "friendlyName": "Open Mode", - "description": "Begin the game from your choice of Link's House or the Sanctuary.", - "defaultValue": 50 + { + "name": "Open", + "value": "open" }, - "inverted": { - "keyString": "mode.inverted", - "friendlyName": "Inverted Mode", - "description": "Begin in the Dark World. The Moon Pearl is required to avoid bunny-state in Light World, and the Light World game map is altered.", - "defaultValue": 0 + { + "name": "Inverted", + "value": "inverted" } - } + ] }, "retro": { - "keyString": "retro", + "type": "select", "friendlyName": "Retro Mode", - "description": "Makes the game similar to the first Legend of Zelda. You must buy a quiver to use the bow, take-any caves and an old-man cave are added to the world, and you may need to find your sword from the old man's cave.", - "inputType": "range", - "subOptions": { - "on": { - "keyString": "retro.on", - "friendlyName": "On", - "description": "Enable retro mode.", - "defaultValue": 0 + "description": "Choose if you want to play in retro mode", + "defaultValue": "off", + "options": [ + { + "name": "Disabled", + "value": "off" }, - "off": { - "keyString": "retro.off", - "friendlyName": "Off", - "description": "Disable retro mode.", - "defaultValue": 50 + { + "name": "Enabled", + "value": "on" + }, + { + "name": "Classic (Universal Small Keys)", + "value": null, + "overrides": { + "retro": "on", + "dungeon_items": "+u" + } } - } + ] }, "hints": { - "keyString": "hints", - "friendlyName": "Hint Type", - "description": "Determines the behavior of hint tiles in dungeons", - "inputType": "range", - "subOptions": { - "on": { - "keyString": "hints.on", - "friendlyName": "Item Locations", - "description": "Hint tiles sometimes give item location hints.", - "defaultValue": 50 + "type": "select", + "friendlyName": "Tile Hints", + "description": "Choose to enable or disable tile hints", + "defaultValue": "on", + "options": [ + { + "name": "Enabled", + "value": "on" }, - "off": { - "keyString": "hints.off", - "friendlyName": "Gameplay Tips", - "description": "Hint tiles provide gameplay tips.", - "defaultValue": 0 + { + "name": "Disabled", + "value": "off" } - } + ] }, "weapons": { - "keyString": "weapons", - "friendlyName": "Sword Placement", - "description": "Determines how swords are placed throughout the world.", - "inputType": "range", - "subOptions": { - "randomized": { - "keyString": "weapons.randomized", - "friendlyName": "Randomized", - "description": "Swords are placed randomly throughout the world.", - "defaultValue": 0 + "type": "select", + "friendlyName": "Sword Locations", + "description": "Choose where you will find your swords", + "defaultValue": "assured", + "options": [ + { + "name": "Assured", + "value": "assured" }, - "assured": { - "keyString": "weapons.assured", - "friendlyName": "Assured", - "description": "Begin the game with a sword. Other swords are placed randomly throughout the game world.", - "defaultValue": 50 + { + "name": "Vanilla", + "value": "vanilla" }, - "vanilla": { - "keyString": "weapons.vanilla", - "friendlyName": "Vanilla Locations", - "description": "Swords are placed in vanilla locations in your own game (uncle, pedestal, smiths, pyramid fairy).", - "defaultValue": 0 + { + "name": "Swordless", + "value": "swordless" }, - "swordless": { - "keyString": "weapons.swordless", - "friendlyName": "Swordless", - "description": "Your swords are replaced with rupees. Gameplay changes are made to accommodate this change.", - "defaultValue": 0 + { + "name": "Randomized", + "value": "randomized" } - } + ] }, "item_pool": { - "keyString": "item_pool", + "type": "select", "friendlyName": "Item Pool", - "description": "Determines the availability of upgrades, progressive items, and convenience items.", - "inputType": "range", - "subOptions": { - "easy": { - "keyString": "item_pool.easy", - "friendlyName": "Easy", - "description": "Double the number of available upgrades and progressive items.", - "defaultValue": 0 + "description": "Changes the available upgrade items (1/2 Magic, hearts, sword upgrades, etc)", + "defaultValue": "normal", + "options": [ + { + "name": "Easy", + "value": "easy" }, - "normal": { - "keyString": "item_pool.normal", - "friendlyName": "Normal", - "description": "Item availability remains unchanged from the vanilla game.", - "defaultValue": 50 + { + "name": "Normal", + "value": "normal" }, - "hard": { - "keyString": "item_pool.hard", - "friendlyName": "Hard", - "description": "Reduced upgrade availability (max: 14 hearts, blue mail, tempered sword, fire shield, no silvers unless swordless).", - "defaultValue": 0 + { + "name": "Hard", + "value": "hard" }, - "expert": { - "keyString": "item_pool.expert", - "friendlyName": "Expert", - "description": "Minimum upgrade availability (max: 8 hearts, green mail, master sword, fighter shield, no silvers unless swordless).", - "defaultValue": 0 + { + "name": "Expert", + "value": "expert" } - } + ] }, "item_functionality": { - "keyString": "item_functionality", + "type": "select", "friendlyName": "Item Functionality", - "description": "Alters the usefulness of various items in the game.", - "inputType": "range", - "subOptions": { - "easy": { - "keyString": "item_functionality.easy", - "friendlyName": "Easy", - "description": "Increases helpfulness of items. Medallions are usable everywhere, even without a sword. Hammer can be used in place of master sword to beat ganon and collect the tablets.", - "defaultValue": 0 + "description": "Changes the abilities of your items", + "defaultValue": "normal", + "options": [ + { + "name": "Easy", + "value": "easy" }, - "normal": { - "keyString": "item_functionality.normal", - "friendlyName": "Normal", - "description": "Item functionality remains unchanged from the vanilla game.", - "defaultValue": 50 + { + "name": "Normal", + "value": "normal" }, - "hard": { - "keyString": "item_functionality.hard", - "friendlyName": "Hard", - "description": "Reduced helpfulness of items. Potions are less effective, you can't catch faeries, the Magic Cape uses double magic, the Cane of Byrna does not grant invulnerability, boomerangs do not stun, and silver arrows are disabled outside ganon.", - "defaultValue": 0 + { + "name": "Hard", + "value": "hard" }, - "expert": { - "keyString": "item_functionality.expert", - "friendlyName": "Expert", - "description": "Vastly reduces the helpfulness of items. Potions are barely effective, you can't catch faeries, the Magic Cape uses double magic, the Cane of Byrna does not grant invulnerability, boomerangs and hookshot do not stun, and the silver arrows are disabled outside ganon.", - "defaultValue": 0 + { + "name": "Expert", + "value": "expert" } - } - }, - "progression_balancing": { - "keyString": "progression_balancing", - "friendlyName": "Progression Balancing", - "description": "A system to reduce time spent in BK mode. It moves your items into an earlier access sphere to make it more likely you have access to progression items.", - "inputType": "range", - "subOptions": { - "on": { - "keyString": "progression_balancing.on", - "friendlyName": "On", - "description": "Enable progression balancing.", - "defaultValue": 50 - }, - "off": { - "keyString": "progression_balancing.off", - "friendlyName": "Off", - "description": "Disable progression balancing.", - "defaultValue": 0 - } - } - }, - "boss_shuffle": { - "keyString": "boss_shuffle", - "friendlyName": "Boss Shuffle", - "description": "Determines which boss appears in which dungeon.", - "inputType": "range", - "subOptions": { - "none": { - "keyString": "boss_shuffle.none", - "friendlyName": "None", - "description": "Bosses appear in vanilla locations.", - "defaultValue": 50 - }, - "simple": { - "keyString": "boss_shuffle.simple", - "friendlyName": "Simple", - "description": "Existing bosses except Ganon and Agahnim are shuffled throughout dungeons.", - "defaultValue": 0 - }, - "full": { - "keyString": "boss_shuffle.full", - "friendlyName": "Full", - "description": "Bosses are shuffled, and three of them may occur twice.", - "defaultValue": 0 - }, - "random": { - "keyString": "boss_shuffle.random", - "friendlyName": "Random", - "description": "Any boss may appear any number of times.", - "defaultValue": 0 - }, - "singularity": { - "keyString": "boss_shuffle.singularity", - "friendlyName": "Singularity", - "description": "Picks a boss at random and puts it in every dungeon it can appear in. Remaining dungeons bosses are chosen at random.", - "defaultValue": 0 - } - } + ] }, "enemy_shuffle": { - "keyString": "enemy_shuffle", + "type": "select", "friendlyName": "Enemy Shuffle", - "description": "Randomizes which enemies appear throughout the game.", - "inputType": "range", - "subOptions": { - "on": { - "keyString": "enemy_shuffle.on", - "friendlyName": "On", - "description": "Enable enemy shuffle.", - "defaultValue": 0 + "description": "Randomize the enemies which appear throughout the game", + "defaultValue": "off", + "options": [ + { + "name": "Disabled", + "value": "off" }, - "off": { - "keyString": "enemy_shuffle.off", - "friendlyName": "Off", - "description": "Disable enemy shuffle.", - "defaultValue": 50 + { + "name": "Enabled", + "value": "on" } - } + ] }, - "killable_thieves": { - "keyString": "killable_thieves", - "friendlyName": "Killable Thieves", - "description": "Determines whether thieves may be killed or not.", - "inputType": "range", - "subOptions": { - "on": { - "keyString": "killable_thieves.on", - "friendlyName": "On", - "description": "Thieves are mortal.", - "defaultValue": 0 + "boss_shuffle": { + "type": "select", + "friendlyName": "Boss Shuffle", + "description": "Shuffle the bosses within dungeons", + "defaultValue": "none", + "options": [ + { + "name": "Disabled", + "value": "none" }, - "off": { - "keyString": "killable_thieves.off", - "friendlyName": "Off", - "description": "Thieves are invulnerable.", - "defaultValue": 50 + { + "name": "Simple", + "value": "simple" + }, + { + "name": "Full", + "value": "full" + }, + { + "name": "Singularity", + "value": "singularity" + }, + { + "name": "Random", + "value": "random" } - } - }, - "tile_shuffle": { - "keyString": "tile_shuffle", - "friendlyName": "Tile Shuffle", - "description": "Randomizes tile layouts in rooms where floor tiles attack you.", - "inputType": "range", - "subOptions": { - "on": { - "keyString": "tile_shuffle.on", - "friendlyName": "On", - "description": "Enable tile shuffle.", - "defaultValue": 0 - }, - "off": { - "keyString": "tile_shuffle.off", - "friendlyName": "Off", - "description": "Disable tile shuffle.", - "defaultValue": 50 - } - } - }, - "bush_shuffle": { - "keyString": "bush_shuffle", - "friendlyName": "Bush Shuffle", - "description": "Randomize the chance that bushes around Hyrule have enemies hiding under them.", - "inputType": "range", - "subOptions": { - "on": { - "keyString": "bush_shuffle.on", - "friendlyName": "On", - "description": "Enable bush shuffle.", - "defaultValue": 0 - }, - "off": { - "keyString": "bush_shuffle.off", - "friendlyName": "Off", - "description": "Disable bush shuffle.", - "defaultValue": 50 - } - } - }, - "enemy_damage": { - "keyString": "enemy_damage", - "friendlyName": "Enemy Damage", - "description": "Randomizes how much damage enemies can deal to you.", - "inputType": "range", - "subOptions": { - "default": { - "keyString": "enemy_damage.default", - "friendlyName": "Vanilla Damage", - "description": "Enemies deal the same damage as in the vanilla game.", - "defaultValue": 50 - }, - "shuffled": { - "keyString": "enemy_damage.shuffled", - "friendlyName": "Shuffled", - "description": "Enemies deal zero to four hearts of damage, and armor reduces this damage.", - "defaultValue": 0 - }, - "random": { - "keyString": "enemy_damage.random", - "friendlyName": "Random", - "description": "Enemies may deal zero through eight hearts of damage, and armor re-shuffles how much damage you take from each enemy.", - "defaultValue": 0 - } - } - }, - "enemy_health": { - "keyString": "enemy_health", - "friendlyName": "Enemy Health", - "description": "Randomizes the amount of health enemies have. Does not affect bosses.", - "inputType": "range", - "subOptions": { - "default": { - "keyString": "enemy_health.default", - "friendlyName": "Vanilla", - "description": "Enemies have the same amount of health as in the vanilla game.", - "defaultValue": 50 - }, - "easy": { - "keyString": "enemy_health.easy", - "friendlyName": "Reduced", - "description": "Enemies have generally reduced health.", - "defaultValue": 0 - }, - "hard": { - "keyString": "enemy_health.hard", - "friendlyName": "Increased", - "description": "Enemies have generally increased health.", - "defaultValue": 0 - }, - "expert": { - "keyString": "enemy_health.expert", - "friendlyName": "Armor-Plated", - "description": "Enemies will be very heard to defeat.", - "defaultValue": 0 - } - } - }, - "pot_shuffle": { - "keyString": "pot_shuffle", - "friendlyName": "Pot Shuffle", - "description": "Keys, items, and buttons hidden under pots in dungeons may be shuffled with other pots in their super-tile.", - "inputType": "range", - "subOptions": { - "on": { - "keyString": "pot_shuffle.on", - "friendlyName": "On", - "description": "Enable pot shuffle.", - "defaultValue": 0 - }, - "off": { - "keyString": "pot_shuffle.off", - "friendlyName": "Off", - "description": "Disable pot shuffle.", - "defaultValue": 50 - } - } - }, - "beemizer": { - "keyString": "beemizer", - "friendlyName": "Beemizer", - "description": "Remove items from the global item pool and replace them with single bees and bee traps.", - "inputType": "range", - "subOptions": { - "0": { - "keyString": "beemizer.0", - "friendlyName": "Level 0", - "description": "No bee traps are placed.", - "defaultValue": 50 - }, - "1": { - "keyString": "beemizer.1", - "friendlyName": "Level 1", - "description": "25% of the non-essential item pool is replaced with bee traps.", - "defaultValue": 1 - }, - "2": { - "keyString": "beemizer.2", - "friendlyName": "Level 2", - "description": "60% of the non-essential item pool is replaced with bee traps, of which 20% could be single bees.", - "defaultValue": 2 - }, - "3": { - "keyString": "beemizer.3", - "friendlyName": "Level 3", - "description": "100% of the non-essential item pool is replaced with bee traps, of which 50% could be single bees.", - "defaultValue": 3 - }, - "4": { - "keyString": "beemizer.4", - "friendlyName": "Level 4", - "description": "100% of the non-essential item pool is replaced with bee traps.", - "defaultValue": 4 - } - } + ] }, "shop_shuffle": { - "keyString": "shop_shuffle", + "type": "select", "friendlyName": "Shop Shuffle", - "description": "Alters the inventory and prices of shops.", - "inputType": "range", - "subOptions": { - "none": { - "keyString": "shop_shuffle.none", - "friendlyName": "Vanilla Shops", - "description": "Shop contents are left unchanged.", - "defaultValue": 50 + "description": "Shuffles the content and prices of shops throughout Hyrule", + "defaultValue": "none", + "options": [ + { + "name": "None", + "value": "none" }, - "i": { - "keyString": "shop_shuffle.i", - "friendlyName": "Inventory Shuffle", - "description": "Randomizes the inventories of shops.", - "defaultValue": 0 + { + "name": "Shuffle Inventory", + "value": "i" }, - "p": { - "keyString": "shop_shuffle.p", - "friendlyName": "Price Shuffle", - "description": "Randomizes the price of items sold in shops.", - "defaultValue": 0 + { + "name": "Shuffle Prices", + "value": "p" }, - "u": { - "keyString": "shop_shuffle.u", - "friendlyName": "Capacity Upgrades", - "description": "Shuffles capacity upgrades throughout the game world.", - "defaultValue": 0 - }, - "ip": { - "keyString": "shop_shuffle.ip", - "friendlyName": "Inventory & Prices", - "description": "Shuffles the inventory and randomizes the prices of items in shops.", - "defaultValue": 0 - }, - "uip": { - "keyString": "shop_shuffle.uip", - "friendlyName": "Full Shuffle", - "description": "Shuffles the inventory and randomizes the prices of items in shops. Also distributes capacity upgrades throughout the world.", - "defaultValue": 0 + { + "name": "Shuffle Both", + "value": "ip" } - } - }, - "shuffle_prizes": { - "keyString": "shuffle_prizes", - "friendlyName": "Prize Shuffle", - "description": "Alters the Prizes from pulling, bonking, enemy kills, digging, and hoarders", - "inputType": "range", - "subOptions": { - "none": { - "keyString": "shuffle_prizes.none", - "friendlyName": "None", - "description": "All prizes from pulling, bonking, enemy kills, digging, hoarders are vanilla.", - "defaultValue": 0 - }, - "g": { - "keyString": "shuffle_prizes.g", - "friendlyName": "\"General\" prize shuffle", - "description": "Shuffles the prizes from pulling, enemy kills, digging, hoarders", - "defaultValue": 50 - }, - "b": { - "keyString": "shuffle_prizes.b", - "friendlyName": "Bonk prize shuffle", - "description": "Shuffles the prizes from bonking into trees.", - "defaultValue": 0 - }, - "bg": { - "keyString": "shuffle_prizes.bg", - "friendlyName": "Both", - "description": "Shuffles both of the options.", - "defaultValue": 0 - } - } - }, - "timer": { - "keyString": "timer", - "friendlyName": "Timed Modes", - "description": "Add a timer to the game UI, and cause it to have various effects.", - "inputType": "range", - "subOptions": { - "none": { - "keyString": "timer.none", - "friendlyName": "Disabled", - "description": "No timed mode is applied to the game.", - "defaultValue": 50 - }, - "timed": { - "keyString": "timer.timed", - "friendlyName": "Timed Mode", - "description": "Starts with clock at zero. Green clocks subtract 4 minutes (total 20). Blue clocks subtract 2 minutes (total 10). Red clocks add two minutes (total 10). Winner is the player with the lowest time at the end.", - "defaultValue": 0 - }, - "timed_ohko": { - "keyString": "timer.timed_ohko", - "friendlyName": "Timed OHKO", - "description": "Starts the clock at ten minutes. Green clocks add five minutes (total 25). As long as the clock as at zero, Link will die in one hit.", - "defaultValue": 0 - }, - "ohko": { - "keyString": "timer.ohko", - "friendlyName": "One-Hit KO", - "description": "Timer always at zero. Permanent OHKO.", - "defaultValue": 0 - }, - "timed_countdown": { - "keyString": "timer.timed_countdown", - "friendlyName": "Timed Countdown", - "description": "Starts the clock with forty minutes. Same clocks as timed mode, but if the clock hits zero you lose. You can still keep playing, though.", - "defaultValue": 0 - }, - "display": { - "keyString": "timer.display", - "friendlyName": "Timer Only", - "description": "Displays a timer, but otherwise does not affect gameplay or the item pool.", - "defaultValue": 0 - } - } - }, - "countdown_start_time": { - "keyString": "countdown_start_time", - "friendlyName": "Countdown Starting Time", - "description": "The amount of time, in minutes, to start with in Timed Countdown and Timed OHKO modes.", - "inputType": "range", - "subOptions": { - "0": { - "keyString": "countdown_start_time.0", - "friendlyName": 0, - "description": "Start with no time on the timer. In Timed OHKO mode, start in OHKO mode.", - "defaultValue": 0 - }, - "10": { - "keyString": "countdown_start_time.10", - "friendlyName": 10, - "description": "Start with 10 minutes on the timer.", - "defaultValue": 50 - }, - "20": { - "keyString": "countdown_start_time.20", - "friendlyName": 20, - "description": "Start with 20 minutes on the timer.", - "defaultValue": 0 - }, - "30": { - "keyString": "countdown_start_time.30", - "friendlyName": 30, - "description": "Start with 30 minutes on the timer.", - "defaultValue": 0 - }, - "60": { - "keyString": "countdown_start_time.60", - "friendlyName": 60, - "description": "Start with an hour on the timer.", - "defaultValue": 0 - } - } - }, - "red_clock_time": { - "keyString": "red_clock_time", - "friendlyName": "Red Clock Time", - "description": "The amount of time, in minutes, to add to or subtract from the timer upon picking up a red clock.", - "inputType": "range", - "subOptions": { - "-2": { - "keyString": "red_clock_time.-2", - "friendlyName": -2, - "description": "Subtract 2 minutes from the timer upon picking up a red clock.", - "defaultValue": 0 - }, - "1": { - "keyString": "red_clock_time.1", - "friendlyName": 1, - "description": "Add a minute to the timer upon picking up a red clock.", - "defaultValue": 50 - } - } - }, - "blue_clock_time": { - "keyString": "blue_clock_time", - "friendlyName": "Blue Clock Time", - "description": "The amount of time, in minutes, to add to or subtract from the timer upon picking up a blue clock.", - "inputType": "range", - "subOptions": { - "1": { - "keyString": "blue_clock_time.1", - "friendlyName": 1, - "description": "Add a minute to the timer upon picking up a blue clock.", - "defaultValue": 0 - }, - "2": { - "keyString": "blue_clock_time.2", - "friendlyName": 2, - "description": "Add 2 minutes to the timer upon picking up a blue clock.", - "defaultValue": 50 - } - } - }, - "green_clock_time": { - "keyString": "green_clock_time", - "friendlyName": "Green Clock Time", - "description": "The amount of time, in minutes, to add to or subtract from the timer upon picking up a green clock.", - "inputType": "range", - "subOptions": { - "4": { - "keyString": "green_clock_time.4", - "friendlyName": 4, - "description": "Add 4 minutes to the timer upon picking up a green clock.", - "defaultValue": 50 - }, - "10": { - "keyString": "green_clock_time.10", - "friendlyName": 10, - "description": "Add 10 minutes to the timer upon picking up a green clock.", - "defaultValue": 0 - }, - "15": { - "keyString": "green_clock_time.15", - "friendlyName": 15, - "description": "Add 15 minutes to the timer upon picking up a green clock.", - "defaultValue": 0 - } - } - }, - "glitch_boots": { - "keyString": "glitch_boots", - "friendlyName": "Glitch Boots", - "description": "Start with Pegasus Boots in any glitched logic mode that makes use of them.", - "inputType": "range", - "subOptions": { - "on": { - "keyString": "glitch_boots.on", - "friendlyName": "On", - "description": "Enable glitch boots.", - "defaultValue": 50 - }, - "off": { - "keyString": "glitch_boots.off", - "friendlyName": "Off", - "description": "Disable glitch boots.", - "defaultValue": 0 - } - } - }, - "door_shuffle": { - "keyString": "door_shuffle", - "friendlyName": "Door Shuffle", - "description": "Shuffles the interior layout of dungeons. Only available if the host rolls the game using the doors version of the generator.", - "inputType": "range", - "subOptions": { - "vanilla": { - "keyString": "door_shuffle.vanilla", - "friendlyName": "Vanilla", - "description": "Doors within dungeons remain unchanged from the vanilla game.", - "defaultValue": 50 - }, - "basic": { - "keyString": "door_shuffle.basic", - "friendlyName": "Basic", - "description": "Dungeons are shuffled within themselves.", - "defaultValue": 0 - }, - "crossed": { - "keyString": "door_shuffle.crossed", - "friendlyName": "Crossed", - "description": "Dungeons are shuffled across each other. Eastern may contain POD, Mire, and Hera.", - "defaultValue": 0 - } - } - }, - "intensity": { - "keyString": "intensity", - "friendlyName": "Door Shuffle Intensity Level", - "description": "Specifies what types of doors will be shuffled.", - "inputType": "range", - "subOptions": { - "1": { - "keyString": "intensity.1", - "friendlyName": "Level 1", - "description": "Doors and spiral staircases will be shuffled amongst themselves.", - "defaultValue": 50 - }, - "2": { - "keyString": "intensity.2", - "friendlyName": "Level 2", - "description": "Doors, open edges, and straight stair cases are shuffled amongst each other. Spiral staircases will be shuffled amongst themselves.", - "defaultValue": 0 - }, - "3": { - "keyString": "intensity.3", - "friendlyName": "Level 3", - "description": "Level 2 plus lobby shuffling, which means any non-dead-end supertile with a south-facing door may become a dungeon entrance.", - "defaultValue": 0 - }, - "random": { - "keyString": "intensity.random", - "friendlyName": "Random", - "description": "Randomly chooses an intensity level from 1-3.", - "defaultValue": 0 - } - } - }, - "key_drop_shuffle": { - "keyString": "key_drop_shuffle", - "friendlyName": "Key Drop Shuffle", - "description": "Allows the small/big keys dropped by enemies/pots to be shuffled into the item pool. This extends the number of checks from 216 to 249", - "inputType": "range", - "subOptions": { - "on": { - "keyString": "key_drop_shuffle.on", - "friendlyName": "Enabled", - "description": "Enables key drop shuffle", - "defaultValue": 0 - }, - "off": { - "keyString": "key_drop_shuffle.off", - "friendlyName": "Disabled", - "description": "Disables key drop shuffle", - "defaultValue": 50 - } - } + ] } }, "romOptions": { "disablemusic": { - "keyString": "rom.disablemusic", + "type": "select", "friendlyName": "Game Music", - "description": "Enable or disable all in-game music. Sound-effects are unaffected.", - "inputType": "range", - "subOptions": { - "on": { - "keyString": "rom.disablemusic.on", - "friendlyName": "Disabled", - "description": "Disables in-game music.", - "defaultValue": 0 + "description": "Choose to enable or disable in-game music", + "defaultValue": "off", + "options": [ + { + "name": "Enabled", + "value": "off" }, - "off": { - "keyString": "rom.disablemusic.off", - "friendlyName": "Enabled", - "description": "Enables in-game music.", - "defaultValue": 50 + { + "name": "Disabled", + "value": "on" } - } + ] }, "quickswap": { - "keyString": "rom.quickswap", + "type": "select", "friendlyName": "Item Quick-Swap", - "description": "Quickly change items by pressing the L+R shoulder buttons. Pressing L+R at the same time toggles the in-slot item (arrows and silver arrows, for example).", - "inputType": "range", - "subOptions": { - "on": { - "keyString": "rom.quickswap.on", - "friendlyName": "Enabled", - "description": "Enable quick-swap.", - "defaultValue": 0 + "description": "Enable or disable quick-swap using the L+R buttons", + "defaultValue": "on", + "options": [ + { + "name": "Enabled", + "value": "on" }, - "off": { - "keyString": "rom.quickswap.off", - "friendlyName": "Disabled", - "description": "Disable quick-swap.", - "defaultValue": 50 + { + "name": "Disabled", + "value": "off" } - } + ] }, "menuspeed": { - "keyString": "menuspeed", + "type": "select", "friendlyName": "Menu Speed", - "description": "Choose how fast the in-game menu opens and closes.", - "inputType": "range", - "subOptions": { - "normal": { - "keyString": "rom.menuspeed.normal", - "friendlyName": "Vanilla", - "description": "Menu speed is unchanged from the vanilla game.", - "defaultValue": 50 + "description": "Changes the animation speed of the in-game menu", + "defaultValue": "normal", + "options": [ + { + "name": "Normal", + "value": "normal" }, - "instant": { - "keyString": "rom.menuspeed.instant", - "friendlyName": "Instant", - "description": "The in-game menu appears and disappears instantly.", - "defaultValue": 0 + { + "name": "Instant", + "value": "instant" }, - "double": { - "keyString": "rom.menuspeed.double", - "friendlyName": "Double Speed", - "description": "The in-game menu animation moves at double speed.", - "defaultValue": 0 + { + "name": "Double", + "value": "double" }, - "triple": { - "keyString": "rom.menuspeed.triple", - "friendlyName": "Triple Speed", - "description": "The in-game menu animation moves at triple speed.", - "defaultValue": 0 + { + "name": "Triple", + "value": "triple" }, - "quadruple": { - "keyString": "rom.menuspeed.quadruple", - "friendlyName": "Quadruple Speed", - "description": "The in-game menu animation moves at quadruple speed.", - "defaultValue": 0 + { + "name": "Quadruple", + "value": "quadruple" }, - "half": { - "keyString": "rom.menuspeed.half", - "friendlyName": "Half Speed", - "description": "The in-game menu animation moves at half speed.", - "defaultValue": 0 + { + "name": "Half-Speed", + "value": "half" } - } + ] }, "heartcolor": { - "keyString": "rom.heartcolor", + "type": "select", "friendlyName": "Heart Color", - "description": "Changes the color of your in-game health hearts.", - "inputType": "range", - "subOptions": { - "red": { - "keyString": "rom.heartcolor.red", - "friendlyName": "Red", - "description": "Health hearts are red.", - "defaultValue": 50 + "description": "Change the color of your hearts in-game", + "defaultValue": "red", + "options": [ + { + "name": "Red", + "value": "red" }, - "blue": { - "keyString": "rom.heartcolor.blue", - "friendlyName": "Blue", - "description": "Health hearts are blue.", - "defaultValue": 0 + { + "name": "Blue", + "value": "blue" }, - "green": { - "keyString": "rom.heartcolor.green", - "friendlyName": "Green", - "description": "Health hearts are green.", - "defaultValue": 0 + { + "name": "Green", + "value": "green" }, - "yellow": { - "keyString": "rom.heartcolor.yellow", - "friendlyName": "Yellow", - "description": "Health hearts are yellow.", - "defaultValue": 0 + { + "name": "Yellow", + "value": "yellow" }, - "random": { - "keyString": "rom.heartcolor.random", - "friendlyName": "Random", - "description": "Health heart color is chosen randomly from red, green, blue, and yellow.", - "defaultValue": 0 + { + "name": "Random", + "value": "random" } - } + ] }, "heartbeep": { - "keyString": "rom.heartbeep", - "friendlyName": "Heart Beep Speed", - "description": "Controls the frequency of the low-health beeping.", - "inputType": "range", - "subOptions": { - "double": { - "keyString": "rom.heartbeep.double", - "friendlyName": "Double", - "description": "Doubles the frequency of the low-health beep.", - "defaultValue": 0 + "type": "select", + "friendlyName": "Heart-Beep Speed", + "description": "Change the frequency of the heart beep alert when you are at low health", + "defaultValue": "normal", + "options": [ + { + "name": "Double Speed", + "value": "double" }, - "normal": { - "keyString": "rom.heartbeep.normal", - "friendlyName": "Vanilla", - "description": "Heart beep frequency is unchanged from the vanilla game.", - "defaultValue": 50 + { + "name": "Normal", + "value": "normal" }, - "half": { - "keyString": "rom.heartbeep.half", - "friendlyName": "Half Speed", - "description": "Heart beep plays at half-speed.", - "defaultValue": 0 + { + "name": "Half-Speed", + "value": "half" }, - "quarter": { - "keyString": "rom.heartbeep.quarter", - "friendlyName": "Quarter Speed", - "description": "Heart beep plays at one quarter-speed.", - "defaultValue": 0 + { + "name": "Quarter-Speed", + "value": "quarter" }, - "off": { - "keyString": "rom.heartbeep.off", - "friendlyName": "Disabled", - "description": "Disables the low-health heart beep.", - "defaultValue": 0 + { + "name": "Disabled", + "value": "off" } - } + ] }, "ow_palettes": { - "keyString": "rom.ow_palettes", + "type": "select", "friendlyName": "Overworld Palette", - "description": "Randomize the colors of the overworld, within reason.", - "inputType": "range", - "subOptions": { - "default": { - "keyString": "rom.ow_palettes.default", - "friendlyName": "Vanilla", - "description": "Overworld colors will remain unchanged.", - "defaultValue": 50 + "description": "Change the colors of the overworld", + "defaultValue": "default", + "options": [ + { + "name": "Vanilla", + "value": "default" }, - "random": { - "keyString": "rom.ow_palettes.random", - "friendlyName": "Random", - "description": "Shuffles the colors of the overworld palette.", - "defaultValue": 0 - }, - "blackout": { - "keyString": "rom.ow_palettes.blackout", - "friendlyName": "Blackout", - "description": "Never use this. Makes all overworld palette colors black.", - "defaultValue": 0 - }, - "grayscale": { - "keyString": "rom.ow_palettes.grayscale", - "friendlyName": "Grayscale", - "description": "Removes all saturation of colors.", - "defaultValue": 0 - }, - "negative": { - "keyString": "rom.ow_palettes.negative", - "friendlyName": "Negative", - "description": "Invert all colors", - "defaultValue": 0 - }, - "classic": { - "keyString": "rom.ow_palettes.classic", - "friendlyName": "Classic", - "description": "Produces results similar to the website.", - "defaultValue": 0 - }, - "dizzy": { - "keyString": "rom.ow_palettes.dizzy", - "friendlyName": "Dizzy", - "description": "No logic in colors but saturation and lightness are conserved.", - "defaultValue": 0 - }, - "sick": { - "keyString": "rom.ow_palettes.sick", - "friendlyName": "Sick", - "description": "No logic in colors but lightness is conserved.", - "defaultValue": 0 - }, - "puke": { - "keyString": "rom.ow_palettes.Puke", - "friendlyName": "Puke", - "description": "No logic at all.", - "defaultValue": 0 + { + "name": "Shuffled", + "value": "random" } - } + ] }, "uw_palettes": { - "keyString": "rom.uw_palettes", - "friendlyName": "Underworld Palettes", - "description": "Randomize the colors of the underworld (caves, dungeons, etc.), within reason.", - "inputType": "range", - "subOptions": { - "default": { - "keyString": "rom.uw_palettes.default", - "friendlyName": "Vanilla", - "description": "Underworld colors will remain unchanged.", - "defaultValue": 50 + "type": "select", + "friendlyName": "Underworld Palette", + "description": "Change the colors of the underworld", + "defaultValue": "default", + "options": [ + { + "name": "Vanilla", + "value": "default" }, - "random": { - "keyString": "rom.uw_palettes.random", - "friendlyName": "Random", - "description": "Shuffles the colors of the underworld palette.", - "defaultValue": 0 - }, - "blackout": { - "keyString": "rom.uw_palettes.blackout", - "friendlyName": "Blackout", - "description": "Never use this. Makes all underworld palette colors black.", - "defaultValue": 0 - }, - "grayscale": { - "keyString": "rom.uw_palettes.grayscale", - "friendlyName": "Grayscale", - "description": "Removes all saturation of colors.", - "defaultValue": 0 - }, - "negative": { - "keyString": "rom.uw_palettes.negative", - "friendlyName": "Negative", - "description": "Invert all colors", - "defaultValue": 0 - }, - "classic": { - "keyString": "rom.uw_palettes.classic", - "friendlyName": "Classic", - "description": "Produces results similar to the website.", - "defaultValue": 0 - }, - "dizzy": { - "keyString": "rom.uw_palettes.dizzy", - "friendlyName": "Dizzy", - "description": "No logic in colors but saturation and lightness are conserved.", - "defaultValue": 0 - }, - "sick": { - "keyString": "rom.uw_palettes.sick", - "friendlyName": "Sick", - "description": "No logic in colors but lightness is conserved.", - "defaultValue": 0 - }, - "puke": { - "keyString": "rom.uw_palettes.Puke", - "friendlyName": "Puke", - "description": "No logic at all.", - "defaultValue": 0 + { + "name": "Shuffled", + "value": "random" } - } + ] }, - "hud_palettes": { - "keyString": "rom.hud_palettes", - "friendlyName": "HUD Palettes", - "description": "Randomize the colors of the HUD (user interface), within reason.", - "inputType": "range", - "subOptions": { - "default": { - "keyString": "rom.hud_palettes.default", - "friendlyName": "Vanilla", - "description": "HUD colors will remain unchanged.", - "defaultValue": 50 + "hud_palettes": { + "type": "select", + "friendlyName": "HUD Palette", + "description": "Change the colors of the user-interface", + "defaultValue": "default", + "options": [ + { + "name": "Vanilla", + "value": "default" }, - "random": { - "keyString": "rom.hud_palettes.random", - "friendlyName": "Random", - "description": "Shuffles the colors of the HUD palette.", - "defaultValue": 0 - }, - "blackout": { - "keyString": "rom.hud_palettes.blackout", - "friendlyName": "Blackout", - "description": "Never use this. Makes all HUD palette colors black.", - "defaultValue": 0 - }, - "grayscale": { - "keyString": "rom.hud_palettes.grayscale", - "friendlyName": "Grayscale", - "description": "Removes all saturation of colors.", - "defaultValue": 0 - }, - "negative": { - "keyString": "rom.hud_palettes.negative", - "friendlyName": "Negative", - "description": "Invert all colors", - "defaultValue": 0 - }, - "classic": { - "keyString": "rom.hud_palettes.classic", - "friendlyName": "Classic", - "description": "Produces results similar to the website.", - "defaultValue": 0 - }, - "dizzy": { - "keyString": "rom.hud_palettes.dizzy", - "friendlyName": "Dizzy", - "description": "No logic in colors but saturation and lightness are conserved.", - "defaultValue": 0 - }, - "sick": { - "keyString": "rom.hud_palettes.sick", - "friendlyName": "Sick", - "description": "No logic in colors but lightness is conserved.", - "defaultValue": 0 - }, - "puke": { - "keyString": "rom.hud_palettes.Puke", - "friendlyName": "Puke", - "description": "No logic at all.", - "defaultValue": 0 + { + "name": "Shuffled", + "value": "random" } - } - }, - "shield_palettes": { - "keyString": "rom.shield_palettes", - "friendlyName": "Shield Palettes", - "description": "Randomize the colors of the shield, within reason.", - "inputType": "range", - "subOptions": { - "default": { - "keyString": "rom.shield_palettes.default", - "friendlyName": "Vanilla", - "description": "Shield colors will remain unchanged.", - "defaultValue": 50 - }, - "random": { - "keyString": "rom.shield_palettes.random", - "friendlyName": "Random", - "description": "Shuffles the colors of the shield palette.", - "defaultValue": 0 - }, - "blackout": { - "keyString": "rom.shield_palettes.blackout", - "friendlyName": "Blackout", - "description": "Never use this. Makes all shield palette colors black.", - "defaultValue": 0 - }, - "grayscale": { - "keyString": "rom.shield_palettes.grayscale", - "friendlyName": "Grayscale", - "description": "Removes all saturation of colors.", - "defaultValue": 0 - }, - "negative": { - "keyString": "rom.shield_palettes.negative", - "friendlyName": "Negative", - "description": "Invert all colors", - "defaultValue": 0 - }, - "classic": { - "keyString": "rom.shield_palettes.classic", - "friendlyName": "Classic", - "description": "Produces results similar to the website.", - "defaultValue": 0 - }, - "dizzy": { - "keyString": "rom.shield_palettes.dizzy", - "friendlyName": "Dizzy", - "description": "No logic in colors but saturation and lightness are conserved.", - "defaultValue": 0 - }, - "sick": { - "keyString": "rom.shield_palettes.sick", - "friendlyName": "Sick", - "description": "No logic in colors but lightness is conserved.", - "defaultValue": 0 - }, - "puke": { - "keyString": "rom.shield_palettes.Puke", - "friendlyName": "Puke", - "description": "No logic at all.", - "defaultValue": 0 - } - } - }, - "sword_palettes": { - "keyString": "rom.sword_palettes", - "friendlyName": "Sword Palettes", - "description": "Randomize the colors of the sword, within reason.", - "inputType": "range", - "subOptions": { - "default": { - "keyString": "rom.sword_palettes.default", - "friendlyName": "Vanilla", - "description": "Sword colors will remain unchanged.", - "defaultValue": 50 - }, - "random": { - "keyString": "rom.sword_palettes.random", - "friendlyName": "Random", - "description": "Shuffles the colors of the sword palette.", - "defaultValue": 0 - }, - "blackout": { - "keyString": "rom.sword_palettes.blackout", - "friendlyName": "Blackout", - "description": "Never use this. Makes all sword palette colors black.", - "defaultValue": 0 - }, - "grayscale": { - "keyString": "rom.sword_palettes.grayscale", - "friendlyName": "Grayscale", - "description": "Removes all saturation of colors.", - "defaultValue": 0 - }, - "negative": { - "keyString": "rom.sword_palettes.negative", - "friendlyName": "Negative", - "description": "Invert all colors", - "defaultValue": 0 - }, - "classic": { - "keyString": "rom.sword_palettes.classic", - "friendlyName": "Classic", - "description": "Produces results similar to the website.", - "defaultValue": 0 - }, - "dizzy": { - "keyString": "rom.sword_palettes.dizzy", - "friendlyName": "Dizzy", - "description": "No logic in colors but saturation and lightness are conserved.", - "defaultValue": 0 - }, - "sick": { - "keyString": "rom.sword_palettes.sick", - "friendlyName": "Sick", - "description": "No logic in colors but lightness is conserved.", - "defaultValue": 0 - }, - "puke": { - "keyString": "rom.sword_palettes.Puke", - "friendlyName": "Puke", - "description": "No logic at all.", - "defaultValue": 0 - } - } + ] } } } diff --git a/WebHostLib/static/static/weightedSettings.json b/WebHostLib/static/static/weightedSettings.json new file mode 100644 index 00000000..e6ee539f --- /dev/null +++ b/WebHostLib/static/static/weightedSettings.json @@ -0,0 +1,1878 @@ +{ + "gameOptions": { + "description": { + "keyString": "description", + "friendlyName": "Description", + "inputType": "text", + "description": "A short description of this preset. Useful if you have multiple files", + "defaultValue": "Preset Name" + }, + "name": { + "keyString": "name", + "friendlyName": "Player Name", + "inputType": "text", + "description": "Displayed in-game. Spaces will be replaced with underscores.", + "defaultValue": "Your Name" + }, + "glitches_required": { + "keyString": "glitches_required", + "friendlyName": "Glitches Required", + "description": "Determine the logic required to complete the seed.", + "inputType": "range", + "subOptions": { + "none": { + "keyString": "glitches_required.none", + "friendlyName": "None", + "description": "No glitches required.", + "defaultValue": 50 + }, + "minor_glitches": { + "keyString": "glitches_required.minor_glitches", + "friendlyName": "Minor Glitches", + "description": "Puts fake flipper, water-walk, super bunny, etc into logic", + "defaultValue": 0 + }, + "overworld_glitches": { + "keyString": "glitches_required.overworld_glitches", + "friendlyName": "Overworld Glitches", + "description": "Assumes the player has knowledge of both overworld major glitches (boots clips, mirror clips) and minor glitches (fake flipper, super bunny shenanigans, water walk and etc.)", + "defaultValue": 0 + }, + "no_logic": { + "keyString": "glitches_required.no_logic", + "friendlyName": "No Logic", + "description": "Your items are placed with no regard to any logic. Your Fire Rod could be on your Trinexx.", + "defaultValue": 0 + } + } + }, + "dark_room_logic": { + "keyString": "dark_room_logic", + "friendlyName": "Dark Room Logic", + "description": "Logic to use for dark rooms.", + "inputType": "range", + "subOptions": { + "lamp": { + "keyString": "dark_room_logic.lamp", + "friendlyName": "Lamp Required", + "description": "The lamp is required for dark rooms to be considered in logic.", + "defaultValue": 50 + }, + "torches": { + "keyString": "dark_room_logic.torches", + "friendlyName": "Lamp or Torches", + "description": "In addition to the lamp, a fire rod and accessible torches may put dark rooms into logic.", + "defaultValue": 0 + }, + "none": { + "keyString": "dark_room_logic.none", + "friendlyName": "Always in Logic", + "description": "Dark rooms are always considered in logic, which may require you to navigate rooms in complete darkness.", + "defaultValue": 0 + } + } + }, + "map_shuffle": { + "keyString": "map_shuffle", + "friendlyName": "Map Shuffle", + "description": "Shuffle dungeon maps into the world and other dungeons, including other players' worlds.", + "inputType": "range", + "subOptions": { + "off": { + "keyString": "map_shuffle.off", + "friendlyName": "Off", + "description": "Disable map shuffle.", + "defaultValue": 50 + }, + "on": { + "keyString": "map_shuffle.on", + "friendlyName": "On", + "description": "Enable map shuffle.", + "defaultValue": 0 + } + } + }, + "compass_shuffle": { + "keyString": "compass_shuffle", + "friendlyName": "Compass Shuffle", + "description": "Shuffle compasses into the world and other dungeons, including other players' worlds", + "inputType": "range", + "subOptions": { + "off": { + "keyString": "compass_shuffle.off", + "friendlyName": "Off", + "description": "Disable compass shuffle.", + "defaultValue": 50 + }, + "on": { + "keyString": "compass_shuffle.on", + "friendlyName": "On", + "description": "Enable compass shuffle.", + "defaultValue": 0 + } + } + }, + "smallkey_shuffle": { + "keyString": "smallkey_shuffle", + "friendlyName": "Small Key Shuffle", + "description": "Shuffle small keys into the world and other dungeons, including other players' worlds.", + "inputType": "range", + "subOptions": { + "on": { + "keyString": "smallkey_shuffle.on", + "friendlyName": "On", + "description": "Enable small key shuffle.", + "defaultValue": 0 + }, + "off": { + "keyString": "smallkey_shuffle.off", + "friendlyName": "Off", + "description": "Disable small key shuffle.", + "defaultValue": 50 + }, + "universal": { + "keyString": "smallkey_shuffle.universal", + "friendlyName": "Universal", + "description": "Allows small keys to be used in any dungeon and adds keys to shops so you can buy more.", + "defaultValue": 0 + } + } + }, + "bigkey_shuffle": { + "keyString": "bigkey_shuffle", + "friendlyName": "Big Key Shuffle", + "description": "Shuffle big keys into the world and other dungeons, including other players' worlds.", + "inputType": "range", + "subOptions": { + "on": { + "keyString": "bigkey_shuffle.on", + "friendlyName": "On", + "description": "Enable big key shuffle.", + "defaultValue": 0 + }, + "off": { + "keyString": "bigkey_shuffle.off", + "friendlyName": "Off", + "description": "Disable big key shuffle.", + "defaultValue": 50 + } + } + }, + "local_keys": { + "keyString": "local_keys", + "friendlyName": "Local Keys", + "description": "Keep small keys and big keys local to your world.", + "inputType": "range", + "subOptions": { + "on": { + "keyString": "local_keys.on", + "friendlyName": "On", + "description": "Enable local keys.", + "defaultValue": 0 + }, + "off": { + "keyString": "local_keys.off", + "friendlyName": "Off", + "description": "Disable local keys.", + "defaultValue": 50 + } + } + }, + "dungeon_counters": { + "keyString": "dungeon_counters", + "friendlyName": "Dungeon Counters", + "description": "Determines when to show an on-screen counter for dungeon items.", + "inputType": "range", + "subOptions": { + "on": { + "keyString": "dungeon_counters.on", + "friendlyName": "Always On", + "description": "Always display amount of items checked in a dungeon.", + "defaultValue": 0 + }, + "pickup": { + "keyString": "dungeon_counters.pickup", + "friendlyName": "With Compass", + "description": "Show when compass is picked up.", + "defaultValue": 0 + }, + "default": { + "keyString": "dungeon_counters.default", + "friendlyName": "With Compass if Shuffled", + "description": "Show when the compass is picked up, if the compass was shuffled.", + "defaultValue": 0 + }, + "off": { + "keyString": "dungeon_counters.off", + "friendlyName": "Always Off", + "description": "Never show dungeon counters.", + "defaultValue": 50 + } + } + }, + "accessibility": { + "keyString": "accessibility", + "friendlyName": "Location Access", + "description": "Determines how much of the game is guaranteed to be reachable.", + "inputType": "range", + "subOptions": { + "items": { + "keyString": "accessibility.items", + "friendlyName": "All Items", + "description": "Guarantees you will be able to acquire all items, but you may not be able to access all locations.", + "defaultValue": 0 + }, + "locations": { + "keyString": "accessibility.locations", + "friendlyName": "All Locations", + "description": "Guarantees you will be able to access all locations, and therefore all items.", + "defaultValue": 50 + }, + "none": { + "keyString": "accessibility.none", + "friendlyName": "Required Only", + "description": "Guarantees only that the game is beatable. You may not be able to access all locations or acquire all items.", + "defaultValue": 0 + } + } + }, + "progressive": { + "keyString": "progressive", + "friendlyName": "Progressive Items", + "description": "Enable or disable the progressive acquisition of certain items (swords, shields, bow).", + "inputType": "range", + "subOptions": { + "on": { + "keyString": "progressive.on", + "friendlyName": "On", + "description": "All relevant items are acquired progressively.", + "defaultValue": 50 + }, + "off": { + "keyString": "progressive.off", + "friendlyName": "Off", + "description": "All relevant items are acquired non-progressively (tempered sword may be in Link's House).", + "defaultValue": 0 + }, + "random": { + "keyString": "progressive.random", + "friendlyName": "Random", + "description": "The progressive nature of items is determined per-item pool. Gloves may be progressive, but swords may not be.", + "defaultValue": 0 + } + } + }, + "entrance_shuffle": { + "keyString": "entrance_shuffle", + "friendlyName": "Entrance Shuffle", + "description": "Determines how often and by what rules entrances are shuffled.", + "inputType": "range", + "subOptions": { + "none": { + "keyString": "entrance_shuffle.none", + "friendlyName": "Vanilla Entrances", + "description": "Vanilla game map. All entrances and exits lead to their original locations.", + "defaultValue": 50 + }, + "dungeonssimple": { + "keyString": "entrance_shuffle.dungeonssimple", + "friendlyName": "Dungeons Simple", + "description": "Shuffle whole dungeons amongst each other. Hyrule Castle would always be one dungeon.", + "defaultValue": 0 + }, + "dungeonsfull": { + "keyString": "entrance_shuffle.dungeonsfull", + "friendlyName": "Dungeons Full", + "description": "Shuffle any dungeon entrance with any dungeon interior, so Hyrule Castle could be four different dungeons.", + "defaultValue": 0 + }, + "simple": { + "keyString": "entrance_shuffle.simple", + "friendlyName": "Simple Shuffle", + "description": "Entrances are grouped together before being randomized. This option uses the most strict grouping rules.", + "defaultValue": 0 + }, + "restricted": { + "keyString": "entrance_shuffle.restricted", + "friendlyName": "Restricted Shuffle", + "description": "Entrances are grouped together before being randomized. Grouping rules are less strict than Simple Shuffle.", + "defaultValue": 0 + }, + "full": { + "keyString": "entrance_shuffle.full", + "friendlyName": "Full Shuffle", + "description": "Entrances are grouped before being randomized. Grouping rules are less strict than Restricted Shuffle.", + "defaultValue": 0 + }, + "crossed": { + "keyString": "entrance_shuffle.crossed", + "friendlyName": "Crossed Shuffle", + "description": "Entrances are grouped before being randomized. Grouping rules are less strict than Full Shuffle.", + "defaultValue": 0 + }, + "insanity": { + "keyString": "entrance_shuffle.insanity", + "friendlyName": "Insanity Shuffle", + "description": "Very few entrance grouping rules are applied. Good luck.", + "defaultValue": 0 + } + } + }, + "goals": { + "keyString": "goals", + "friendlyName": "Goals", + "description": "Determines how much work you need to put in to save Hyrule.", + "inputType": "range", + "subOptions": { + "ganon": { + "keyString": "goals.ganon", + "friendlyName": "Defeat Ganon", + "description": "Climb Ganon's Tower, defeat Agahnim, then defeat Ganon in his lair.", + "defaultValue": 50 + }, + "fast_ganon": { + "keyString": "goals.fast_ganon", + "friendlyName": "Fast Ganon", + "description": "Kill Ganon in his lair. The hole is always open, but you may still require some crystals to damage him.", + "defaultValue": 0 + }, + "dungeons": { + "keyString": "goals.dungeons", + "friendlyName": "All Dungeons", + "description": "Defeat the boss of all dungeons, defeat Agahnim in both Castle Tower and Ganon's Tower, then defeat Ganon in his lair.", + "defaultValue": 0 + }, + "pedestal": { + "keyString": "goals.pedestal", + "friendlyName": "Pedestal", + "description": "Acquire all three pendants and pull the Triforce from the Master Sword Pedestal.", + "defaultValue": 0 + }, + "ganon_pedestal": { + "keyString": "goals.ganon_pedestal", + "friendlyName": "Ganon Pedestal", + "description": "Accquire all three pendants, pull the Master Sword Pedestal, then defeat Ganon in his lair.", + "defaultValue": 0 + }, + "triforce_hunt": { + "keyString": "goals.triforce_hunt", + "friendlyName": "Triforce Hunt", + "description": "Collect enough pieces of the Triforce of Courage, which has been spread around the world, then turn them in to Murahadala, who is standing outside Hyrule Castle.", + "defaultValue": 0 + }, + "local_triforce_hunt": { + "keyString": "goals.local_triforce_hunt", + "friendlyName": "Local Triforce Hunt", + "description": "Same as Triforce Hunt, but the Triforce pieces are guaranteed to be in your world.", + "defaultValue": 0 + }, + "ganon_triforce_hunt": { + "keyString": "goals.ganon_triforce_hunt", + "friendlyName": "Triforce Hunt /w Ganon", + "description": "Same as Triforce Hunt, but you need to defeat Ganon in his lair instead of talking with Murahadala.", + "defaultValue": 0 + }, + "local_ganon_triforce_hunt": { + "keyString": "goals.local_ganon_triforce_hunt", + "friendlyName": "Local Triforce hunt /w Ganon", + "description": "Same as Local Triforce Hunt, but you need to defeat Ganon in his lair instead of talking with Murahadala.", + "defaultValue": 0 + } + } + }, + "triforce_pieces_required": { + "keyString": "triforce_pieces_required", + "friendlyName": "Triforce Pieces Required", + "description": "Determines the total number of Triforce pieces required before speaking with Murahadala", + "inputType": "range", + "subOptions": { + "15": { + "keyString": "triforce_pieces_required.15", + "friendlyName": 15, + "description": "15 Triforce pieces are required before speaking with Murahadala.", + "defaultValue": 0 + }, + "20": { + "keyString": "triforce_pieces_required.20", + "friendlyName": 20, + "description": "20 Triforce pieces are required before speaking with Murahadala.", + "defaultValue": 50 + }, + "30": { + "keyString": "triforce_pieces_required.30", + "friendlyName": 30, + "description": "30 Triforce pieces are required before speaking with Murahadala.", + "defaultValue": 0 + }, + "40": { + "keyString": "triforce_pieces_required.40", + "friendlyName": 40, + "description": "40 Triforce pieces are required before speaking with Murahadala.", + "defaultValue": 0 + }, + "50": { + "keyString": "triforce_pieces_required.50", + "friendlyName": 50, + "description": "50 Triforce pieces are required before speaking with Murahadala.", + "defaultValue": 0 + } + } + }, + "triforce_pieces_mode": { + "keyString": "triforce_pieces_mode", + "friendlyName": "Triforce Piece Availability Mode", + "description": "Determines which of the following three options will be used to determine the total available triforce pieces.", + "inputType": "range", + "subOptions": { + "available": { + "keyString": "triforce_pieces_mode.available", + "friendlyName": "Exact Number", + "description": "Explicitly tell the generator how many triforce pieces to place throughout Hyrule.", + "defaultValue": 50 + }, + "extra": { + "keyString": "triforce_pieces_mode.extra", + "friendlyName": "Required Plus", + "description": "Set the number of triforce pieces in Hyrule equal to the number of required pieces plus a number specified by this option.", + "defaultValue": 0 + }, + "percentage": { + "keyString": "triforce_pieces_mode.percentage", + "friendlyName": "Percentage", + "description": "Set the number of triforce pieces in Hyrule equal to the number of required pieces plus a percentage specified by this option.", + "defaultValue": 0 + } + } + }, + "triforce_pieces_available": { + "keyString": "triforce_pieces_available", + "friendlyName": "Exact Number (Triforce Hunt)", + "description": "Only used if enabled in Triforce Piece Availability Mode.", + "inputType": "range", + "subOptions": { + "25": { + "keyString": "triforce_pieces_available.25", + "friendlyName": 25, + "description": "25 Triforce pieces will be hidden throughout Hyrule", + "defaultValue": 0 + }, + "30": { + "keyString": "triforce_pieces_available.30", + "friendlyName": 30, + "description": "30 Triforce pieces will be hidden throughout Hyrule", + "defaultValue": 50 + }, + "40": { + "keyString": "triforce_pieces_available.40", + "friendlyName": 40, + "description": "40 Triforce pieces will be hidden throughout Hyrule", + "defaultValue": 0 + }, + "50": { + "keyString": "triforce_pieces_available.50", + "friendlyName": 50, + "description": "50 Triforce pieces will be hidden throughout Hyrule", + "defaultValue": 0 + } + } + }, + "triforce_pieces_extra": { + "keyString": "triforce_pieces_extra", + "friendlyName": "Required Plus (Triforce Hunt)", + "description": "Only used if enabled in Triforce Piece Availability Mode.", + "inputType": "range", + "subOptions": { + "0": { + "keyString": "triforce_pieces_extra.0", + "friendlyName": 0, + "description": "No extra Triforce pieces will be hidden throughout Hyrule", + "defaultValue": 0 + }, + "5": { + "keyString": "triforce_pieces_extra.5", + "friendlyName": 5, + "description": "5 extra Triforce pieces will be hidden throughout Hyrule", + "defaultValue": 0 + }, + "10": { + "keyString": "triforce_pieces_extra.10", + "friendlyName": 10, + "description": "10 extra Triforce pieces will be hidden throughout Hyrule", + "defaultValue": 50 + }, + "15": { + "keyString": "triforce_pieces_extra.15", + "friendlyName": 15, + "description": "15 extra Triforce pieces will be hidden throughout Hyrule", + "defaultValue": 0 + }, + "20": { + "keyString": "triforce_pieces_extra.20", + "friendlyName": 20, + "description": "20 extra Triforce pieces will be hidden throughout Hyrule", + "defaultValue": 0 + } + } + }, + "triforce_pieces_percentage": { + "keyString": "triforce_pieces_percentage", + "friendlyName": "Percentage (Triforce Hunt)", + "description": "Only used if enabled in Triforce Piece Availability Mode.", + "inputType": "range", + "subOptions": { + "100": { + "keyString": "triforce_pieces_percentage.100", + "friendlyName": "0%", + "description": "No extra Triforce pieces will be hidden throughout Hyrule", + "defaultValue": 0 + }, + "150": { + "keyString": "triforce_pieces_percentage.150", + "friendlyName": "50%", + "description": "50% more triforce pieces than required will be placed throughout Hyrule.", + "defaultValue": 50 + }, + "200": { + "keyString": "triforce_pieces_percentage.200", + "friendlyName": "100%", + "description": "50% more triforce pieces than required will be placed throughout Hyrule.", + "defaultValue": 0 + } + } + }, + "tower_open": { + "keyString": "tower_open", + "friendlyName": "GT Crystals", + "description": "Determines the number of crystals required to open Ganon's Tower.", + "inputType": "range", + "subOptions": { + "0": { + "keyString": "tower_open.0", + "friendlyName": 0, + "description": "0 Crystals are required to open Ganon's Tower.", + "defaultValue": 80 + }, + "1": { + "keyString": "tower_open.1", + "friendlyName": 1, + "description": "1 Crystal is required to open Ganon's Tower.", + "defaultValue": 70 + }, + "2": { + "keyString": "tower_open.2", + "friendlyName": 2, + "description": "2 Crystals are required to open Ganon's Tower.", + "defaultValue": 60 + }, + "3": { + "keyString": "tower_open.3", + "friendlyName": 3, + "description": "3 Crystals are required to open Ganon's Tower.", + "defaultValue": 50 + }, + "4": { + "keyString": "tower_open.4", + "friendlyName": 4, + "description": "4 Crystals are required to open Ganon's Tower.", + "defaultValue": 40 + }, + "5": { + "keyString": "tower_open.5", + "friendlyName": 5, + "description": "5 Crystals are required to open Ganon's Tower.", + "defaultValue": 30 + }, + "6": { + "keyString": "tower_open.6", + "friendlyName": 6, + "description": "6 Crystals are required to open Ganon's Tower.", + "defaultValue": 20 + }, + "7": { + "keyString": "tower_open.7", + "friendlyName": 7, + "description": "7 Crystals are required to open Ganon's Tower.", + "defaultValue": 10 + }, + "random": { + "keyString": "tower_open.random", + "friendlyName": "Random", + "description": "Randomly determine the number of crystals necessary to open Ganon's Tower.", + "defaultValue": 0 + } + } + }, + "ganon_open": { + "keyString": "ganon_open", + "friendlyName": "Ganon Crystals", + "description": "Determines the number of crystals required before you are able to damage Ganon.", + "inputType": "range", + "subOptions": { + "0": { + "keyString": "ganon_open.0", + "friendlyName": 0, + "description": "0 Crystals are required to damage Ganon.", + "defaultValue": 80 + }, + "1": { + "keyString": "ganon_open.1", + "friendlyName": 1, + "description": "1 Crystal is required to damage Ganon.", + "defaultValue": 70 + }, + "2": { + "keyString": "ganon_open.2", + "friendlyName": 2, + "description": "2 Crystals are required to damage Ganon.", + "defaultValue": 60 + }, + "3": { + "keyString": "ganon_open.3", + "friendlyName": 3, + "description": "3 Crystals are required to damage Ganon.", + "defaultValue": 50 + }, + "4": { + "keyString": "ganon_open.4", + "friendlyName": 4, + "description": "4 Crystals are required to damage Ganon.", + "defaultValue": 40 + }, + "5": { + "keyString": "ganon_open.5", + "friendlyName": 5, + "description": "5 Crystals are required to damage Ganon.", + "defaultValue": 30 + }, + "6": { + "keyString": "ganon_open.6", + "friendlyName": 6, + "description": "6 Crystals are required to damage Ganon.", + "defaultValue": 20 + }, + "7": { + "keyString": "ganon_open.7", + "friendlyName": 7, + "description": "7 Crystals are required to damage Ganon.", + "defaultValue": 10 + }, + "random": { + "keyString": "ganon_open.random", + "friendlyName": "Random", + "description": "Randomly determine the number of crystals necessary to damage Ganon.", + "defaultValue": 0 + } + } + }, + "mode": { + "keyString": "mode", + "friendlyName": "Game Mode", + "description": "Determines the mode, or world state, for your game.", + "inputType": "range", + "subOptions": { + "standard": { + "keyString": "mode.standard", + "friendlyName": "Standard Mode", + "description": "Begin the game by rescuing Zelda from her cell and escorting her to the Sanctuary.", + "defaultValue": 50 + }, + "open": { + "keyString": "mode.open", + "friendlyName": "Open Mode", + "description": "Begin the game from your choice of Link's House or the Sanctuary.", + "defaultValue": 50 + }, + "inverted": { + "keyString": "mode.inverted", + "friendlyName": "Inverted Mode", + "description": "Begin in the Dark World. The Moon Pearl is required to avoid bunny-state in Light World, and the Light World game map is altered.", + "defaultValue": 0 + } + } + }, + "retro": { + "keyString": "retro", + "friendlyName": "Retro Mode", + "description": "Makes the game similar to the first Legend of Zelda. You must buy a quiver to use the bow, take-any caves and an old-man cave are added to the world, and you may need to find your sword from the old man's cave.", + "inputType": "range", + "subOptions": { + "on": { + "keyString": "retro.on", + "friendlyName": "On", + "description": "Enable retro mode.", + "defaultValue": 0 + }, + "off": { + "keyString": "retro.off", + "friendlyName": "Off", + "description": "Disable retro mode.", + "defaultValue": 50 + } + } + }, + "hints": { + "keyString": "hints", + "friendlyName": "Hint Type", + "description": "Determines the behavior of hint tiles in dungeons", + "inputType": "range", + "subOptions": { + "on": { + "keyString": "hints.on", + "friendlyName": "Item Locations", + "description": "Hint tiles sometimes give item location hints.", + "defaultValue": 50 + }, + "off": { + "keyString": "hints.off", + "friendlyName": "Gameplay Tips", + "description": "Hint tiles provide gameplay tips.", + "defaultValue": 0 + } + } + }, + "weapons": { + "keyString": "weapons", + "friendlyName": "Sword Placement", + "description": "Determines how swords are placed throughout the world.", + "inputType": "range", + "subOptions": { + "randomized": { + "keyString": "weapons.randomized", + "friendlyName": "Randomized", + "description": "Swords are placed randomly throughout the world.", + "defaultValue": 0 + }, + "assured": { + "keyString": "weapons.assured", + "friendlyName": "Assured", + "description": "Begin the game with a sword. Other swords are placed randomly throughout the game world.", + "defaultValue": 50 + }, + "vanilla": { + "keyString": "weapons.vanilla", + "friendlyName": "Vanilla Locations", + "description": "Swords are placed in vanilla locations in your own game (uncle, pedestal, smiths, pyramid fairy).", + "defaultValue": 0 + }, + "swordless": { + "keyString": "weapons.swordless", + "friendlyName": "Swordless", + "description": "Your swords are replaced with rupees. Gameplay changes are made to accommodate this change.", + "defaultValue": 0 + } + } + }, + "item_pool": { + "keyString": "item_pool", + "friendlyName": "Item Pool", + "description": "Determines the availability of upgrades, progressive items, and convenience items.", + "inputType": "range", + "subOptions": { + "easy": { + "keyString": "item_pool.easy", + "friendlyName": "Easy", + "description": "Double the number of available upgrades and progressive items.", + "defaultValue": 0 + }, + "normal": { + "keyString": "item_pool.normal", + "friendlyName": "Normal", + "description": "Item availability remains unchanged from the vanilla game.", + "defaultValue": 50 + }, + "hard": { + "keyString": "item_pool.hard", + "friendlyName": "Hard", + "description": "Reduced upgrade availability (max: 14 hearts, blue mail, tempered sword, fire shield, no silvers unless swordless).", + "defaultValue": 0 + }, + "expert": { + "keyString": "item_pool.expert", + "friendlyName": "Expert", + "description": "Minimum upgrade availability (max: 8 hearts, green mail, master sword, fighter shield, no silvers unless swordless).", + "defaultValue": 0 + } + } + }, + "item_functionality": { + "keyString": "item_functionality", + "friendlyName": "Item Functionality", + "description": "Alters the usefulness of various items in the game.", + "inputType": "range", + "subOptions": { + "easy": { + "keyString": "item_functionality.easy", + "friendlyName": "Easy", + "description": "Increases helpfulness of items. Medallions are usable everywhere, even without a sword. Hammer can be used in place of master sword to beat ganon and collect the tablets.", + "defaultValue": 0 + }, + "normal": { + "keyString": "item_functionality.normal", + "friendlyName": "Normal", + "description": "Item functionality remains unchanged from the vanilla game.", + "defaultValue": 50 + }, + "hard": { + "keyString": "item_functionality.hard", + "friendlyName": "Hard", + "description": "Reduced helpfulness of items. Potions are less effective, you can't catch faeries, the Magic Cape uses double magic, the Cane of Byrna does not grant invulnerability, boomerangs do not stun, and silver arrows are disabled outside ganon.", + "defaultValue": 0 + }, + "expert": { + "keyString": "item_functionality.expert", + "friendlyName": "Expert", + "description": "Vastly reduces the helpfulness of items. Potions are barely effective, you can't catch faeries, the Magic Cape uses double magic, the Cane of Byrna does not grant invulnerability, boomerangs and hookshot do not stun, and the silver arrows are disabled outside ganon.", + "defaultValue": 0 + } + } + }, + "progression_balancing": { + "keyString": "progression_balancing", + "friendlyName": "Progression Balancing", + "description": "A system to reduce time spent in BK mode. It moves your items into an earlier access sphere to make it more likely you have access to progression items.", + "inputType": "range", + "subOptions": { + "on": { + "keyString": "progression_balancing.on", + "friendlyName": "On", + "description": "Enable progression balancing.", + "defaultValue": 50 + }, + "off": { + "keyString": "progression_balancing.off", + "friendlyName": "Off", + "description": "Disable progression balancing.", + "defaultValue": 0 + } + } + }, + "boss_shuffle": { + "keyString": "boss_shuffle", + "friendlyName": "Boss Shuffle", + "description": "Determines which boss appears in which dungeon.", + "inputType": "range", + "subOptions": { + "none": { + "keyString": "boss_shuffle.none", + "friendlyName": "None", + "description": "Bosses appear in vanilla locations.", + "defaultValue": 50 + }, + "simple": { + "keyString": "boss_shuffle.simple", + "friendlyName": "Simple", + "description": "Existing bosses except Ganon and Agahnim are shuffled throughout dungeons.", + "defaultValue": 0 + }, + "full": { + "keyString": "boss_shuffle.full", + "friendlyName": "Full", + "description": "Bosses are shuffled, and three of them may occur twice.", + "defaultValue": 0 + }, + "random": { + "keyString": "boss_shuffle.random", + "friendlyName": "Random", + "description": "Any boss may appear any number of times.", + "defaultValue": 0 + }, + "singularity": { + "keyString": "boss_shuffle.singularity", + "friendlyName": "Singularity", + "description": "Picks a boss at random and puts it in every dungeon it can appear in. Remaining dungeons bosses are chosen at random.", + "defaultValue": 0 + } + } + }, + "enemy_shuffle": { + "keyString": "enemy_shuffle", + "friendlyName": "Enemy Shuffle", + "description": "Randomizes which enemies appear throughout the game.", + "inputType": "range", + "subOptions": { + "on": { + "keyString": "enemy_shuffle.on", + "friendlyName": "On", + "description": "Enable enemy shuffle.", + "defaultValue": 0 + }, + "off": { + "keyString": "enemy_shuffle.off", + "friendlyName": "Off", + "description": "Disable enemy shuffle.", + "defaultValue": 50 + } + } + }, + "killable_thieves": { + "keyString": "killable_thieves", + "friendlyName": "Killable Thieves", + "description": "Determines whether thieves may be killed or not.", + "inputType": "range", + "subOptions": { + "on": { + "keyString": "killable_thieves.on", + "friendlyName": "On", + "description": "Thieves are mortal.", + "defaultValue": 0 + }, + "off": { + "keyString": "killable_thieves.off", + "friendlyName": "Off", + "description": "Thieves are invulnerable.", + "defaultValue": 50 + } + } + }, + "tile_shuffle": { + "keyString": "tile_shuffle", + "friendlyName": "Tile Shuffle", + "description": "Randomizes tile layouts in rooms where floor tiles attack you.", + "inputType": "range", + "subOptions": { + "on": { + "keyString": "tile_shuffle.on", + "friendlyName": "On", + "description": "Enable tile shuffle.", + "defaultValue": 0 + }, + "off": { + "keyString": "tile_shuffle.off", + "friendlyName": "Off", + "description": "Disable tile shuffle.", + "defaultValue": 50 + } + } + }, + "bush_shuffle": { + "keyString": "bush_shuffle", + "friendlyName": "Bush Shuffle", + "description": "Randomize the chance that bushes around Hyrule have enemies hiding under them.", + "inputType": "range", + "subOptions": { + "on": { + "keyString": "bush_shuffle.on", + "friendlyName": "On", + "description": "Enable bush shuffle.", + "defaultValue": 0 + }, + "off": { + "keyString": "bush_shuffle.off", + "friendlyName": "Off", + "description": "Disable bush shuffle.", + "defaultValue": 50 + } + } + }, + "enemy_damage": { + "keyString": "enemy_damage", + "friendlyName": "Enemy Damage", + "description": "Randomizes how much damage enemies can deal to you.", + "inputType": "range", + "subOptions": { + "default": { + "keyString": "enemy_damage.default", + "friendlyName": "Vanilla Damage", + "description": "Enemies deal the same damage as in the vanilla game.", + "defaultValue": 50 + }, + "shuffled": { + "keyString": "enemy_damage.shuffled", + "friendlyName": "Shuffled", + "description": "Enemies deal zero to four hearts of damage, and armor reduces this damage.", + "defaultValue": 0 + }, + "random": { + "keyString": "enemy_damage.random", + "friendlyName": "Random", + "description": "Enemies may deal zero through eight hearts of damage, and armor re-shuffles how much damage you take from each enemy.", + "defaultValue": 0 + } + } + }, + "enemy_health": { + "keyString": "enemy_health", + "friendlyName": "Enemy Health", + "description": "Randomizes the amount of health enemies have. Does not affect bosses.", + "inputType": "range", + "subOptions": { + "default": { + "keyString": "enemy_health.default", + "friendlyName": "Vanilla", + "description": "Enemies have the same amount of health as in the vanilla game.", + "defaultValue": 50 + }, + "easy": { + "keyString": "enemy_health.easy", + "friendlyName": "Reduced", + "description": "Enemies have generally reduced health.", + "defaultValue": 0 + }, + "hard": { + "keyString": "enemy_health.hard", + "friendlyName": "Increased", + "description": "Enemies have generally increased health.", + "defaultValue": 0 + }, + "expert": { + "keyString": "enemy_health.expert", + "friendlyName": "Armor-Plated", + "description": "Enemies will be very heard to defeat.", + "defaultValue": 0 + } + } + }, + "pot_shuffle": { + "keyString": "pot_shuffle", + "friendlyName": "Pot Shuffle", + "description": "Keys, items, and buttons hidden under pots in dungeons may be shuffled with other pots in their super-tile.", + "inputType": "range", + "subOptions": { + "on": { + "keyString": "pot_shuffle.on", + "friendlyName": "On", + "description": "Enable pot shuffle.", + "defaultValue": 0 + }, + "off": { + "keyString": "pot_shuffle.off", + "friendlyName": "Off", + "description": "Disable pot shuffle.", + "defaultValue": 50 + } + } + }, + "beemizer": { + "keyString": "beemizer", + "friendlyName": "Beemizer", + "description": "Remove items from the global item pool and replace them with single bees and bee traps.", + "inputType": "range", + "subOptions": { + "0": { + "keyString": "beemizer.0", + "friendlyName": "Level 0", + "description": "No bee traps are placed.", + "defaultValue": 50 + }, + "1": { + "keyString": "beemizer.1", + "friendlyName": "Level 1", + "description": "25% of the non-essential item pool is replaced with bee traps.", + "defaultValue": 1 + }, + "2": { + "keyString": "beemizer.2", + "friendlyName": "Level 2", + "description": "60% of the non-essential item pool is replaced with bee traps, of which 20% could be single bees.", + "defaultValue": 2 + }, + "3": { + "keyString": "beemizer.3", + "friendlyName": "Level 3", + "description": "100% of the non-essential item pool is replaced with bee traps, of which 50% could be single bees.", + "defaultValue": 3 + }, + "4": { + "keyString": "beemizer.4", + "friendlyName": "Level 4", + "description": "100% of the non-essential item pool is replaced with bee traps.", + "defaultValue": 4 + } + } + }, + "shop_shuffle": { + "keyString": "shop_shuffle", + "friendlyName": "Shop Shuffle", + "description": "Alters the inventory and prices of shops.", + "inputType": "range", + "subOptions": { + "none": { + "keyString": "shop_shuffle.none", + "friendlyName": "Vanilla Shops", + "description": "Shop contents are left unchanged.", + "defaultValue": 50 + }, + "i": { + "keyString": "shop_shuffle.i", + "friendlyName": "Inventory Shuffle", + "description": "Randomizes the inventories of shops.", + "defaultValue": 0 + }, + "p": { + "keyString": "shop_shuffle.p", + "friendlyName": "Price Shuffle", + "description": "Randomizes the price of items sold in shops.", + "defaultValue": 0 + }, + "u": { + "keyString": "shop_shuffle.u", + "friendlyName": "Capacity Upgrades", + "description": "Shuffles capacity upgrades throughout the game world.", + "defaultValue": 0 + }, + "ip": { + "keyString": "shop_shuffle.ip", + "friendlyName": "Inventory & Prices", + "description": "Shuffles the inventory and randomizes the prices of items in shops.", + "defaultValue": 0 + }, + "uip": { + "keyString": "shop_shuffle.uip", + "friendlyName": "Full Shuffle", + "description": "Shuffles the inventory and randomizes the prices of items in shops. Also distributes capacity upgrades throughout the world.", + "defaultValue": 0 + } + } + }, + "shuffle_prizes": { + "keyString": "shuffle_prizes", + "friendlyName": "Prize Shuffle", + "description": "Alters the Prizes from pulling, bonking, enemy kills, digging, and hoarders", + "inputType": "range", + "subOptions": { + "none": { + "keyString": "shuffle_prizes.none", + "friendlyName": "None", + "description": "All prizes from pulling, bonking, enemy kills, digging, hoarders are vanilla.", + "defaultValue": 0 + }, + "g": { + "keyString": "shuffle_prizes.g", + "friendlyName": "\"General\" prize shuffle", + "description": "Shuffles the prizes from pulling, enemy kills, digging, hoarders", + "defaultValue": 50 + }, + "b": { + "keyString": "shuffle_prizes.b", + "friendlyName": "Bonk prize shuffle", + "description": "Shuffles the prizes from bonking into trees.", + "defaultValue": 0 + }, + "bg": { + "keyString": "shuffle_prizes.bg", + "friendlyName": "Both", + "description": "Shuffles both of the options.", + "defaultValue": 0 + } + } + }, + "timer": { + "keyString": "timer", + "friendlyName": "Timed Modes", + "description": "Add a timer to the game UI, and cause it to have various effects.", + "inputType": "range", + "subOptions": { + "none": { + "keyString": "timer.none", + "friendlyName": "Disabled", + "description": "No timed mode is applied to the game.", + "defaultValue": 50 + }, + "timed": { + "keyString": "timer.timed", + "friendlyName": "Timed Mode", + "description": "Starts with clock at zero. Green clocks subtract 4 minutes (total 20). Blue clocks subtract 2 minutes (total 10). Red clocks add two minutes (total 10). Winner is the player with the lowest time at the end.", + "defaultValue": 0 + }, + "timed_ohko": { + "keyString": "timer.timed_ohko", + "friendlyName": "Timed OHKO", + "description": "Starts the clock at ten minutes. Green clocks add five minutes (total 25). As long as the clock as at zero, Link will die in one hit.", + "defaultValue": 0 + }, + "ohko": { + "keyString": "timer.ohko", + "friendlyName": "One-Hit KO", + "description": "Timer always at zero. Permanent OHKO.", + "defaultValue": 0 + }, + "timed_countdown": { + "keyString": "timer.timed_countdown", + "friendlyName": "Timed Countdown", + "description": "Starts the clock with forty minutes. Same clocks as timed mode, but if the clock hits zero you lose. You can still keep playing, though.", + "defaultValue": 0 + }, + "display": { + "keyString": "timer.display", + "friendlyName": "Timer Only", + "description": "Displays a timer, but otherwise does not affect gameplay or the item pool.", + "defaultValue": 0 + } + } + }, + "countdown_start_time": { + "keyString": "countdown_start_time", + "friendlyName": "Countdown Starting Time", + "description": "The amount of time, in minutes, to start with in Timed Countdown and Timed OHKO modes.", + "inputType": "range", + "subOptions": { + "0": { + "keyString": "countdown_start_time.0", + "friendlyName": 0, + "description": "Start with no time on the timer. In Timed OHKO mode, start in OHKO mode.", + "defaultValue": 0 + }, + "10": { + "keyString": "countdown_start_time.10", + "friendlyName": 10, + "description": "Start with 10 minutes on the timer.", + "defaultValue": 50 + }, + "20": { + "keyString": "countdown_start_time.20", + "friendlyName": 20, + "description": "Start with 20 minutes on the timer.", + "defaultValue": 0 + }, + "30": { + "keyString": "countdown_start_time.30", + "friendlyName": 30, + "description": "Start with 30 minutes on the timer.", + "defaultValue": 0 + }, + "60": { + "keyString": "countdown_start_time.60", + "friendlyName": 60, + "description": "Start with an hour on the timer.", + "defaultValue": 0 + } + } + }, + "red_clock_time": { + "keyString": "red_clock_time", + "friendlyName": "Red Clock Time", + "description": "The amount of time, in minutes, to add to or subtract from the timer upon picking up a red clock.", + "inputType": "range", + "subOptions": { + "-2": { + "keyString": "red_clock_time.-2", + "friendlyName": -2, + "description": "Subtract 2 minutes from the timer upon picking up a red clock.", + "defaultValue": 0 + }, + "1": { + "keyString": "red_clock_time.1", + "friendlyName": 1, + "description": "Add a minute to the timer upon picking up a red clock.", + "defaultValue": 50 + } + } + }, + "blue_clock_time": { + "keyString": "blue_clock_time", + "friendlyName": "Blue Clock Time", + "description": "The amount of time, in minutes, to add to or subtract from the timer upon picking up a blue clock.", + "inputType": "range", + "subOptions": { + "1": { + "keyString": "blue_clock_time.1", + "friendlyName": 1, + "description": "Add a minute to the timer upon picking up a blue clock.", + "defaultValue": 0 + }, + "2": { + "keyString": "blue_clock_time.2", + "friendlyName": 2, + "description": "Add 2 minutes to the timer upon picking up a blue clock.", + "defaultValue": 50 + } + } + }, + "green_clock_time": { + "keyString": "green_clock_time", + "friendlyName": "Green Clock Time", + "description": "The amount of time, in minutes, to add to or subtract from the timer upon picking up a green clock.", + "inputType": "range", + "subOptions": { + "4": { + "keyString": "green_clock_time.4", + "friendlyName": 4, + "description": "Add 4 minutes to the timer upon picking up a green clock.", + "defaultValue": 50 + }, + "10": { + "keyString": "green_clock_time.10", + "friendlyName": 10, + "description": "Add 10 minutes to the timer upon picking up a green clock.", + "defaultValue": 0 + }, + "15": { + "keyString": "green_clock_time.15", + "friendlyName": 15, + "description": "Add 15 minutes to the timer upon picking up a green clock.", + "defaultValue": 0 + } + } + }, + "glitch_boots": { + "keyString": "glitch_boots", + "friendlyName": "Glitch Boots", + "description": "Start with Pegasus Boots in any glitched logic mode that makes use of them.", + "inputType": "range", + "subOptions": { + "on": { + "keyString": "glitch_boots.on", + "friendlyName": "On", + "description": "Enable glitch boots.", + "defaultValue": 50 + }, + "off": { + "keyString": "glitch_boots.off", + "friendlyName": "Off", + "description": "Disable glitch boots.", + "defaultValue": 0 + } + } + }, + "door_shuffle": { + "keyString": "door_shuffle", + "friendlyName": "Door Shuffle", + "description": "Shuffles the interior layout of dungeons. Only available if the host rolls the game using the doors version of the generator.", + "inputType": "range", + "subOptions": { + "vanilla": { + "keyString": "door_shuffle.vanilla", + "friendlyName": "Vanilla", + "description": "Doors within dungeons remain unchanged from the vanilla game.", + "defaultValue": 50 + }, + "basic": { + "keyString": "door_shuffle.basic", + "friendlyName": "Basic", + "description": "Dungeons are shuffled within themselves.", + "defaultValue": 0 + }, + "crossed": { + "keyString": "door_shuffle.crossed", + "friendlyName": "Crossed", + "description": "Dungeons are shuffled across each other. Eastern may contain POD, Mire, and Hera.", + "defaultValue": 0 + } + } + }, + "intensity": { + "keyString": "intensity", + "friendlyName": "Door Shuffle Intensity Level", + "description": "Specifies what types of doors will be shuffled.", + "inputType": "range", + "subOptions": { + "1": { + "keyString": "intensity.1", + "friendlyName": "Level 1", + "description": "Doors and spiral staircases will be shuffled amongst themselves.", + "defaultValue": 50 + }, + "2": { + "keyString": "intensity.2", + "friendlyName": "Level 2", + "description": "Doors, open edges, and straight stair cases are shuffled amongst each other. Spiral staircases will be shuffled amongst themselves.", + "defaultValue": 0 + }, + "3": { + "keyString": "intensity.3", + "friendlyName": "Level 3", + "description": "Level 2 plus lobby shuffling, which means any non-dead-end supertile with a south-facing door may become a dungeon entrance.", + "defaultValue": 0 + }, + "random": { + "keyString": "intensity.random", + "friendlyName": "Random", + "description": "Randomly chooses an intensity level from 1-3.", + "defaultValue": 0 + } + } + }, + "key_drop_shuffle": { + "keyString": "key_drop_shuffle", + "friendlyName": "Key Drop Shuffle", + "description": "Allows the small/big keys dropped by enemies/pots to be shuffled into the item pool. This extends the number of checks from 216 to 249", + "inputType": "range", + "subOptions": { + "on": { + "keyString": "key_drop_shuffle.on", + "friendlyName": "Enabled", + "description": "Enables key drop shuffle", + "defaultValue": 0 + }, + "off": { + "keyString": "key_drop_shuffle.off", + "friendlyName": "Disabled", + "description": "Disables key drop shuffle", + "defaultValue": 50 + } + } + } + }, + "romOptions": { + "disablemusic": { + "keyString": "rom.disablemusic", + "friendlyName": "Game Music", + "description": "Enable or disable all in-game music. Sound-effects are unaffected.", + "inputType": "range", + "subOptions": { + "on": { + "keyString": "rom.disablemusic.on", + "friendlyName": "Disabled", + "description": "Disables in-game music.", + "defaultValue": 0 + }, + "off": { + "keyString": "rom.disablemusic.off", + "friendlyName": "Enabled", + "description": "Enables in-game music.", + "defaultValue": 50 + } + } + }, + "quickswap": { + "keyString": "rom.quickswap", + "friendlyName": "Item Quick-Swap", + "description": "Quickly change items by pressing the L+R shoulder buttons. Pressing L+R at the same time toggles the in-slot item (arrows and silver arrows, for example).", + "inputType": "range", + "subOptions": { + "on": { + "keyString": "rom.quickswap.on", + "friendlyName": "Enabled", + "description": "Enable quick-swap.", + "defaultValue": 0 + }, + "off": { + "keyString": "rom.quickswap.off", + "friendlyName": "Disabled", + "description": "Disable quick-swap.", + "defaultValue": 50 + } + } + }, + "menuspeed": { + "keyString": "menuspeed", + "friendlyName": "Menu Speed", + "description": "Choose how fast the in-game menu opens and closes.", + "inputType": "range", + "subOptions": { + "normal": { + "keyString": "rom.menuspeed.normal", + "friendlyName": "Vanilla", + "description": "Menu speed is unchanged from the vanilla game.", + "defaultValue": 50 + }, + "instant": { + "keyString": "rom.menuspeed.instant", + "friendlyName": "Instant", + "description": "The in-game menu appears and disappears instantly.", + "defaultValue": 0 + }, + "double": { + "keyString": "rom.menuspeed.double", + "friendlyName": "Double Speed", + "description": "The in-game menu animation moves at double speed.", + "defaultValue": 0 + }, + "triple": { + "keyString": "rom.menuspeed.triple", + "friendlyName": "Triple Speed", + "description": "The in-game menu animation moves at triple speed.", + "defaultValue": 0 + }, + "quadruple": { + "keyString": "rom.menuspeed.quadruple", + "friendlyName": "Quadruple Speed", + "description": "The in-game menu animation moves at quadruple speed.", + "defaultValue": 0 + }, + "half": { + "keyString": "rom.menuspeed.half", + "friendlyName": "Half Speed", + "description": "The in-game menu animation moves at half speed.", + "defaultValue": 0 + } + } + }, + "heartcolor": { + "keyString": "rom.heartcolor", + "friendlyName": "Heart Color", + "description": "Changes the color of your in-game health hearts.", + "inputType": "range", + "subOptions": { + "red": { + "keyString": "rom.heartcolor.red", + "friendlyName": "Red", + "description": "Health hearts are red.", + "defaultValue": 50 + }, + "blue": { + "keyString": "rom.heartcolor.blue", + "friendlyName": "Blue", + "description": "Health hearts are blue.", + "defaultValue": 0 + }, + "green": { + "keyString": "rom.heartcolor.green", + "friendlyName": "Green", + "description": "Health hearts are green.", + "defaultValue": 0 + }, + "yellow": { + "keyString": "rom.heartcolor.yellow", + "friendlyName": "Yellow", + "description": "Health hearts are yellow.", + "defaultValue": 0 + }, + "random": { + "keyString": "rom.heartcolor.random", + "friendlyName": "Random", + "description": "Health heart color is chosen randomly from red, green, blue, and yellow.", + "defaultValue": 0 + } + } + }, + "heartbeep": { + "keyString": "rom.heartbeep", + "friendlyName": "Heart Beep Speed", + "description": "Controls the frequency of the low-health beeping.", + "inputType": "range", + "subOptions": { + "double": { + "keyString": "rom.heartbeep.double", + "friendlyName": "Double", + "description": "Doubles the frequency of the low-health beep.", + "defaultValue": 0 + }, + "normal": { + "keyString": "rom.heartbeep.normal", + "friendlyName": "Vanilla", + "description": "Heart beep frequency is unchanged from the vanilla game.", + "defaultValue": 50 + }, + "half": { + "keyString": "rom.heartbeep.half", + "friendlyName": "Half Speed", + "description": "Heart beep plays at half-speed.", + "defaultValue": 0 + }, + "quarter": { + "keyString": "rom.heartbeep.quarter", + "friendlyName": "Quarter Speed", + "description": "Heart beep plays at one quarter-speed.", + "defaultValue": 0 + }, + "off": { + "keyString": "rom.heartbeep.off", + "friendlyName": "Disabled", + "description": "Disables the low-health heart beep.", + "defaultValue": 0 + } + } + }, + "ow_palettes": { + "keyString": "rom.ow_palettes", + "friendlyName": "Overworld Palette", + "description": "Randomize the colors of the overworld, within reason.", + "inputType": "range", + "subOptions": { + "default": { + "keyString": "rom.ow_palettes.default", + "friendlyName": "Vanilla", + "description": "Overworld colors will remain unchanged.", + "defaultValue": 50 + }, + "random": { + "keyString": "rom.ow_palettes.random", + "friendlyName": "Random", + "description": "Shuffles the colors of the overworld palette.", + "defaultValue": 0 + }, + "blackout": { + "keyString": "rom.ow_palettes.blackout", + "friendlyName": "Blackout", + "description": "Never use this. Makes all overworld palette colors black.", + "defaultValue": 0 + }, + "grayscale": { + "keyString": "rom.ow_palettes.grayscale", + "friendlyName": "Grayscale", + "description": "Removes all saturation of colors.", + "defaultValue": 0 + }, + "negative": { + "keyString": "rom.ow_palettes.negative", + "friendlyName": "Negative", + "description": "Invert all colors", + "defaultValue": 0 + }, + "classic": { + "keyString": "rom.ow_palettes.classic", + "friendlyName": "Classic", + "description": "Produces results similar to the website.", + "defaultValue": 0 + }, + "dizzy": { + "keyString": "rom.ow_palettes.dizzy", + "friendlyName": "Dizzy", + "description": "No logic in colors but saturation and lightness are conserved.", + "defaultValue": 0 + }, + "sick": { + "keyString": "rom.ow_palettes.sick", + "friendlyName": "Sick", + "description": "No logic in colors but lightness is conserved.", + "defaultValue": 0 + }, + "puke": { + "keyString": "rom.ow_palettes.Puke", + "friendlyName": "Puke", + "description": "No logic at all.", + "defaultValue": 0 + } + } + }, + "uw_palettes": { + "keyString": "rom.uw_palettes", + "friendlyName": "Underworld Palettes", + "description": "Randomize the colors of the underworld (caves, dungeons, etc.), within reason.", + "inputType": "range", + "subOptions": { + "default": { + "keyString": "rom.uw_palettes.default", + "friendlyName": "Vanilla", + "description": "Underworld colors will remain unchanged.", + "defaultValue": 50 + }, + "random": { + "keyString": "rom.uw_palettes.random", + "friendlyName": "Random", + "description": "Shuffles the colors of the underworld palette.", + "defaultValue": 0 + }, + "blackout": { + "keyString": "rom.uw_palettes.blackout", + "friendlyName": "Blackout", + "description": "Never use this. Makes all underworld palette colors black.", + "defaultValue": 0 + }, + "grayscale": { + "keyString": "rom.uw_palettes.grayscale", + "friendlyName": "Grayscale", + "description": "Removes all saturation of colors.", + "defaultValue": 0 + }, + "negative": { + "keyString": "rom.uw_palettes.negative", + "friendlyName": "Negative", + "description": "Invert all colors", + "defaultValue": 0 + }, + "classic": { + "keyString": "rom.uw_palettes.classic", + "friendlyName": "Classic", + "description": "Produces results similar to the website.", + "defaultValue": 0 + }, + "dizzy": { + "keyString": "rom.uw_palettes.dizzy", + "friendlyName": "Dizzy", + "description": "No logic in colors but saturation and lightness are conserved.", + "defaultValue": 0 + }, + "sick": { + "keyString": "rom.uw_palettes.sick", + "friendlyName": "Sick", + "description": "No logic in colors but lightness is conserved.", + "defaultValue": 0 + }, + "puke": { + "keyString": "rom.uw_palettes.Puke", + "friendlyName": "Puke", + "description": "No logic at all.", + "defaultValue": 0 + } + } + }, + "hud_palettes": { + "keyString": "rom.hud_palettes", + "friendlyName": "HUD Palettes", + "description": "Randomize the colors of the HUD (user interface), within reason.", + "inputType": "range", + "subOptions": { + "default": { + "keyString": "rom.hud_palettes.default", + "friendlyName": "Vanilla", + "description": "HUD colors will remain unchanged.", + "defaultValue": 50 + }, + "random": { + "keyString": "rom.hud_palettes.random", + "friendlyName": "Random", + "description": "Shuffles the colors of the HUD palette.", + "defaultValue": 0 + }, + "blackout": { + "keyString": "rom.hud_palettes.blackout", + "friendlyName": "Blackout", + "description": "Never use this. Makes all HUD palette colors black.", + "defaultValue": 0 + }, + "grayscale": { + "keyString": "rom.hud_palettes.grayscale", + "friendlyName": "Grayscale", + "description": "Removes all saturation of colors.", + "defaultValue": 0 + }, + "negative": { + "keyString": "rom.hud_palettes.negative", + "friendlyName": "Negative", + "description": "Invert all colors", + "defaultValue": 0 + }, + "classic": { + "keyString": "rom.hud_palettes.classic", + "friendlyName": "Classic", + "description": "Produces results similar to the website.", + "defaultValue": 0 + }, + "dizzy": { + "keyString": "rom.hud_palettes.dizzy", + "friendlyName": "Dizzy", + "description": "No logic in colors but saturation and lightness are conserved.", + "defaultValue": 0 + }, + "sick": { + "keyString": "rom.hud_palettes.sick", + "friendlyName": "Sick", + "description": "No logic in colors but lightness is conserved.", + "defaultValue": 0 + }, + "puke": { + "keyString": "rom.hud_palettes.Puke", + "friendlyName": "Puke", + "description": "No logic at all.", + "defaultValue": 0 + } + } + }, + "shield_palettes": { + "keyString": "rom.shield_palettes", + "friendlyName": "Shield Palettes", + "description": "Randomize the colors of the shield, within reason.", + "inputType": "range", + "subOptions": { + "default": { + "keyString": "rom.shield_palettes.default", + "friendlyName": "Vanilla", + "description": "Shield colors will remain unchanged.", + "defaultValue": 50 + }, + "random": { + "keyString": "rom.shield_palettes.random", + "friendlyName": "Random", + "description": "Shuffles the colors of the shield palette.", + "defaultValue": 0 + }, + "blackout": { + "keyString": "rom.shield_palettes.blackout", + "friendlyName": "Blackout", + "description": "Never use this. Makes all shield palette colors black.", + "defaultValue": 0 + }, + "grayscale": { + "keyString": "rom.shield_palettes.grayscale", + "friendlyName": "Grayscale", + "description": "Removes all saturation of colors.", + "defaultValue": 0 + }, + "negative": { + "keyString": "rom.shield_palettes.negative", + "friendlyName": "Negative", + "description": "Invert all colors", + "defaultValue": 0 + }, + "classic": { + "keyString": "rom.shield_palettes.classic", + "friendlyName": "Classic", + "description": "Produces results similar to the website.", + "defaultValue": 0 + }, + "dizzy": { + "keyString": "rom.shield_palettes.dizzy", + "friendlyName": "Dizzy", + "description": "No logic in colors but saturation and lightness are conserved.", + "defaultValue": 0 + }, + "sick": { + "keyString": "rom.shield_palettes.sick", + "friendlyName": "Sick", + "description": "No logic in colors but lightness is conserved.", + "defaultValue": 0 + }, + "puke": { + "keyString": "rom.shield_palettes.Puke", + "friendlyName": "Puke", + "description": "No logic at all.", + "defaultValue": 0 + } + } + }, + "sword_palettes": { + "keyString": "rom.sword_palettes", + "friendlyName": "Sword Palettes", + "description": "Randomize the colors of the sword, within reason.", + "inputType": "range", + "subOptions": { + "default": { + "keyString": "rom.sword_palettes.default", + "friendlyName": "Vanilla", + "description": "Sword colors will remain unchanged.", + "defaultValue": 50 + }, + "random": { + "keyString": "rom.sword_palettes.random", + "friendlyName": "Random", + "description": "Shuffles the colors of the sword palette.", + "defaultValue": 0 + }, + "blackout": { + "keyString": "rom.sword_palettes.blackout", + "friendlyName": "Blackout", + "description": "Never use this. Makes all sword palette colors black.", + "defaultValue": 0 + }, + "grayscale": { + "keyString": "rom.sword_palettes.grayscale", + "friendlyName": "Grayscale", + "description": "Removes all saturation of colors.", + "defaultValue": 0 + }, + "negative": { + "keyString": "rom.sword_palettes.negative", + "friendlyName": "Negative", + "description": "Invert all colors", + "defaultValue": 0 + }, + "classic": { + "keyString": "rom.sword_palettes.classic", + "friendlyName": "Classic", + "description": "Produces results similar to the website.", + "defaultValue": 0 + }, + "dizzy": { + "keyString": "rom.sword_palettes.dizzy", + "friendlyName": "Dizzy", + "description": "No logic in colors but saturation and lightness are conserved.", + "defaultValue": 0 + }, + "sick": { + "keyString": "rom.sword_palettes.sick", + "friendlyName": "Sick", + "description": "No logic in colors but lightness is conserved.", + "defaultValue": 0 + }, + "puke": { + "keyString": "rom.sword_palettes.Puke", + "friendlyName": "Puke", + "description": "No logic at all.", + "defaultValue": 0 + } + } + } + } +} diff --git a/WebHostLib/static/static/playerSettings.yaml b/WebHostLib/static/static/weightedSettings.yaml similarity index 100% rename from WebHostLib/static/static/playerSettings.yaml rename to WebHostLib/static/static/weightedSettings.yaml diff --git a/WebHostLib/static/styles/playerSettings.css b/WebHostLib/static/styles/playerSettings.css new file mode 100644 index 00000000..c08f6070 --- /dev/null +++ b/WebHostLib/static/styles/playerSettings.css @@ -0,0 +1,100 @@ +html{ + background-image: url('../static/backgrounds/grass/grass-0007-large.png'); + background-repeat: repeat; + background-size: 650px 650px; +} + +#player-settings{ + max-width: 1000px; + margin-left: auto; + margin-right: auto; + background-color: rgba(0, 0, 0, 0.15); + border-radius: 8px; + padding: 1rem; + color: #eeffeb; +} + +#player-settings code{ + background-color: #d9cd8e; + border-radius: 4px; + padding-left: 0.25rem; + padding-right: 0.25rem; + color: #000000; +} + +#player-settings h1{ + font-size: 2.5rem; + font-weight: normal; + border-bottom: 1px solid #ffffff; + width: 100%; + margin-bottom: 0.5rem; + color: #ffffff; + text-shadow: 1px 1px 4px #000000; +} + +#player-settings h2{ + font-size: 2rem; + font-weight: normal; + border-bottom: 1px solid #ffffff; + width: 100%; + margin-bottom: 0.5rem; + color: #ffe993; + text-transform: lowercase; + text-shadow: 1px 1px 2px #000000; +} + +#player-settings h3, #player-settings h4, #player-settings h5, #player-settings h6{ + color: #ffffff; + text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.5); +} + +#player-settings a{ + color: #ffef00; +} + +#player-settings input:not([type]){ + border: 1px solid #000000; + padding: 3px; + border-radius: 3px; + min-width: 150px; +} + +#player-settings select{ + border: 1px solid #000000; + padding: 3px; + border-radius: 3px; + min-width: 150px; +} + +#player-settings #game-options, #player-settings #rom-options{ + display: flex; + flex-direction: row; +} + +#player-settings .left, #game-options .right{ + flex-grow: 1; +} + +#player-settings table select{ + width: 250px; +} + +#player-settings table label{ + margin-right: 4px; +} + +@media all and (max-width: 1000px){ + #player-settings #game-options, #player-settings #rom-options{ + justify-content: flex-start; + flex-wrap: wrap; + } + + #player-settings .left, #player-settings .right{ + flex-grow: unset; + } + + #game-options table label, #rom-options table label{ + display: block; + min-width: 200px; + } +} diff --git a/WebHostLib/static/styles/player-settings.css b/WebHostLib/static/styles/weightedSettings.css similarity index 63% rename from WebHostLib/static/styles/player-settings.css rename to WebHostLib/static/styles/weightedSettings.css index 350a3865..45c17fef 100644 --- a/WebHostLib/static/styles/player-settings.css +++ b/WebHostLib/static/styles/weightedSettings.css @@ -4,7 +4,7 @@ html{ background-size: 650px 650px; } -#player-settings{ +#weighted-settings{ width: 60rem; margin-left: auto; margin-right: auto; @@ -14,7 +14,7 @@ html{ color: #eeffeb; } -#player-settings code{ +#weighted-settings code{ background-color: #d9cd8e; border-radius: 4px; padding-left: 0.25rem; @@ -22,7 +22,7 @@ html{ color: #000000; } -#player-settings h1{ +#weighted-settings h1{ font-size: 2.5rem; font-weight: normal; border-bottom: 1px solid #ffffff; @@ -32,7 +32,7 @@ html{ text-shadow: 1px 1px 4px #000000; } -#player-settings h2{ +#weighted-settings h2{ font-size: 2rem; font-weight: normal; border-bottom: 1px solid #ffffff; @@ -43,103 +43,103 @@ html{ text-shadow: 1px 1px 2px #000000; } -#player-settings h3, #player-settings h4, #player-settings h5, #player-settings h6{ +#weighted-settings h3, #weighted-settings h4, #weighted-settings h5, #weighted-settings h6{ color: #ffffff; text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.5); } -#player-settings .instructions{ +#weighted-settings .instructions{ text-align: left; } -#player-settings #settings-wrapper .setting-wrapper{ +#weighted-settings #settings-wrapper .setting-wrapper{ display: flex; flex-direction: column; justify-content: flex-start; width: 100%; } -#player-settings #settings-wrapper .setting-wrapper .title-span{ +#weighted-settings #settings-wrapper .setting-wrapper .title-span{ font-weight: 600; font-size: 1.25rem; } -#player-settings #settings-wrapper{ +#weighted-settings #settings-wrapper{ margin-top: 1.5rem; } -#player-settings #settings-wrapper #sprite-picker{ +#weighted-settings #settings-wrapper #sprite-picker{ margin-bottom: 2rem; } -#player-settings #settings-wrapper #sprite-picker #sprite-picker-sprites{ +#weighted-settings #settings-wrapper #sprite-picker #sprite-picker-sprites{ display: flex; flex-direction: row; flex-wrap: wrap; justify-content: flex-start; } -#player-settings #settings-wrapper #sprite-picker .sprite-img-wrapper{ +#weighted-settings #settings-wrapper #sprite-picker .sprite-img-wrapper{ cursor: pointer; margin: 10px; image-rendering: pixelated; } /* Center tooltip text for sprite images */ -#player-settings #settings-wrapper #sprite-picker .sprite-img-wrapper::after{ +#weighted-settings #settings-wrapper #sprite-picker .sprite-img-wrapper::after{ text-align: center; } -#player-settings #settings-wrapper #sprite-picker .sprite-img-wrapper img{ +#weighted-settings #settings-wrapper #sprite-picker .sprite-img-wrapper img{ width: 32px; height: 48px; } -#player-settings table.option-set{ +#weighted-settings table.option-set{ width: 100%; margin-bottom: 1.5rem; } -#player-settings table.option-set td.option-name{ +#weighted-settings table.option-set td.option-name{ width: 150px; font-weight: 400; font-size: 1rem; line-height: 2rem; } -#player-settings table.option-set td.option-name .delete-button{ +#weighted-settings table.option-set td.option-name .delete-button{ cursor: pointer; } -#player-settings table.option-set td.option-value{ +#weighted-settings table.option-set td.option-value{ line-height: 2rem; } -#player-settings table.option-set td.option-value input[type=range]{ +#weighted-settings table.option-set td.option-value input[type=range]{ width: 90%; min-width: 300px; vertical-align: middle; } -#player-settings #player-settings-button-row{ +#weighted-settings #weighted-settings-button-row{ display: flex; flex-direction: row; justify-content: space-between; width: 100%; } -#player-settings a{ +#weighted-settings a{ color: #ffef00; } -#player-settings input:not([type]){ +#weighted-settings input:not([type]){ border: 1px solid #000000; padding: 3px; border-radius: 3px; min-width: 150px; } -#player-settings select{ +#weighted-settings select{ border: 1px solid #000000; padding: 3px; border-radius: 3px; diff --git a/WebHostLib/templates/playerSettings.html b/WebHostLib/templates/playerSettings.html index a3d97428..48a94a43 100644 --- a/WebHostLib/templates/playerSettings.html +++ b/WebHostLib/templates/playerSettings.html @@ -2,71 +2,34 @@ {% block head %} Player Settings - - - + + {% endblock %} {% block body %} {% include 'header/grassHeader.html' %}

Player Settings

-
- This page is used to configure your player settings. You have three presets you can control, which - you can access using the dropdown menu below. These settings will be usable when generating a - single player game, or you can export them to a .yaml file and use them in a multiworld. - If you already have a settings file you would like to validate, you may do so on the - verification page. +

Choose the options you would like to play with! You may generate a single-player game from this page, + or download a settings file you can use to participate in a MultiWorld. If you would like to make + your settings extra random, check out the weighted settings + page.

+ +


+ +

+ +

Game Options

+
+
+
-
-
- Choose a preset and optionally assign it a nickname, which will be used as the file's description if - you download it. - - - - - - - - - - - -
- - - -
- - - -
-
- - Choose a name you want to represent you in-game. This will appear when you send items - to other people in multiworld games. - - - - - - - -
- - - -
-
-
- - +

ROM Options

+
+
+
-{% endblock %} +{% endblock %} diff --git a/WebHostLib/templates/weightedSettings.html b/WebHostLib/templates/weightedSettings.html new file mode 100644 index 00000000..2bde5dd5 --- /dev/null +++ b/WebHostLib/templates/weightedSettings.html @@ -0,0 +1,72 @@ +{% extends 'pageWrapper.html' %} + +{% block head %} + Player Settings + + + +{% endblock %} + +{% block body %} + {% include 'header/grassHeader.html' %} +
+

Weighted Settings

+
+ This page is used to configure your weighted settings. You have three presets you can control, which + you can access using the dropdown menu below. These settings will be usable when generating a + single player game, or you can export them to a .yaml file and use them in a multiworld. + If you already have a settings file you would like to validate, you may do so on the + verification page. +
+ +
+
+ Choose a preset and optionally assign it a nickname, which will be used as the file's description if + you download it. + + + + + + + + + + + +
+ + + +
+ + + +
+
+ + Choose a name you want to represent you in-game. This will appear when you send items + to other people in multiworld games. + + + + + + + +
+ + + +
+
+
+ + +
+
+{% endblock %} diff --git a/setup.py b/setup.py index 2d66383e..80ad9064 100644 --- a/setup.py +++ b/setup.py @@ -113,7 +113,7 @@ for data in extra_data: installfile(Path(data)) os.makedirs(buildfolder / "Players", exist_ok=True) -shutil.copyfile("playerSettings.yaml", buildfolder / "Players" / "playerSettings.yaml") +shutil.copyfile("playerSettings.yaml", buildfolder / "Players" / "weightedSettings.yaml") try: from maseya import z3pr