tilesy/script.js

166 lines
5.3 KiB
JavaScript
Raw Normal View History

2020-07-18 20:47:04 +00:00
import init, {load_default_game_data, add_tiles} from './pkg/bitsy_tiles.js';
2020-07-19 23:18:06 +00:00
// stolen from https://ourcodeworld.com/articles/read/189/how-to-create-a-file-and-generate-a-download-with-javascript-in-the-browser-without-a-server
function download(filename, text) {
let element = document.createElement('a');
element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text));
element.setAttribute('download', filename);
element.style.display = 'none';
document.body.appendChild(element);
element.click();
document.body.removeChild(element);
}
function el(id) {
return document.getElementById(id);
}
2020-07-19 21:36:36 +00:00
function pagination(e) {
const parent = e.target.parentNode;
parent.style.display = "none";
if (e.target.classList.contains("next")) {
parent.nextSibling.style.display = "block";
} else if (e.target.classList.contains("prev")) {
parent.previousSibling.style.display = "block";
} else if (e.target.classList.contains("start")) {
document.getElementById("start").style.display = "block";
}
}
function readFile(input, callback, type = "text") {
if (input.files && input.files[0]) {
let reader = new FileReader();
reader.onload = callback;
if (type === "text") {
reader.readAsText(input.files[0]);
} else {
reader.readAsDataURL(input.files[0]);
}
}
}
2020-07-18 20:47:04 +00:00
async function run() {
await init();
const buttonAddImage = el("add");
2020-07-19 23:18:06 +00:00
const buttonDownload = el("download");
const buttonGameDataProceed = el("game-data-next");
const buttonImportGame = el("import");
const buttonLoadGame = el("load");
const buttonNewGame = el("new");
2020-07-20 15:41:45 +00:00
const inputPrefix = el("prefix");
const imagePreview = el("preview");
const resetButton = el("reset");
2020-07-20 15:41:45 +00:00
const spanTileNamePreview = el("tile-name-preview")
const textareaGameDataInput = el("game-data");
const textareaGameDataOutput = el("output");
2020-07-18 20:47:04 +00:00
// hide all pages except start page
for (let page of document.getElementsByClassName('page')) {
page.style.display = "none";
}
el("start").style.display = "block";
2020-07-18 20:47:04 +00:00
for (let pageButton of document.getElementsByClassName("pagination")) {
2020-07-19 21:36:36 +00:00
pageButton.addEventListener('click', pagination);
2020-07-18 20:47:04 +00:00
pageButton.addEventListener('touchend', pagination);
}
function new_game() {
textareaGameDataInput.value = load_default_game_data();
2020-07-18 20:47:04 +00:00
// we don't need to look at the default game data, so skip ahead to the image page
2020-07-19 19:51:56 +00:00
buttonGameDataProceed.click();
2020-07-18 20:47:04 +00:00
}
function clear_game() {
textareaGameDataInput.value = "";
2020-07-18 20:47:04 +00:00
}
buttonNewGame.addEventListener("click", new_game);
buttonNewGame.addEventListener("touchend", new_game);
buttonLoadGame.addEventListener("click", clear_game);
buttonLoadGame.addEventListener("touchend", clear_game);
2020-07-18 20:47:04 +00:00
// handle game data and image
el("game").addEventListener("change", function() {
readFile(this, function (e) {
textareaGameDataInput.value = e.target.result;
2020-07-19 19:51:56 +00:00
checkGameData();
}, "text");
});
2020-07-19 19:51:56 +00:00
function checkGameData() {
if (textareaGameDataInput.value.length > 0) {
2020-07-19 19:51:56 +00:00
buttonGameDataProceed.removeAttribute("disabled");
} else {
buttonGameDataProceed.setAttribute("disabled", "disabled");
}
}
textareaGameDataInput.addEventListener("change", checkGameData);
textareaGameDataInput.addEventListener("keyup", checkGameData);
2020-07-20 15:41:45 +00:00
checkGameData();
2020-07-20 16:35:02 +00:00
2020-07-20 15:41:45 +00:00
imagePreview.style.display = "none";
2020-07-18 20:47:04 +00:00
el('image').addEventListener('change', function () {
2020-07-18 20:47:04 +00:00
readFile(this, function (e) {
2020-07-20 15:41:45 +00:00
imagePreview.src = e.target.result;
imagePreview.style.display = "initial"
2020-07-18 20:47:04 +00:00
}, "image");
});
2020-07-20 15:41:45 +00:00
function handleTilePrefix() {
if (this.value) {
2020-07-20 16:36:39 +00:00
spanTileNamePreview.innerText = `'${this.value} 1' etc.`
2020-07-20 15:41:45 +00:00
} else {
2020-07-20 16:36:39 +00:00
spanTileNamePreview.innerText = "'forest 1' etc."
2020-07-20 15:41:45 +00:00
}
}
2020-07-20 16:35:02 +00:00
inputPrefix.addEventListener("keyup", handleTilePrefix);
2020-07-20 15:41:45 +00:00
inputPrefix.addEventListener("change", handleTilePrefix);
handleTilePrefix();
2020-07-18 20:47:04 +00:00
function addTiles() {
let image = el("preview").getAttribute("src");
let gameData = el("game-data").value;
let prefix = el("prefix").value;
2020-07-19 21:02:22 +00:00
textareaGameDataOutput.value = add_tiles(gameData, image, prefix);
2020-07-18 20:47:04 +00:00
}
buttonImportGame.addEventListener("click", addTiles);
buttonImportGame.addEventListener("touchend", addTiles);
2020-07-19 19:51:56 +00:00
2020-07-19 23:18:06 +00:00
function handleDownload() {
download("output.bitsy", textareaGameDataOutput.value);
}
buttonDownload.addEventListener("click", handleDownload);
buttonDownload.addEventListener("touchend", handleDownload);
function addImage() {
textareaGameDataInput.value = textareaGameDataOutput.value;
textareaGameDataOutput.value = "";
}
buttonAddImage.addEventListener("click", addImage);
buttonAddImage.addEventListener("touchend", addImage);
2020-07-19 19:51:56 +00:00
function reset() {
2020-07-19 21:02:22 +00:00
clear_game();
2020-07-20 15:41:45 +00:00
imagePreview.removeAttribute("src");
2020-07-19 19:51:56 +00:00
}
2020-07-19 21:36:43 +00:00
resetButton.addEventListener("click", reset);
resetButton.addEventListener("touchend", reset);
2020-07-18 20:47:04 +00:00
}
run();