diff --git a/index.html b/index.html index c975fbb..d54ee0c 100644 --- a/index.html +++ b/index.html @@ -162,6 +162,7 @@ var editorEnabled = false; var showingEditorHelp = false; var canToggleEditorHelp = true; + var canExportLevel = true; var camera = { x: 0, @@ -230,6 +231,48 @@ return clone; } + function importJSON(callback) { + var input = document.createElement('input'); + input.type = 'file'; + input.accept = 'application/json'; + input.style.display = 'none'; + + input.addEventListener('change', function(event) { + var file = event.target.files[0]; + if (file) { + var reader = new FileReader(); + reader.onload = function(e) { + try { + var json = JSON.parse(e.target.result); + console.log('Imported JSON:', json); + if (typeof callback === 'function') { + callback(json); + } + } catch (err) { + console.error('Error parsing JSON:', err); + } + }; + reader.readAsText(file); + } + }); + + document.body.appendChild(input); + input.click(); + document.body.removeChild(input); + } + + function importOnlineLevel(url, callback) { + fetch(url) + .then(response => response.json()) + .then(json => { + console.log('Imported online JSON:', json); + callback(json); + }) + .catch(error => { + console.error('Error fetching JSON:', error); + }); + } + var entities = []; function addGoomba(x, y) { @@ -1092,7 +1135,7 @@ } setTimeout(function() { canToggleEditorHelp = true; - }, 500) + }, 500); } } @@ -1102,6 +1145,40 @@ cGL.removeButton("editorControlsX"); } } catch(err) {} + + if (cGL.buttons.exportLevelButton.pressed && allowPlacing && canExportLevel) { + canExportLevel = false; + setTimeout(function() { + var json = JSON.stringify(levelMap, null, 2); + var blob = new Blob([json], { type: 'application/json' }); + var a = document.createElement('a'); + a.href = URL.createObjectURL(blob); + r1 = cGL.rng(0, 9); + r2 = cGL.rng(0, 9); + r3 = cGL.rng(0, 9); + r4 = cGL.rng(0, 9); + r5 = cGL.rng(0, 9); + a.download = `level-${r1}${r2}${r3}${r4}${r5}.json`; + document.body.appendChild(a); + a.click(); + document.body.removeChild(a); + }, 1000) + setTimeout(function() { + canExportLevel = true; + }, 2000) + } + + if (cGL.buttons.importLevelButton.pressed && allowPlacing && canExportLevel) { + canExportLevel = false; + setTimeout(function() { + importJSON(function(json) { + levelMap = json; + }); + }, 1000) + setTimeout(function() { + canExportLevel = true; + }, 2000) + } } canvas.addEventListener('wheel', function(event) { @@ -1719,6 +1796,7 @@ coinsCollected = 0; renderingState = 2; // we will set this to 1 for level select later cGL.removeButton("playButton"); + cGL.removeButton("onlineLevelPlayButton"); if (cGL.mobile) { cGL.removeButton("fakeSoundButton"); } @@ -1729,6 +1807,7 @@ if (cGL.buttons.editStartButton.pressed) { cGL.removeButton("editStartButton"); cGL.removeButton("playButton"); + cGL.removeButton("onlineLevelPlayButton"); if (cGL.mobile) { cGL.removeButton("fakeSoundButton"); } @@ -1736,10 +1815,34 @@ renderingState = 3; cGL.addButton("editPlayLevelButton", 0, 60, 60, 40, true, "Play!"); cGL.addButton("editorHelpButton", 70, 60, 40, 40, true, "?"); + cGL.addButton("exportLevelButton", 0, 110, 110, 40, true, "Export"); + cGL.addButton("importLevelButton", 0, 160, 110, 40, true, "Import"); + cGL.stopBackgroundMusic(); setTimeout(function() {allowPlacing = true;}, 1000); } } catch(err) {} + if (cGL.buttons.onlineLevelPlayButton.pressed) { + entities = []; + originalLevelMap = deepCloneArray(levelMap); + mario.x = spawnPoint.x; + mario.y = spawnPoint.y; + lives = startingLives; + coinsCollected = 0; + importOnlineLevel(prompt("Enter the url"), function(json) { + levelMap = [[0]]; + renderingState = 2; // e + cGL.removeButton("playButton"); + cGL.removeButton("onlineLevelPlayButton"); + if (cGL.mobile) { + cGL.removeButton("fakeSoundButton"); + } + cGL.removeButton("editStartButton"); + levelMap = json; + cGL.startBackgroundMusic(`${assetsDirectory}/sounds/` + backgroundMusic); + }); + + } if (cGL.keysDown[69]) { // E cGL.addButton("editStartButton", (canvas.width / 2) - (100 /2), (canvas.height / 8 * 7) + 50, 100, 40, true, "Edit"); } @@ -1801,6 +1904,7 @@ if (cGL.mobile) { cGL.addButton("fakeSoundButton", (canvas.width / 2) - (100 /2), canvas.height / 8 * 7, 100, 40, true, "Enable Sound"); } + cGL.addButton("onlineLevelPlayButton", (canvas.width / 2) - (100 /2) - 120, canvas.height / 4 * 3, 100, 40, true, "Import Online Level!"); renderingState = 0; setTimeout(function() { cGL.startBackgroundMusic(`${assetsDirectory}/sounds/title_music.mp3`);