| 
									
										
										
										
											2021-07-24 23:09:34 -04:00
										 |  |  | let gameName = null; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-03 18:27:32 -05:00
										 |  |  | window.addEventListener('load', () => { | 
					
						
							| 
									
										
										
										
											2021-07-25 15:49:51 -04:00
										 |  |  |   gameName = document.getElementById('player-settings').getAttribute('data-game'); | 
					
						
							| 
									
										
										
										
											2021-07-24 23:09:34 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |   // Update game name on page
 | 
					
						
							| 
									
										
										
										
											2021-11-03 09:33:47 +01:00
										 |  |  |   document.getElementById('game-name').innerText = gameName; | 
					
						
							| 
									
										
										
										
											2021-07-24 23:09:34 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |   Promise.all([fetchSettingData()]).then((results) => { | 
					
						
							| 
									
										
										
										
											2021-09-17 21:23:31 -04:00
										 |  |  |     let settingHash = localStorage.getItem(`${gameName}-hash`); | 
					
						
							|  |  |  |     if (!settingHash) { | 
					
						
							|  |  |  |       // If no hash data has been set before, set it now
 | 
					
						
							|  |  |  |       localStorage.setItem(`${gameName}-hash`, md5(results[0])); | 
					
						
							|  |  |  |       localStorage.removeItem(gameName); | 
					
						
							|  |  |  |       settingHash = md5(results[0]); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (settingHash !== md5(results[0])) { | 
					
						
							| 
									
										
										
										
											2022-01-19 00:54:14 -05:00
										 |  |  |       showUserMessage("Your settings are out of date! Click here to update them! Be aware this will reset " + | 
					
						
							|  |  |  |         "them all to default."); | 
					
						
							|  |  |  |       document.getElementById('user-message').addEventListener('click', resetSettings); | 
					
						
							| 
									
										
										
										
											2021-09-17 21:23:31 -04:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-04 05:30:03 -05:00
										 |  |  |     // Page setup
 | 
					
						
							|  |  |  |     createDefaultSettings(results[0]); | 
					
						
							|  |  |  |     buildUI(results[0]); | 
					
						
							|  |  |  |     adjustHeaderWidth(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // Event listeners
 | 
					
						
							| 
									
										
										
										
											2020-12-04 00:40:57 -05:00
										 |  |  |     document.getElementById('export-settings').addEventListener('click', () => exportSettings()); | 
					
						
							| 
									
										
										
										
											2021-09-16 17:15:25 -04:00
										 |  |  |     document.getElementById('generate-race').addEventListener('click', () => generateGame(true)); | 
					
						
							| 
									
										
										
										
											2020-12-04 00:40:57 -05:00
										 |  |  |     document.getElementById('generate-game').addEventListener('click', () => generateGame()); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-04 05:30:03 -05:00
										 |  |  |     // Name input field
 | 
					
						
							| 
									
										
										
										
											2021-07-24 23:09:34 -04:00
										 |  |  |     const playerSettings = JSON.parse(localStorage.getItem(gameName)); | 
					
						
							| 
									
										
										
										
											2020-12-04 00:40:57 -05:00
										 |  |  |     const nameInput = document.getElementById('player-name'); | 
					
						
							| 
									
										
										
										
											2021-07-24 23:09:34 -04:00
										 |  |  |     nameInput.addEventListener('keyup', (event) => updateBaseSetting(event)); | 
					
						
							| 
									
										
										
										
											2020-12-04 00:40:57 -05:00
										 |  |  |     nameInput.value = playerSettings.name; | 
					
						
							| 
									
										
										
										
											2020-12-04 05:30:03 -05:00
										 |  |  |   }).catch((error) => { | 
					
						
							| 
									
										
										
										
											2021-07-24 23:20:46 -04:00
										 |  |  |     const url = new URL(window.location.href); | 
					
						
							| 
									
										
										
										
											2021-07-25 18:07:03 -04:00
										 |  |  |     window.location.replace(`${url.protocol}//${url.hostname}/page-not-found`); | 
					
						
							| 
									
										
										
										
											2020-12-04 05:30:03 -05:00
										 |  |  |   }) | 
					
						
							| 
									
										
										
										
											2020-12-03 18:27:32 -05:00
										 |  |  | }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-17 21:23:31 -04:00
										 |  |  | const resetSettings = () => { | 
					
						
							|  |  |  |   localStorage.removeItem(gameName); | 
					
						
							|  |  |  |   localStorage.removeItem(`${gameName}-hash`) | 
					
						
							|  |  |  |   window.location.reload(); | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-03 18:27:32 -05:00
										 |  |  | 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); } | 
					
						
							|  |  |  |   }; | 
					
						
							| 
									
										
										
										
											2021-10-11 21:37:08 -04:00
										 |  |  |   ajax.open('GET', `${window.location.origin}/static/generated/player-settings/${gameName}.json`, true); | 
					
						
							| 
									
										
										
										
											2020-12-03 18:27:32 -05:00
										 |  |  |   ajax.send(); | 
					
						
							|  |  |  | }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const createDefaultSettings = (settingData) => { | 
					
						
							| 
									
										
										
										
											2021-07-24 23:09:34 -04:00
										 |  |  |   if (!localStorage.getItem(gameName)) { | 
					
						
							|  |  |  |     const newSettings = { | 
					
						
							|  |  |  |       [gameName]: {}, | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  |     for (let baseOption of Object.keys(settingData.baseOptions)){ | 
					
						
							|  |  |  |       newSettings[baseOption] = settingData.baseOptions[baseOption]; | 
					
						
							| 
									
										
										
										
											2020-12-04 00:40:57 -05:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2020-12-03 18:27:32 -05:00
										 |  |  |     for (let gameOption of Object.keys(settingData.gameOptions)){ | 
					
						
							| 
									
										
										
										
											2021-07-24 23:09:34 -04:00
										 |  |  |       newSettings[gameName][gameOption] = settingData.gameOptions[gameOption].defaultValue; | 
					
						
							| 
									
										
										
										
											2020-12-03 18:27:32 -05:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2021-07-24 23:09:34 -04:00
										 |  |  |     localStorage.setItem(gameName, JSON.stringify(newSettings)); | 
					
						
							| 
									
										
										
										
											2020-12-03 18:27:32 -05:00
										 |  |  |   } | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const buildUI = (settingData) => { | 
					
						
							|  |  |  |   // Game Options
 | 
					
						
							|  |  |  |   const leftGameOpts = {}; | 
					
						
							|  |  |  |   const rightGameOpts = {}; | 
					
						
							|  |  |  |   Object.keys(settingData.gameOptions).forEach((key, index) => { | 
					
						
							| 
									
										
										
										
											2020-12-04 00:40:57 -05:00
										 |  |  |     if (index < Object.keys(settingData.gameOptions).length / 2) { leftGameOpts[key] = settingData.gameOptions[key]; } | 
					
						
							| 
									
										
										
										
											2020-12-03 18:27:32 -05:00
										 |  |  |     else { rightGameOpts[key] = settingData.gameOptions[key]; } | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  |   document.getElementById('game-options-left').appendChild(buildOptionsTable(leftGameOpts)); | 
					
						
							|  |  |  |   document.getElementById('game-options-right').appendChild(buildOptionsTable(rightGameOpts)); | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-04 05:30:03 -05:00
										 |  |  | const buildOptionsTable = (settings, romOpts = false) => { | 
					
						
							| 
									
										
										
										
											2021-07-24 23:09:34 -04:00
										 |  |  |   const currentSettings = JSON.parse(localStorage.getItem(gameName)); | 
					
						
							| 
									
										
										
										
											2020-12-03 18:27:32 -05:00
										 |  |  |   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); | 
					
						
							| 
									
										
										
										
											2021-08-22 20:01:58 -04:00
										 |  |  |     label.innerText = `${settings[setting].displayName}:`; | 
					
						
							| 
									
										
										
										
											2020-12-03 18:27:32 -05:00
										 |  |  |     tdl.appendChild(label); | 
					
						
							|  |  |  |     tr.appendChild(tdl); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // td Right
 | 
					
						
							|  |  |  |     const tdr = document.createElement('td'); | 
					
						
							| 
									
										
										
										
											2021-07-25 19:04:08 -04:00
										 |  |  |     let element = null; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     switch(settings[setting].type){ | 
					
						
							|  |  |  |       case 'select': | 
					
						
							|  |  |  |         element = document.createElement('div'); | 
					
						
							|  |  |  |         element.classList.add('select-container'); | 
					
						
							|  |  |  |         let select = document.createElement('select'); | 
					
						
							|  |  |  |         select.setAttribute('id', setting); | 
					
						
							|  |  |  |         select.setAttribute('data-key', setting); | 
					
						
							|  |  |  |         if (romOpts) { select.setAttribute('data-romOpt', '1'); } | 
					
						
							|  |  |  |         settings[setting].options.forEach((opt) => { | 
					
						
							|  |  |  |           const option = document.createElement('option'); | 
					
						
							|  |  |  |           option.setAttribute('value', opt.value); | 
					
						
							|  |  |  |           option.innerText = opt.name; | 
					
						
							|  |  |  |           if ((isNaN(currentSettings[gameName][setting]) && | 
					
						
							|  |  |  |             (parseInt(opt.value, 10) === parseInt(currentSettings[gameName][setting]))) || | 
					
						
							|  |  |  |             (opt.value === currentSettings[gameName][setting])) | 
					
						
							|  |  |  |           { | 
					
						
							|  |  |  |             option.selected = true; | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |           select.appendChild(option); | 
					
						
							|  |  |  |         }); | 
					
						
							|  |  |  |         select.addEventListener('change', (event) => updateGameSetting(event)); | 
					
						
							|  |  |  |         element.appendChild(select); | 
					
						
							|  |  |  |         break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       case 'range': | 
					
						
							|  |  |  |         element = document.createElement('div'); | 
					
						
							|  |  |  |         element.classList.add('range-container'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         let range = document.createElement('input'); | 
					
						
							|  |  |  |         range.setAttribute('type', 'range'); | 
					
						
							|  |  |  |         range.setAttribute('data-key', setting); | 
					
						
							|  |  |  |         range.setAttribute('min', settings[setting].min); | 
					
						
							|  |  |  |         range.setAttribute('max', settings[setting].max); | 
					
						
							|  |  |  |         range.value = currentSettings[gameName][setting]; | 
					
						
							|  |  |  |         range.addEventListener('change', (event) => { | 
					
						
							|  |  |  |           document.getElementById(`${setting}-value`).innerText = event.target.value; | 
					
						
							|  |  |  |           updateGameSetting(event); | 
					
						
							|  |  |  |         }); | 
					
						
							|  |  |  |         element.appendChild(range); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         let rangeVal = document.createElement('span'); | 
					
						
							|  |  |  |         rangeVal.classList.add('range-value'); | 
					
						
							|  |  |  |         rangeVal.setAttribute('id', `${setting}-value`); | 
					
						
							|  |  |  |         rangeVal.innerText = currentSettings[gameName][setting] ?? settings[setting].defaultValue; | 
					
						
							|  |  |  |         element.appendChild(rangeVal); | 
					
						
							|  |  |  |         break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       default: | 
					
						
							|  |  |  |         console.error(`Unknown setting type: ${settings[setting].type}`); | 
					
						
							|  |  |  |         console.error(setting); | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     tdr.appendChild(element); | 
					
						
							| 
									
										
										
										
											2020-12-03 18:27:32 -05:00
										 |  |  |     tr.appendChild(tdr); | 
					
						
							|  |  |  |     tbody.appendChild(tr); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   table.appendChild(tbody); | 
					
						
							|  |  |  |   return table; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-07-24 23:09:34 -04:00
										 |  |  | const updateBaseSetting = (event) => { | 
					
						
							|  |  |  |   const options = JSON.parse(localStorage.getItem(gameName)); | 
					
						
							|  |  |  |   options[event.target.getAttribute('data-key')] = isNaN(event.target.value) ? | 
					
						
							|  |  |  |     event.target.value : parseInt(event.target.value); | 
					
						
							|  |  |  |   localStorage.setItem(gameName, JSON.stringify(options)); | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const updateGameSetting = (event) => { | 
					
						
							|  |  |  |   const options = JSON.parse(localStorage.getItem(gameName)); | 
					
						
							|  |  |  |   options[gameName][event.target.getAttribute('data-key')] = isNaN(event.target.value) ? | 
					
						
							| 
									
										
										
										
											2020-12-04 05:30:03 -05:00
										 |  |  |       event.target.value : parseInt(event.target.value, 10); | 
					
						
							| 
									
										
										
										
											2021-07-24 23:09:34 -04:00
										 |  |  |   localStorage.setItem(gameName, JSON.stringify(options)); | 
					
						
							| 
									
										
										
										
											2020-12-03 18:27:32 -05:00
										 |  |  | }; | 
					
						
							| 
									
										
										
										
											2020-12-04 00:40:57 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | const exportSettings = () => { | 
					
						
							| 
									
										
										
										
											2021-07-24 23:09:34 -04:00
										 |  |  |   const settings = JSON.parse(localStorage.getItem(gameName)); | 
					
						
							| 
									
										
										
										
											2022-01-19 00:38:17 -05:00
										 |  |  |   if (!settings.name || settings.name.toLowerCase() === 'player' || settings.name.trim().length === 0) { | 
					
						
							| 
									
										
										
										
											2022-01-19 00:54:14 -05:00
										 |  |  |     return showUserMessage('You must enter a player name!'); | 
					
						
							| 
									
										
										
										
											2022-01-19 00:38:17 -05:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2020-12-04 00:40:57 -05:00
										 |  |  |   const yamlText = jsyaml.safeDump(settings, { noCompatMode: true }).replaceAll(/'(\d+)':/g, (x, y) => `${y}:`); | 
					
						
							|  |  |  |   download(`${document.getElementById('player-name').value}.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 generateGame = (raceMode = false) => { | 
					
						
							| 
									
										
										
										
											2022-01-19 00:54:14 -05:00
										 |  |  |   const settings = JSON.parse(localStorage.getItem(gameName)); | 
					
						
							|  |  |  |   if (!settings.name || settings.name.toLowerCase() === 'player' || settings.name.trim().length === 0) { | 
					
						
							|  |  |  |     return showUserMessage('You must enter a player name!'); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-04 00:40:57 -05:00
										 |  |  |   axios.post('/api/generate', { | 
					
						
							| 
									
										
										
										
											2022-01-19 00:54:14 -05:00
										 |  |  |     weights: { player: settings }, | 
					
						
							|  |  |  |     presetData: { player: settings }, | 
					
						
							| 
									
										
										
										
											2020-12-04 00:40:57 -05:00
										 |  |  |     playerCount: 1, | 
					
						
							|  |  |  |     race: raceMode ? '1' : '0', | 
					
						
							| 
									
										
										
										
											2020-12-04 00:42:33 -05:00
										 |  |  |   }).then((response) => { | 
					
						
							|  |  |  |     window.location.href = response.data.url; | 
					
						
							| 
									
										
										
										
											2021-05-13 21:33:56 -04:00
										 |  |  |   }).catch((error) => { | 
					
						
							| 
									
										
										
										
											2022-01-19 00:54:14 -05:00
										 |  |  |     let userMessage = 'Something went wrong and your game could not be generated.'; | 
					
						
							| 
									
										
										
										
											2021-07-21 18:08:15 +02:00
										 |  |  |     if (error.response.data.text) { | 
					
						
							| 
									
										
										
										
											2022-01-19 00:54:14 -05:00
										 |  |  |       userMessage += ' ' + error.response.data.text; | 
					
						
							| 
									
										
										
										
											2021-07-21 18:08:15 +02:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2022-01-19 00:54:14 -05:00
										 |  |  |     showUserMessage(userMessage); | 
					
						
							| 
									
										
										
										
											2021-05-13 21:33:56 -04:00
										 |  |  |     console.error(error); | 
					
						
							| 
									
										
										
										
											2020-12-04 00:40:57 -05:00
										 |  |  |   }); | 
					
						
							|  |  |  | }; | 
					
						
							| 
									
										
										
										
											2022-01-19 00:54:14 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | const showUserMessage = (message) => { | 
					
						
							|  |  |  |   const userMessage = document.getElementById('user-message'); | 
					
						
							|  |  |  |     userMessage.innerText = message; | 
					
						
							|  |  |  |     userMessage.classList.add('visible'); | 
					
						
							|  |  |  |     window.scrollTo(0, 0); | 
					
						
							|  |  |  |     userMessage.addEventListener('click', () => { | 
					
						
							|  |  |  |       userMessage.classList.remove('visible'); | 
					
						
							|  |  |  |       userMessage.addEventListener('click', hideUserMessage); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const hideUserMessage = () => { | 
					
						
							|  |  |  |   const userMessage = document.getElementById('user-message'); | 
					
						
							|  |  |  |   userMessage.classList.remove('visible'); | 
					
						
							|  |  |  |   userMessage.removeEventListener('click', hideUserMessage); | 
					
						
							|  |  |  | }; |