Player Settings fully operational, but missing sprite options
This commit is contained in:
		
							parent
							
								
									366c92de49
								
							
						
					
					
						commit
						b5ee2edca5
					
				| 
						 | 
				
			
			@ -6,9 +6,9 @@ window.addEventListener('load', () => {
 | 
			
		|||
 | 
			
		||||
        // Update localStorage with three settings objects. Preserve original objects if present.
 | 
			
		||||
        for (let i=1; i<=3; i++) {
 | 
			
		||||
            const localSettings = JSON.parse(localStorage.getItem(`gameSettings${i}`));
 | 
			
		||||
            const localSettings = JSON.parse(localStorage.getItem(`playerSettings${i}`));
 | 
			
		||||
            const updatedObj = localSettings ? Object.assign(sourceData, localSettings) : sourceData;
 | 
			
		||||
            localStorage.setItem(`gameSettings${i}`, JSON.stringify(updatedObj));
 | 
			
		||||
            localStorage.setItem(`playerSettings${i}`, JSON.stringify(updatedObj));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Build the entire UI
 | 
			
		||||
| 
						 | 
				
			
			@ -19,6 +19,8 @@ window.addEventListener('load', () => {
 | 
			
		|||
        document.getElementById('preset-number').addEventListener('change', populateSettings);
 | 
			
		||||
        gameSettings.addEventListener('change', handleOptionChange);
 | 
			
		||||
        gameSettings.addEventListener('keyup', handleOptionChange);
 | 
			
		||||
 | 
			
		||||
        document.getElementById('export-button').addEventListener('click', exportSettings);
 | 
			
		||||
    }).catch((error) => {
 | 
			
		||||
        gameSettings.innerHTML = `
 | 
			
		||||
            <h2>Something went wrong while loading your game settings page.</h2>
 | 
			
		||||
| 
						 | 
				
			
			@ -59,20 +61,20 @@ const fetchPlayerSettingsJson = () => 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(`gameSettings${presetNumber}`))
 | 
			
		||||
    const settings = JSON.parse(localStorage.getItem(`playerSettings${presetNumber}`))
 | 
			
		||||
    const settingString = event.target.getAttribute('data-setting');
 | 
			
		||||
    document.getElementById(settingString).innerText = event.target.value;
 | 
			
		||||
    if(getSettingValue(settings, settingString) !== false){
 | 
			
		||||
        const keys = settingString.split('.');
 | 
			
		||||
        switch (keys.length) {
 | 
			
		||||
            case 1:
 | 
			
		||||
                settings[keys[0]] = event.target.value;
 | 
			
		||||
                settings[keys[0]] = isNaN(event.target.value) ? event.target.value : parseInt(event.target.value, 10);
 | 
			
		||||
                break;
 | 
			
		||||
            case 2:
 | 
			
		||||
                settings[keys[0]][keys[1]] = event.target.value;
 | 
			
		||||
                settings[keys[0]][keys[1]] = isNaN(event.target.value) ? event.target.value : parseInt(event.target.value, 10);
 | 
			
		||||
                break;
 | 
			
		||||
            case 3:
 | 
			
		||||
                settings[keys[0]][keys[1]][keys[2]] = event.target.value;
 | 
			
		||||
                settings[keys[0]][keys[1]][keys[2]] = isNaN(event.target.value) ? event.target.value : parseInt(event.target.value, 10);
 | 
			
		||||
                break;
 | 
			
		||||
            default:
 | 
			
		||||
                console.warn(`Unknown setting string received: ${settingString}`)
 | 
			
		||||
| 
						 | 
				
			
			@ -80,7 +82,7 @@ const handleOptionChange = (event) => {
 | 
			
		|||
        }
 | 
			
		||||
 | 
			
		||||
        // Save the updated settings object bask to localStorage
 | 
			
		||||
        localStorage.setItem(`gameSettings${presetNumber}`, JSON.stringify(settings));
 | 
			
		||||
        localStorage.setItem(`playerSettings${presetNumber}`, JSON.stringify(settings));
 | 
			
		||||
    }else{
 | 
			
		||||
        console.warn(`Unknown setting string received: ${settingString}`)
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			@ -88,7 +90,7 @@ const handleOptionChange = (event) => {
 | 
			
		|||
 | 
			
		||||
const populateSettings = () => {
 | 
			
		||||
    const presetNumber = document.getElementById('preset-number').value;
 | 
			
		||||
    const settings = JSON.parse(localStorage.getItem(`gameSettings${presetNumber}`))
 | 
			
		||||
    const settings = JSON.parse(localStorage.getItem(`playerSettings${presetNumber}`))
 | 
			
		||||
    const settingsInputs = Array.from(document.querySelectorAll('.setting'));
 | 
			
		||||
    settingsInputs.forEach((input) => {
 | 
			
		||||
        const settingString = input.getAttribute('data-setting');
 | 
			
		||||
| 
						 | 
				
			
			@ -119,9 +121,37 @@ const getSettingValue = (settings, keyString) => {
 | 
			
		|||
    return currentVal;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
const exportSettings = () => {
 | 
			
		||||
    const presetNumber = document.getElementById('preset-number').value;
 | 
			
		||||
    const settings = JSON.parse(localStorage.getItem(`playerSettings${presetNumber}`));
 | 
			
		||||
    const yamlText = jsyaml.safeDump(settings);
 | 
			
		||||
    download(`${settings.description}.yaml`, yamlText);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/** Create an anchor and trigger a download of a text file. */
 | 
			
		||||
const download = (filename, text) => {
 | 
			
		||||
    const downloadLink = document.createElement('a');
 | 
			
		||||
    downloadLink.setAttribute('href','data:text/yaml;charset=utf-8,'+ encodeURIComponent(text))
 | 
			
		||||
    downloadLink.setAttribute('download', filename);
 | 
			
		||||
    downloadLink.style.display = 'none';
 | 
			
		||||
    document.body.appendChild(downloadLink);
 | 
			
		||||
    downloadLink.click();
 | 
			
		||||
    document.body.removeChild(downloadLink);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
const buildUI = (settings) => {
 | 
			
		||||
    const settingsWrapper = document.getElementById('settings-wrapper');
 | 
			
		||||
    Object.values(settings).forEach((setting) => {
 | 
			
		||||
    const settingTypes = {
 | 
			
		||||
        gameOptions: 'Game Options',
 | 
			
		||||
        romOptions: 'ROM Options'
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    Object.keys(settingTypes).forEach((settingTypeKey) => {
 | 
			
		||||
        const sectionHeader = document.createElement('h1');
 | 
			
		||||
        sectionHeader.innerText = settingTypes[settingTypeKey];
 | 
			
		||||
        settingsWrapper.appendChild(sectionHeader);
 | 
			
		||||
 | 
			
		||||
       Object.values(settings[settingTypeKey]).forEach((setting) => {
 | 
			
		||||
        if (typeof(setting.inputType) === 'undefined' || !setting.inputType){
 | 
			
		||||
            console.error(setting);
 | 
			
		||||
            throw new Error('Setting with no inputType specified.');
 | 
			
		||||
| 
						 | 
				
			
			@ -139,6 +169,7 @@ const buildUI = (settings) => {
 | 
			
		|||
                throw new Error('Unhandled inputType specified.');
 | 
			
		||||
        }
 | 
			
		||||
    });
 | 
			
		||||
    });
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
const buildRangeSettings = (parentElement, settings) => {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,4 +1,5 @@
 | 
			
		|||
{
 | 
			
		||||
  "gameOptions": {
 | 
			
		||||
    "description": {
 | 
			
		||||
    "keyString": "description",
 | 
			
		||||
    "friendlyName": "Description",
 | 
			
		||||
| 
						 | 
				
			
			@ -699,5 +700,608 @@
 | 
			
		|||
          "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
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "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.times_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
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "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
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
  "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
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "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
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -50,3 +50,8 @@
 | 
			
		|||
    min-width: 300px;
 | 
			
		||||
    vertical-align: middle;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#game-settings #game-settings-button-row{
 | 
			
		||||
    width: 100%;
 | 
			
		||||
    text-align: center;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,7 +1,7 @@
 | 
			
		|||
{% extends 'layout.html' %}
 | 
			
		||||
 | 
			
		||||
{% block head %}
 | 
			
		||||
    <title>Game Settings</title>
 | 
			
		||||
    <title>Player Settings</title>
 | 
			
		||||
    <link rel="stylesheet" type="text/css" href="{{ static_autoversion("styles/player-settings.css") }}" />
 | 
			
		||||
    <script type="application/ecmascript" src="{{ static_autoversion("assets/js-yaml.min.js") }}"></script>
 | 
			
		||||
    <script type="application/ecmascript" src="{{ static_autoversion("assets/player-settings.js") }}"></script>
 | 
			
		||||
| 
						 | 
				
			
			@ -61,5 +61,8 @@
 | 
			
		|||
                </tbody>
 | 
			
		||||
            </table>
 | 
			
		||||
        </div>
 | 
			
		||||
        <div id="game-settings-button-row">
 | 
			
		||||
            <button id="export-button">Export Settings</button>
 | 
			
		||||
        </div>
 | 
			
		||||
    </div>
 | 
			
		||||
{%  endblock %}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue