|  |  | @@ -4272,9 +4272,36 @@ function loadPreset() { | 
		
	
		
			
			|  |  |  | loadSettings(presets[select.selectedIndex]); | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | function grabFormData(form, warnings, panels, buttons) { | 
		
	
		
			
			|  |  |  | console.log(form); | 
		
	
		
			
			|  |  |  | if (form.hasAttribute("data-warning")) { | 
		
	
		
			
			|  |  |  | warnings.push(form.getAttribute("data-warning")); | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | if (form.hasAttribute("data-buttons")) { | 
		
	
		
			
			|  |  |  | let text = form.getAttribute("data-buttons"); | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | text.split(",").forEach(function(token) { | 
		
	
		
			
			|  |  |  | buttons.push(token); | 
		
	
		
			
			|  |  |  | }) | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | if (form.hasAttribute("data-panels")) { | 
		
	
		
			
			|  |  |  | let text = form.getAttribute("data-panels"); | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | text.split(",").forEach(function(token) { | 
		
	
		
			
			|  |  |  | panels.push(token); | 
		
	
		
			
			|  |  |  | }) | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | function generateSettings() { | 
		
	
		
			
			|  |  |  | let form = document.forms.namedItem("custom-species-form"); | 
		
	
		
			
			|  |  |  | let settings = {}; | 
		
	
		
			
			|  |  |  | let warnings = []; | 
		
	
		
			
			|  |  |  | let panels = []; | 
		
	
		
			
			|  |  |  | let buttons = []; | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | for (let i=0; i<form.length; i++) { | 
		
	
		
			
			|  |  |  | let value = form[i].value == "" ? form[i].placeholder : form[i].value; | 
		
	
		
			
			|  |  |  | if (form[i].type == "text") | 
		
	
	
		
			
				|  |  | @@ -4283,16 +4310,31 @@ function generateSettings() { | 
		
	
		
			
			|  |  |  | settings[form[i].name] = parseFloat(value); | 
		
	
		
			
			|  |  |  | else if (form[i].type == "checkbox") { | 
		
	
		
			
			|  |  |  | settings[form[i].name] = form[i].checked; | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | if (form[i].checked) { | 
		
	
		
			
			|  |  |  | grabFormData(form[i], warnings, panels, buttons); | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | } else if (form[i].type == "radio") { | 
		
	
		
			
			|  |  |  | let name = form[i].name; | 
		
	
		
			
			|  |  |  | if (form[i].checked) | 
		
	
		
			
			|  |  |  | if (form[i].checked) { | 
		
	
		
			
			|  |  |  | settings[name] = form[i].value; | 
		
	
		
			
			|  |  |  | grabFormData(form[i], warnings, panels, buttons); | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | } else if (form[i].type == "select-one") { | 
		
	
		
			
			|  |  |  | settings[form[i].name] = form[i][form[i].selectedIndex].value; | 
		
	
		
			
			|  |  |  | grabFormData(form[i][form[i].selectedIndex], warnings, panels, buttons); | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | return settings; | 
		
	
		
			
			|  |  |  | return { | 
		
	
		
			
			|  |  |  | "settings": settings, | 
		
	
		
			
			|  |  |  | "warnings": warnings, | 
		
	
		
			
			|  |  |  | "panels": panels, | 
		
	
		
			
			|  |  |  | "buttons": buttons | 
		
	
		
			
			|  |  |  | }; | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | function clearExport() { | 
		
	
	
		
			
				|  |  | @@ -4300,7 +4342,7 @@ function clearExport() { | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | function exportSettings() { | 
		
	
		
			
			|  |  |  | let settings = generateSettings(); | 
		
	
		
			
			|  |  |  | let settings = generateSettings()["settings"]; | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | document.getElementById("export-area").value = JSON.stringify(settings); | 
		
	
		
			
			|  |  |  | } | 
		
	
	
		
			
				|  |  | @@ -4344,7 +4386,7 @@ function updateCustomCharacters() { | 
		
	
		
			
			|  |  |  | function saveSettings() { | 
		
	
		
			
			|  |  |  | let storage = window.localStorage; | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | let settings = generateSettings(); | 
		
	
		
			
			|  |  |  | let settings = generateSettings()["settings"]; | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | let saves = JSON.parse(storage.getItem("custom-characters")); | 
		
	
		
			
			|  |  |  | 
 | 
		
	
	
		
			
				|  |  | @@ -4463,16 +4505,28 @@ function disable_panel(name) { | 
		
	
		
			
			|  |  |  | document.getElementById("action-part-" + name).style.display = "none"; | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | function enableWarnings(settings, warns) { | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | function enablePanels(settings) { | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | function enableButtons(settings) { | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | function startGame(e) { | 
		
	
		
			
			|  |  |  | if (started) | 
		
	
		
			
			|  |  |  | return; | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | started = true; | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | window.localStorage.setItem('autosave',JSON.stringify(generateSettings())); | 
		
	
		
			
			|  |  |  | window.localStorage.setItem('autosave',JSON.stringify(generateSettings()["settings"])); | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | let warns = []; | 
		
	
		
			
			|  |  |  | let settings = generateSettings(); | 
		
	
		
			
			|  |  |  | let settings = generateSettings()["settings"]; | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | for (var key in settings) { | 
		
	
		
			
			|  |  |  | if (settings.hasOwnProperty(key)) { | 
		
	
	
		
			
				|  |  | @@ -4483,6 +4537,10 @@ function startGame(e) { | 
		
	
		
			
			|  |  |  | registerActions(); | 
		
	
		
			
			|  |  |  | registerOptions(); | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | enableWarnings(settings, warns); | 
		
	
		
			
			|  |  |  | enablePanels(settings); | 
		
	
		
			
			|  |  |  | enableButtons(settings); | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | if (!macro.hasTail) { | 
		
	
		
			
			|  |  |  | macro.tailCount = 0; | 
		
	
		
			
			|  |  |  | } | 
		
	
	
		
			
				|  |  | @@ -5051,7 +5109,7 @@ function updatePreview(name) { | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | function debugLog() { | 
		
	
		
			
			|  |  |  | console.log("Your character settings:"); | 
		
	
		
			
			|  |  |  | console.log(JSON.stringify(generateSettings())); | 
		
	
		
			
			|  |  |  | console.log(JSON.stringify(generateSettings()["settings"])); | 
		
	
		
			
			|  |  |  | console.log("Current macro state:"); | 
		
	
		
			
			|  |  |  | console.log(JSON.stringify( macro, function( key, value) { | 
		
	
		
			
			|  |  |  | if( key == 'owner') { return "owner";} | 
		
	
	
		
			
				|  |  | @@ -5226,6 +5284,8 @@ function render_radio_option(options_div, option) { | 
		
	
		
			
			|  |  |  | label.setAttribute("for", option.id + "-" + choice.value); | 
		
	
		
			
			|  |  |  | label.innerText = choice.name; | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | attach_form_data(input, choice); | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | li.appendChild(input); | 
		
	
		
			
			|  |  |  | li.appendChild(label); | 
		
	
		
			
			|  |  |  | options_div.appendChild(li); | 
		
	
	
		
			
				|  |  | @@ -5339,6 +5399,8 @@ function render_option(root_div, li, option) { | 
		
	
		
			
			|  |  |  | render_subcategory_option(li, option); | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | attach_form_data(li, option); | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | root_div.appendChild(li); | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
	
		
			
				|  |  | @@ -5363,6 +5425,9 @@ function render_category(root, category) { | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | header.classList.add("custom-header"); | 
		
	
		
			
			|  |  |  | header.setAttribute("for", category.id); | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | attach_form_data(input, category); | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | } else { | 
		
	
		
			
			|  |  |  | header = document.createElement("div"); | 
		
	
		
			
			|  |  |  | header.classList.add("custom-header-static"); | 
		
	
	
		
			
				|  |  | @@ -5395,6 +5460,20 @@ function construct_options() { | 
		
	
		
			
			|  |  |  | }); | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | function attach_form_data(element, data) { | 
		
	
		
			
			|  |  |  | if (data.warning != undefined) { | 
		
	
		
			
			|  |  |  | element.setAttribute("data-warning", data.warning); | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | if (data.panels != undefined) { | 
		
	
		
			
			|  |  |  | element.setAttribute("data-panels", data.panels.join(",")); | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | if (data.buttons != undefined) { | 
		
	
		
			
			|  |  |  | element.setAttribute("data-buttons", data.buttons.join(",")); | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | function construct_panels() { | 
		
	
		
			
			|  |  |  | let root = document.getElementById("action-panel"); | 
		
	
		
			
			|  |  |  | 
 | 
		
	
	
		
			
				|  |  | 
 |