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.
 | 
					        // Update localStorage with three settings objects. Preserve original objects if present.
 | 
				
			||||||
        for (let i=1; i<=3; i++) {
 | 
					        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;
 | 
					            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
 | 
					        // Build the entire UI
 | 
				
			||||||
| 
						 | 
					@ -19,6 +19,8 @@ window.addEventListener('load', () => {
 | 
				
			||||||
        document.getElementById('preset-number').addEventListener('change', populateSettings);
 | 
					        document.getElementById('preset-number').addEventListener('change', populateSettings);
 | 
				
			||||||
        gameSettings.addEventListener('change', handleOptionChange);
 | 
					        gameSettings.addEventListener('change', handleOptionChange);
 | 
				
			||||||
        gameSettings.addEventListener('keyup', handleOptionChange);
 | 
					        gameSettings.addEventListener('keyup', handleOptionChange);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        document.getElementById('export-button').addEventListener('click', exportSettings);
 | 
				
			||||||
    }).catch((error) => {
 | 
					    }).catch((error) => {
 | 
				
			||||||
        gameSettings.innerHTML = `
 | 
					        gameSettings.innerHTML = `
 | 
				
			||||||
            <h2>Something went wrong while loading your game settings page.</h2>
 | 
					            <h2>Something went wrong while loading your game settings page.</h2>
 | 
				
			||||||
| 
						 | 
					@ -59,20 +61,20 @@ const fetchPlayerSettingsJson = () => new Promise((resolve, reject) => {
 | 
				
			||||||
const handleOptionChange = (event) => {
 | 
					const handleOptionChange = (event) => {
 | 
				
			||||||
    if(!event.target.matches('.setting')) { return; }
 | 
					    if(!event.target.matches('.setting')) { return; }
 | 
				
			||||||
    const presetNumber = document.getElementById('preset-number').value;
 | 
					    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');
 | 
					    const settingString = event.target.getAttribute('data-setting');
 | 
				
			||||||
    document.getElementById(settingString).innerText = event.target.value;
 | 
					    document.getElementById(settingString).innerText = event.target.value;
 | 
				
			||||||
    if(getSettingValue(settings, settingString) !== false){
 | 
					    if(getSettingValue(settings, settingString) !== false){
 | 
				
			||||||
        const keys = settingString.split('.');
 | 
					        const keys = settingString.split('.');
 | 
				
			||||||
        switch (keys.length) {
 | 
					        switch (keys.length) {
 | 
				
			||||||
            case 1:
 | 
					            case 1:
 | 
				
			||||||
                settings[keys[0]] = event.target.value;
 | 
					                settings[keys[0]] = isNaN(event.target.value) ? event.target.value : parseInt(event.target.value, 10);
 | 
				
			||||||
                break;
 | 
					                break;
 | 
				
			||||||
            case 2:
 | 
					            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;
 | 
					                break;
 | 
				
			||||||
            case 3:
 | 
					            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;
 | 
					                break;
 | 
				
			||||||
            default:
 | 
					            default:
 | 
				
			||||||
                console.warn(`Unknown setting string received: ${settingString}`)
 | 
					                console.warn(`Unknown setting string received: ${settingString}`)
 | 
				
			||||||
| 
						 | 
					@ -80,7 +82,7 @@ const handleOptionChange = (event) => {
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // Save the updated settings object bask to localStorage
 | 
					        // Save the updated settings object bask to localStorage
 | 
				
			||||||
        localStorage.setItem(`gameSettings${presetNumber}`, JSON.stringify(settings));
 | 
					        localStorage.setItem(`playerSettings${presetNumber}`, JSON.stringify(settings));
 | 
				
			||||||
    }else{
 | 
					    }else{
 | 
				
			||||||
        console.warn(`Unknown setting string received: ${settingString}`)
 | 
					        console.warn(`Unknown setting string received: ${settingString}`)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
| 
						 | 
					@ -88,7 +90,7 @@ const handleOptionChange = (event) => {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const populateSettings = () => {
 | 
					const populateSettings = () => {
 | 
				
			||||||
    const presetNumber = document.getElementById('preset-number').value;
 | 
					    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'));
 | 
					    const settingsInputs = Array.from(document.querySelectorAll('.setting'));
 | 
				
			||||||
    settingsInputs.forEach((input) => {
 | 
					    settingsInputs.forEach((input) => {
 | 
				
			||||||
        const settingString = input.getAttribute('data-setting');
 | 
					        const settingString = input.getAttribute('data-setting');
 | 
				
			||||||
| 
						 | 
					@ -119,9 +121,37 @@ const getSettingValue = (settings, keyString) => {
 | 
				
			||||||
    return currentVal;
 | 
					    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 buildUI = (settings) => {
 | 
				
			||||||
    const settingsWrapper = document.getElementById('settings-wrapper');
 | 
					    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){
 | 
					        if (typeof(setting.inputType) === 'undefined' || !setting.inputType){
 | 
				
			||||||
            console.error(setting);
 | 
					            console.error(setting);
 | 
				
			||||||
            throw new Error('Setting with no inputType specified.');
 | 
					            throw new Error('Setting with no inputType specified.');
 | 
				
			||||||
| 
						 | 
					@ -139,6 +169,7 @@ const buildUI = (settings) => {
 | 
				
			||||||
                throw new Error('Unhandled inputType specified.');
 | 
					                throw new Error('Unhandled inputType specified.');
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const buildRangeSettings = (parentElement, settings) => {
 | 
					const buildRangeSettings = (parentElement, settings) => {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| 
						 | 
					@ -50,3 +50,8 @@
 | 
				
			||||||
    min-width: 300px;
 | 
					    min-width: 300px;
 | 
				
			||||||
    vertical-align: middle;
 | 
					    vertical-align: middle;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#game-settings #game-settings-button-row{
 | 
				
			||||||
 | 
					    width: 100%;
 | 
				
			||||||
 | 
					    text-align: center;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,7 +1,7 @@
 | 
				
			||||||
{% extends 'layout.html' %}
 | 
					{% extends 'layout.html' %}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
{% block head %}
 | 
					{% block head %}
 | 
				
			||||||
    <title>Game Settings</title>
 | 
					    <title>Player Settings</title>
 | 
				
			||||||
    <link rel="stylesheet" type="text/css" href="{{ static_autoversion("styles/player-settings.css") }}" />
 | 
					    <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/js-yaml.min.js") }}"></script>
 | 
				
			||||||
    <script type="application/ecmascript" src="{{ static_autoversion("assets/player-settings.js") }}"></script>
 | 
					    <script type="application/ecmascript" src="{{ static_autoversion("assets/player-settings.js") }}"></script>
 | 
				
			||||||
| 
						 | 
					@ -61,5 +61,8 @@
 | 
				
			||||||
                </tbody>
 | 
					                </tbody>
 | 
				
			||||||
            </table>
 | 
					            </table>
 | 
				
			||||||
        </div>
 | 
					        </div>
 | 
				
			||||||
 | 
					        <div id="game-settings-button-row">
 | 
				
			||||||
 | 
					            <button id="export-button">Export Settings</button>
 | 
				
			||||||
 | 
					        </div>
 | 
				
			||||||
    </div>
 | 
					    </div>
 | 
				
			||||||
{%  endblock %}
 | 
					{%  endblock %}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue