diff --git a/public/favicon.png b/public/favicon.png
index a789abc..25233a5 100644
Binary files a/public/favicon.png and b/public/favicon.png differ
diff --git a/src/assets/BatDie.png b/src/assets/BatDie.png
new file mode 100644
index 0000000..bd0824f
Binary files /dev/null and b/src/assets/BatDie.png differ
diff --git a/src/assets/BatFly.png b/src/assets/BatFly.png
new file mode 100644
index 0000000..da978e6
Binary files /dev/null and b/src/assets/BatFly.png differ
diff --git a/src/assets/char_a/spritesheet.png b/src/assets/char_a/spritesheet.png
new file mode 100644
index 0000000..92eb4df
Binary files /dev/null and b/src/assets/char_a/spritesheet.png differ
diff --git a/src/assets/char_b/spritesheet.png b/src/assets/char_b/spritesheet.png
new file mode 100644
index 0000000..9bb8bd8
Binary files /dev/null and b/src/assets/char_b/spritesheet.png differ
diff --git a/src/assets/char_c/spritesheet.png b/src/assets/char_c/spritesheet.png
new file mode 100644
index 0000000..6958005
Binary files /dev/null and b/src/assets/char_c/spritesheet.png differ
diff --git a/src/assets/char_d/spritesheet.png b/src/assets/char_d/spritesheet.png
new file mode 100644
index 0000000..b3983c4
Binary files /dev/null and b/src/assets/char_d/spritesheet.png differ
diff --git a/src/assets/logo.png b/src/assets/logo.png
deleted file mode 100644
index a37a23a..0000000
Binary files a/src/assets/logo.png and /dev/null differ
diff --git a/src/assets/map.json b/src/assets/map.json
new file mode 100644
index 0000000..e3f94a9
--- /dev/null
+++ b/src/assets/map.json
@@ -0,0 +1,1047 @@
+{
+ "height": 17,
+ "infinite": false,
+ "layers": [
+ {
+ "data": "LQAAADUAAAAtAAAALQAAADQAAAA0AAAALQAAAC0AAAA0AAAANAAAADQAAAAtAAAANAAAADUAAAAtAAAANQAAADQAAAA1AAAALQAAADUAAAA0AAAALQAAAC0AAAA1AAAANAAAADUAAAA1AAAANQAAAC0AAAA1AAAANQAAADUAAAA1AAAANQAAADQAAAA0AAAALQAAAC0AAAA0AAAANQAAADUAAAAtAAAANQAAADUAAAA1AAAALQAAADQAAAA0AAAANQAAADUAAAA1AAAANAAAAC0AAAA0AAAANAAAAC0AAAAtAAAANAAAADQAAAA0AAAANAAAADQAAAAtAAAANAAAAC0AAAA0AAAALQAAADQAAAAtAAAALQAAAC0AAAA0AAAANAAAADQAAAA1AAAANAAAAC0AAAA0AAAANAAAADUAAAA1AAAANQAAADQAAAA0AAAANAAAADQAAAA0AAAANQAAADUAAAAtAAAALQAAAC0AAAA1AAAANAAAADUAAAA0AAAALQAAADQAAAA0AAAANQAAADUAAAA1AAAANAAAAC0AAAA0AAAANAAAADQAAAA0AAAANAAAADQAAAA0AAAANQAAAC0AAAA1AAAALQAAADQAAAAtAAAANQAAADUAAAAtAAAALQAAADQAAAA0AAAANQAAADQAAAA0AAAALQAAADQAAAA1AAAANQAAAC0AAAAtAAAANQAAADQAAAA1AAAALQAAADUAAAA0AAAANQAAADQAAAAtAAAANQAAADQAAAA0AAAANAAAAC0AAAA0AAAANQAAAC0AAAA1AAAANAAAAC0AAAAtAAAALQAAAC0AAAA1AAAANAAAAC0AAAA0AAAANQAAAC0AAAA0AAAALQAAADQAAAA1AAAANQAAADQAAAA0AAAALQAAAC0AAAAtAAAANQAAAC0AAAA0AAAALQAAADQAAAA1AAAANAAAADQAAAA0AAAANQAAADUAAAA1AAAANAAAADUAAAA0AAAANQAAADUAAAAtAAAALQAAADUAAAAtAAAANAAAADUAAAA1AAAANAAAADQAAAA1AAAANQAAADUAAAA1AAAANQAAADQAAAA0AAAALQAAADQAAAAtAAAANQAAAC0AAAA1AAAALQAAAC0AAAA0AAAALQAAADQAAAA0AAAALQAAADQAAAA0AAAANQAAADQAAAAtAAAALQAAADQAAAA0AAAANAAAAC0AAAA1AAAANQAAAC0AAAAtAAAANQAAAC0AAAA1AAAALQAAADQAAAA0AAAALQAAADQAAAAtAAAALQAAADQAAAA1AAAANQAAADQAAAA0AAAALQAAADUAAAA0AAAANAAAADQAAAA1AAAALQAAAC0AAAA0AAAALQAAADUAAAA1AAAANAAAADQAAAA0AAAANAAAAC0AAAA0AAAANQAAAC0AAAA1AAAANQAAAC0AAAA1AAAANAAAAC0AAAA1AAAALQAAAC0AAAA1AAAANAAAADQAAAA0AAAANQAAAC0AAAAtAAAALQAAAC0AAAAtAAAALQAAAC0AAAA1AAAALQAAADUAAAA0AAAALQAAADUAAAAtAAAANAAAAC0AAAAtAAAANQAAAC0AAAA0AAAANAAAADQAAAA1AAAANQAAAC0AAAA1AAAANQAAAC0AAAA1AAAANAAAADUAAAA1AAAANQAAADQAAAAtAAAANQAAADUAAAA1AAAANAAAADQAAAA1AAAANAAAAC0AAAAtAAAANAAAAC0AAAAtAAAALQAAADQAAAAtAAAANAAAADQAAAA0AAAALQAAAC0AAAA0AAAANQAAADUAAAA0AAAANAAAADUAAAAtAAAALQAAADUAAAA0AAAANQAAADUAAAA0AAAANAAAAC0AAAA0AAAANAAAADQAAAAtAAAANQAAAC0AAAAtAAAANAAAADUAAAA0AAAANQAAAC0AAAA1AAAANAAAADUAAAA1AAAALQAAADQAAAA0AAAANQAAADQAAAA0AAAANAAAAC0AAAAtAAAANQAAADUAAAA1AAAALQAAADUAAAA0AAAANAAAADUAAAAtAAAALQAAAC0AAAA0AAAANAAAADQAAAAtAAAANAAAADUAAAAtAAAANQAAADUAAAA0AAAALQAAAC0AAAA0AAAALQAAADUAAAA0AAAANQAAADUAAAA0AAAANAAAADQAAAA1AAAANQAAAC0AAAA0AAAANAAAADQAAAA1AAAALQAAADQAAAA1AAAANAAAADQAAAA0AAAANQAAADQAAAA1AAAANQAAADQAAAAtAAAALQAAADUAAAAtAAAANQAAADQAAAA1AAAANQAAAC0AAAA0AAAANAAAADUAAAA0AAAALQAAAC0AAAA0AAAANQAAAC0AAAA1AAAALQAAAC0AAAAtAAAANQAAAC0AAAA1AAAANQAAADQAAAAtAAAANAAAADUAAAA1AAAALQAAADUAAAAtAAAANQAAADQAAAA1AAAANAAAAC0AAAAtAAAANQAAADUAAAAtAAAALQAAADQAAAA1AAAALQAAAC0AAAA1AAAANAAAADQAAAA0AAAANQAAAC0AAAAtAAAANQAAADUAAAA0AAAANQAAADUAAAA1AAAALQAAAC0AAAA0AAAANQAAADUAAAAtAAAANQAAADUAAAA0AAAALQAAADUAAAA0AAAANQAAADUAAAA0AAAANQAAADQAAAAtAAAANAAAAC0AAAA1AAAALQAAADUAAAAtAAAANQAAAC0AAAA1AAAALQAAADUAAAA1AAAANQAAADUAAAA0AAAALQAAADUAAAA1AAAANQAAADQAAAA1AAAALQAAADUAAAA0AAAANQAAADUAAAA0AAAANAAAADUAAAA0AAAANQAAADUAAAA1AAAANAAAADUAAAAtAAAANAAAAC0AAAA1AAAANAAAADQAAAAtAAAALQAAAC0AAAA1AAAALQAAAC0AAAAtAAAANQAAADUAAAA0AAAANAAAADQAAAA1AAAANAAAADUAAAA1AAAANQAAADQAAAA1AAAALQAAADUAAAA1AAAANQAAADQAAAAtAAAANAAAAC0AAAA0AAAALQAAADQAAAAtAAAALQAAADUAAAA0AAAANAAAAC0AAAA0AAAALQAAADUAAAA0AAAALQAAAC0AAAA0AAAANAAAAC0AAAA0AAAALQAAADQAAAA0AAAANAAAAC0AAAA0AAAALQAAADUAAAA0AAAALQAAAC0AAAA1AAAANQAAAC0AAAAtAAAANAAAAC0AAAAtAAAALQAAADQAAAA1AAAALQAAADUAAAA1AAAALQAAADUAAAAtAAAALQAAADQAAAAtAAAALQAAADQAAAA0AAAANAAAADQAAAAtAAAANQAAADUAAAA1AAAALQAAAC0AAAAtAAAALQAAADQAAAA0AAAANAAAADUAAAAtAAAALQAAADQAAAAtAAAALQAAAC0AAAA1AAAANAAAADQAAAAtAAAANQAAADQAAAA1AAAANQAAADUAAAAtAAAALQAAAC0AAAAtAAAANQAAADQAAAAtAAAANAAAADUAAAA1AAAANQAAADQAAAAtAAAANAAAADUAAAAtAAAANQAAADQAAAAtAAAALQAAAC0AAAAtAAAANAAAADUAAAA1AAAALQAAAC0AAAA1AAAANQAAADQAAAA1AAAANQAAADQAAAA0AAAANAAAADQAAAA0AAAANAAAADQAAAAtAAAALQAAADUAAAA1AAAANQAAAC0AAAA1AAAANQAAADQAAAA1AAAALQAAADQAAAA1AAAANAAAADQAAAAtAAAANAAAAC0AAAA0AAAALQAAAC0AAAA1AAAANAAAADUAAAAtAAAANQAAADUAAAA1AAAANQAAADUAAAA0AAAANQAAADUAAAA1AAAANAAAADQAAAA1AAAALQAAAC0AAAA0AAAALQAAADUAAAA0AAAANQAAAC0AAAA0AAAALQAAAC0AAAA0AAAANQAAADQAAAA1AAAALQAAAC0AAAAtAAAALQAAADQAAAAtAAAANAAAAC0AAAAtAAAANAAAADQAAAA1AAAALQAAADQAAAAtAAAANAAAADQAAAA0AAAANAAAADQAAAA1AAAALQAAADUAAAAtAAAANAAAADQAAAAtAAAANQAAAC0AAAA0AAAANAAAADUAAAA0AAAANQAAAC0AAAAtAAAANAAAADQAAAAtAAAANQAAADUAAAA1AAAALQAAADQAAAAtAAAANQAAADUAAAA1AAAANAAAADQAAAA0AAAALQAAAC0AAAA1AAAANAAAADUAAAA1AAAANQAAADQAAAAtAAAANAAAADQAAAAtAAAALQAAADQAAAAtAAAANQAAADQAAAAtAAAALQAAAC0AAAAtAAAA",
+ "encoding": "base64",
+ "height": 17,
+ "id": 16,
+ "name": "Back",
+ "opacity": 1,
+ "type": "tilelayer",
+ "visible": true,
+ "width": 48,
+ "x": 0,
+ "y": 0
+ },
+ {
+ "data": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABkAAAAaAAAAGgAAABsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACEAAAAiAAAAIgAAAB0AAAAbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACEAAAAiAAAAIgAAACIAAAAdAAAAGwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACEAAAAiAAAAIgAAACIAAAAiAAAAIwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACkAAAAkAAAAIgAAACIAAAAiAAAAIwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAApAAAAJAAAACIAAAAiAAAAIwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIQAAACIAAAAiAAAAIwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIQAAACIAAAAiAAAAIwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIQAAACIAAAAiAAAAIwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIQAAACIAAAAiAAAAIwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKQAAACoAAAAqAAAAKwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
+ "encoding": "base64",
+ "height": 17,
+ "id": 17,
+ "name": "Back2",
+ "opacity": 1,
+ "type": "tilelayer",
+ "visible": true,
+ "width": 48,
+ "x": 0,
+ "y": 0
+ },
+ {
+ "data": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAQAAAACAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQAAAA0AAAAOAAAACwAAAAAAAAAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEQAAABIAAAASAAAAEwAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAAAAAAAAAAAAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAHwAAAB8AAAAfAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAMAAAABAAAAAQAAAAMAAAAAwAAAAAAAAAAAAAAAQAAAAwAAAAEAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4AAAAOAAAABgAAAAYAAAANAAAACwAAAAAAAAAAAAAAEQAAABIAAAASAAAAEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
+ "encoding": "base64",
+ "height": 17,
+ "id": 18,
+ "name": "Main",
+ "opacity": 1,
+ "type": "tilelayer",
+ "visible": true,
+ "width": 48,
+ "x": 0,
+ "y": 0
+ },
+ {
+ "draworder": "topdown",
+ "id": 5,
+ "name": "Objects",
+ "objects": [
+ {
+ "height": 0,
+ "id": 1,
+ "name": "player",
+ "point": true,
+ "rotation": 0,
+ "type": "",
+ "visible": true,
+ "width": 0,
+ "x": 83.25,
+ "y": 228.5
+ },
+ {
+ "height": 0,
+ "id": 3,
+ "name": "bat",
+ "point": true,
+ "properties": [
+ {
+ "name": "vel",
+ "type": "int",
+ "value": -90
+ }
+ ],
+ "rotation": 0,
+ "type": "90",
+ "visible": true,
+ "width": 0,
+ "x": 160.666666666667,
+ "y": 69.3333333333333
+ },
+ {
+ "height": 0,
+ "id": 5,
+ "name": "bat",
+ "point": true,
+ "properties": [
+ {
+ "name": "vel",
+ "type": "int",
+ "value": 50
+ }
+ ],
+ "rotation": 0,
+ "type": "-80",
+ "visible": true,
+ "width": 0,
+ "x": 396,
+ "y": 91.3333333333333
+ },
+ {
+ "height": 0,
+ "id": 6,
+ "name": "bat",
+ "point": true,
+ "properties": [
+ {
+ "name": "vel",
+ "type": "int",
+ "value": 90
+ }
+ ],
+ "rotation": 0,
+ "type": "-50",
+ "visible": true,
+ "width": 0,
+ "x": 587.333333333333,
+ "y": 46.6666666666667
+ }
+ ],
+ "opacity": 1,
+ "type": "objectgroup",
+ "visible": true,
+ "x": 0,
+ "y": 0
+ },
+ {
+ "data": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
+ "encoding": "base64",
+ "height": 17,
+ "id": 19,
+ "name": "Front",
+ "opacity": 1,
+ "type": "tilelayer",
+ "visible": true,
+ "width": 48,
+ "x": 0,
+ "y": 0
+ }
+ ],
+ "nextlayerid": 20,
+ "nextobjectid": 7,
+ "orientation": "orthogonal",
+ "renderorder": "right-down",
+ "tiledversion": "1.2.5",
+ "tileheight": 16,
+ "tilesets": [
+ {
+ "columns": 8,
+ "firstgid": 1,
+ "image": "tileset.png",
+ "imageheight": 198,
+ "imagewidth": 144,
+ "margin": 1,
+ "name": "tileset",
+ "spacing": 2,
+ "tilecount": 88,
+ "tileheight": 16,
+ "tiles": [
+ {
+ "id": 0,
+ "properties": [
+ {
+ "name": "collides",
+ "type": "bool",
+ "value": true
+ }
+ ]
+ },
+ {
+ "id": 1,
+ "properties": [
+ {
+ "name": "collides",
+ "type": "bool",
+ "value": true
+ }
+ ]
+ },
+ {
+ "id": 2,
+ "properties": [
+ {
+ "name": "collides",
+ "type": "bool",
+ "value": true
+ }
+ ]
+ },
+ {
+ "id": 3,
+ "properties": [
+ {
+ "name": "collides",
+ "type": "bool",
+ "value": true
+ }
+ ]
+ },
+ {
+ "id": 4,
+ "properties": [
+ {
+ "name": "collides",
+ "type": "bool",
+ "value": false
+ }
+ ]
+ },
+ {
+ "id": 5,
+ "properties": [
+ {
+ "name": "collides",
+ "type": "bool",
+ "value": false
+ }
+ ]
+ },
+ {
+ "id": 6,
+ "properties": [
+ {
+ "name": "collides",
+ "type": "bool",
+ "value": false
+ }
+ ]
+ },
+ {
+ "id": 7,
+ "properties": [
+ {
+ "name": "collides",
+ "type": "bool",
+ "value": false
+ }
+ ]
+ },
+ {
+ "id": 8,
+ "properties": [
+ {
+ "name": "collides",
+ "type": "bool",
+ "value": true
+ }
+ ]
+ },
+ {
+ "id": 9,
+ "properties": [
+ {
+ "name": "collides",
+ "type": "bool",
+ "value": true
+ }
+ ]
+ },
+ {
+ "id": 10,
+ "properties": [
+ {
+ "name": "collides",
+ "type": "bool",
+ "value": true
+ }
+ ]
+ },
+ {
+ "id": 11,
+ "properties": [
+ {
+ "name": "collides",
+ "type": "bool",
+ "value": true
+ }
+ ]
+ },
+ {
+ "id": 12,
+ "properties": [
+ {
+ "name": "collides",
+ "type": "bool",
+ "value": false
+ }
+ ]
+ },
+ {
+ "id": 13,
+ "properties": [
+ {
+ "name": "collides",
+ "type": "bool",
+ "value": false
+ }
+ ]
+ },
+ {
+ "id": 14,
+ "properties": [
+ {
+ "name": "collides",
+ "type": "bool",
+ "value": false
+ }
+ ]
+ },
+ {
+ "id": 15,
+ "properties": [
+ {
+ "name": "collides",
+ "type": "bool",
+ "value": false
+ }
+ ]
+ },
+ {
+ "id": 16,
+ "properties": [
+ {
+ "name": "collides",
+ "type": "bool",
+ "value": true
+ }
+ ]
+ },
+ {
+ "id": 17,
+ "properties": [
+ {
+ "name": "collides",
+ "type": "bool",
+ "value": true
+ }
+ ]
+ },
+ {
+ "id": 18,
+ "properties": [
+ {
+ "name": "collides",
+ "type": "bool",
+ "value": true
+ }
+ ]
+ },
+ {
+ "id": 19,
+ "properties": [
+ {
+ "name": "collides",
+ "type": "bool",
+ "value": false
+ }
+ ]
+ },
+ {
+ "id": 20,
+ "properties": [
+ {
+ "name": "collides",
+ "type": "bool",
+ "value": false
+ }
+ ]
+ },
+ {
+ "id": 21,
+ "properties": [
+ {
+ "name": "collides",
+ "type": "bool",
+ "value": false
+ }
+ ]
+ },
+ {
+ "id": 22,
+ "properties": [
+ {
+ "name": "collides",
+ "type": "bool",
+ "value": false
+ }
+ ]
+ },
+ {
+ "id": 23,
+ "properties": [
+ {
+ "name": "collides",
+ "type": "bool",
+ "value": false
+ }
+ ]
+ },
+ {
+ "id": 24,
+ "properties": [
+ {
+ "name": "collides",
+ "type": "bool",
+ "value": false
+ }
+ ]
+ },
+ {
+ "id": 25,
+ "properties": [
+ {
+ "name": "collides",
+ "type": "bool",
+ "value": false
+ }
+ ]
+ },
+ {
+ "id": 26,
+ "properties": [
+ {
+ "name": "collides",
+ "type": "bool",
+ "value": false
+ }
+ ]
+ },
+ {
+ "id": 27,
+ "properties": [
+ {
+ "name": "collides",
+ "type": "bool",
+ "value": false
+ }
+ ]
+ },
+ {
+ "id": 28,
+ "properties": [
+ {
+ "name": "collides",
+ "type": "bool",
+ "value": false
+ }
+ ]
+ },
+ {
+ "id": 29,
+ "properties": [
+ {
+ "name": "collides",
+ "type": "bool",
+ "value": true
+ }
+ ]
+ },
+ {
+ "id": 30,
+ "properties": [
+ {
+ "name": "collides",
+ "type": "bool",
+ "value": true
+ }
+ ]
+ },
+ {
+ "id": 31,
+ "properties": [
+ {
+ "name": "collides",
+ "type": "bool",
+ "value": true
+ }
+ ]
+ },
+ {
+ "id": 32,
+ "properties": [
+ {
+ "name": "collides",
+ "type": "bool",
+ "value": false
+ }
+ ]
+ },
+ {
+ "id": 33,
+ "properties": [
+ {
+ "name": "collides",
+ "type": "bool",
+ "value": false
+ }
+ ]
+ },
+ {
+ "id": 34,
+ "properties": [
+ {
+ "name": "collides",
+ "type": "bool",
+ "value": false
+ }
+ ]
+ },
+ {
+ "id": 35,
+ "properties": [
+ {
+ "name": "collides",
+ "type": "bool",
+ "value": false
+ }
+ ]
+ },
+ {
+ "id": 36,
+ "properties": [
+ {
+ "name": "collides",
+ "type": "bool",
+ "value": false
+ }
+ ]
+ },
+ {
+ "id": 37,
+ "properties": [
+ {
+ "name": "collides",
+ "type": "bool",
+ "value": false
+ }
+ ]
+ },
+ {
+ "id": 38,
+ "properties": [
+ {
+ "name": "collides",
+ "type": "bool",
+ "value": false
+ }
+ ]
+ },
+ {
+ "id": 39,
+ "properties": [
+ {
+ "name": "collides",
+ "type": "bool",
+ "value": true
+ }
+ ]
+ },
+ {
+ "id": 40,
+ "properties": [
+ {
+ "name": "collides",
+ "type": "bool",
+ "value": false
+ }
+ ]
+ },
+ {
+ "id": 41,
+ "properties": [
+ {
+ "name": "collides",
+ "type": "bool",
+ "value": false
+ }
+ ]
+ },
+ {
+ "id": 42,
+ "properties": [
+ {
+ "name": "collides",
+ "type": "bool",
+ "value": false
+ }
+ ]
+ },
+ {
+ "id": 43,
+ "properties": [
+ {
+ "name": "collides",
+ "type": "bool",
+ "value": false
+ }
+ ]
+ },
+ {
+ "id": 44,
+ "properties": [
+ {
+ "name": "collides",
+ "type": "bool",
+ "value": false
+ }
+ ]
+ },
+ {
+ "id": 45,
+ "properties": [
+ {
+ "name": "collides",
+ "type": "bool",
+ "value": false
+ }
+ ]
+ },
+ {
+ "id": 46,
+ "properties": [
+ {
+ "name": "collides",
+ "type": "bool",
+ "value": false
+ }
+ ]
+ },
+ {
+ "id": 47,
+ "properties": [
+ {
+ "name": "collides",
+ "type": "bool",
+ "value": false
+ }
+ ]
+ },
+ {
+ "id": 48,
+ "properties": [
+ {
+ "name": "collides",
+ "type": "bool",
+ "value": true
+ }
+ ]
+ },
+ {
+ "id": 49,
+ "properties": [
+ {
+ "name": "collides",
+ "type": "bool",
+ "value": true
+ }
+ ]
+ },
+ {
+ "id": 50,
+ "properties": [
+ {
+ "name": "collides",
+ "type": "bool",
+ "value": false
+ }
+ ]
+ },
+ {
+ "id": 51,
+ "properties": [
+ {
+ "name": "collides",
+ "type": "bool",
+ "value": false
+ }
+ ]
+ },
+ {
+ "id": 52,
+ "properties": [
+ {
+ "name": "collides",
+ "type": "bool",
+ "value": false
+ }
+ ]
+ },
+ {
+ "id": 53,
+ "properties": [
+ {
+ "name": "collides",
+ "type": "bool",
+ "value": false
+ }
+ ]
+ },
+ {
+ "id": 54,
+ "properties": [
+ {
+ "name": "collides",
+ "type": "bool",
+ "value": false
+ }
+ ]
+ },
+ {
+ "id": 55,
+ "properties": [
+ {
+ "name": "collides",
+ "type": "bool",
+ "value": false
+ }
+ ]
+ },
+ {
+ "id": 56,
+ "properties": [
+ {
+ "name": "collides",
+ "type": "bool",
+ "value": true
+ }
+ ]
+ },
+ {
+ "id": 57,
+ "properties": [
+ {
+ "name": "collides",
+ "type": "bool",
+ "value": true
+ }
+ ]
+ },
+ {
+ "id": 58,
+ "properties": [
+ {
+ "name": "collides",
+ "type": "bool",
+ "value": false
+ }
+ ]
+ },
+ {
+ "id": 59,
+ "properties": [
+ {
+ "name": "collides",
+ "type": "bool",
+ "value": true
+ }
+ ]
+ },
+ {
+ "id": 60,
+ "properties": [
+ {
+ "name": "collides",
+ "type": "bool",
+ "value": false
+ }
+ ]
+ },
+ {
+ "id": 61,
+ "properties": [
+ {
+ "name": "collides",
+ "type": "bool",
+ "value": false
+ }
+ ]
+ },
+ {
+ "id": 62,
+ "properties": [
+ {
+ "name": "collides",
+ "type": "bool",
+ "value": false
+ }
+ ]
+ },
+ {
+ "id": 63,
+ "properties": [
+ {
+ "name": "collides",
+ "type": "bool",
+ "value": false
+ }
+ ]
+ },
+ {
+ "id": 64,
+ "properties": [
+ {
+ "name": "collides",
+ "type": "bool",
+ "value": true
+ }
+ ]
+ },
+ {
+ "id": 65,
+ "properties": [
+ {
+ "name": "collides",
+ "type": "bool",
+ "value": true
+ }
+ ]
+ },
+ {
+ "id": 66,
+ "properties": [
+ {
+ "name": "collides",
+ "type": "bool",
+ "value": true
+ }
+ ]
+ },
+ {
+ "id": 67,
+ "properties": [
+ {
+ "name": "collides",
+ "type": "bool",
+ "value": false
+ }
+ ]
+ },
+ {
+ "id": 68,
+ "properties": [
+ {
+ "name": "collides",
+ "type": "bool",
+ "value": false
+ }
+ ]
+ },
+ {
+ "id": 69,
+ "properties": [
+ {
+ "name": "collides",
+ "type": "bool",
+ "value": false
+ }
+ ]
+ },
+ {
+ "id": 70,
+ "properties": [
+ {
+ "name": "collides",
+ "type": "bool",
+ "value": false
+ }
+ ]
+ },
+ {
+ "id": 71,
+ "properties": [
+ {
+ "name": "collides",
+ "type": "bool",
+ "value": false
+ }
+ ]
+ },
+ {
+ "id": 72,
+ "properties": [
+ {
+ "name": "collides",
+ "type": "bool",
+ "value": false
+ }
+ ]
+ },
+ {
+ "id": 73,
+ "properties": [
+ {
+ "name": "collides",
+ "type": "bool",
+ "value": false
+ }
+ ]
+ },
+ {
+ "id": 74,
+ "properties": [
+ {
+ "name": "collides",
+ "type": "bool",
+ "value": true
+ }
+ ]
+ },
+ {
+ "id": 75,
+ "properties": [
+ {
+ "name": "collides",
+ "type": "bool",
+ "value": true
+ }
+ ]
+ },
+ {
+ "id": 76,
+ "properties": [
+ {
+ "name": "collides",
+ "type": "bool",
+ "value": false
+ }
+ ]
+ },
+ {
+ "id": 77,
+ "properties": [
+ {
+ "name": "collides",
+ "type": "bool",
+ "value": false
+ }
+ ]
+ },
+ {
+ "id": 78,
+ "properties": [
+ {
+ "name": "collides",
+ "type": "bool",
+ "value": false
+ }
+ ]
+ },
+ {
+ "id": 79,
+ "properties": [
+ {
+ "name": "collides",
+ "type": "bool",
+ "value": false
+ }
+ ]
+ },
+ {
+ "id": 80,
+ "properties": [
+ {
+ "name": "collides",
+ "type": "bool",
+ "value": false
+ }
+ ]
+ },
+ {
+ "id": 81,
+ "properties": [
+ {
+ "name": "collides",
+ "type": "bool",
+ "value": false
+ }
+ ]
+ },
+ {
+ "id": 82,
+ "properties": [
+ {
+ "name": "collides",
+ "type": "bool",
+ "value": false
+ }
+ ]
+ },
+ {
+ "id": 83,
+ "properties": [
+ {
+ "name": "collides",
+ "type": "bool",
+ "value": false
+ }
+ ]
+ },
+ {
+ "id": 84,
+ "properties": [
+ {
+ "name": "collides",
+ "type": "bool",
+ "value": false
+ }
+ ]
+ },
+ {
+ "id": 85,
+ "properties": [
+ {
+ "name": "collides",
+ "type": "bool",
+ "value": false
+ }
+ ]
+ },
+ {
+ "id": 86,
+ "properties": [
+ {
+ "name": "collides",
+ "type": "bool",
+ "value": false
+ }
+ ]
+ },
+ {
+ "id": 87,
+ "properties": [
+ {
+ "name": "collides",
+ "type": "bool",
+ "value": false
+ }
+ ]
+ }
+ ],
+ "tilewidth": 16,
+ "transparentcolor": "#ff00ff"
+ }
+ ],
+ "tilewidth": 16,
+ "type": "map",
+ "version": 1.2,
+ "width": 48
+}
\ No newline at end of file
diff --git a/src/assets/map.tmx b/src/assets/map.tmx
new file mode 100644
index 0000000..de7005f
--- /dev/null
+++ b/src/assets/map.tmx
@@ -0,0 +1,489 @@
+
+
diff --git a/src/assets/tileset.png b/src/assets/tileset.png
new file mode 100644
index 0000000..e7c476c
Binary files /dev/null and b/src/assets/tileset.png differ
diff --git a/src/entities/Attacks/AttackA.js b/src/entities/Attacks/AttackA.js
new file mode 100644
index 0000000..acd591b
--- /dev/null
+++ b/src/entities/Attacks/AttackA.js
@@ -0,0 +1,24 @@
+/*
+ * Copyright (c) 2020. Pascal Syma
+ * All rights reserved.
+ */
+
+import Hitbox from "./Hitbox";
+
+export default class AttackA extends Hitbox {
+
+ constructor(player) {
+ super(player, 5);
+
+ this.body.setSize(42, 32, true);
+ this.body.setOffset(1, -10);
+ }
+
+ start() {
+ this.setData('active', true);
+ this.player.play('attack_a', true)
+ .once('animationcomplete', () => {
+ this.setData('active', false)
+ });
+ }
+}
\ No newline at end of file
diff --git a/src/entities/Attacks/Hitbox.js b/src/entities/Attacks/Hitbox.js
new file mode 100644
index 0000000..f013045
--- /dev/null
+++ b/src/entities/Attacks/Hitbox.js
@@ -0,0 +1,35 @@
+/*
+ * Copyright (c) 2020. Pascal Syma
+ * All rights reserved.
+ */
+
+import Entity from "../Entity";
+
+export default class Hitbox extends Entity {
+ constructor(player, dmg) {
+ super(player.scene, player.body.x, player.body.y, null);
+ this.setData('dmg', dmg);
+ this.player = player;
+ this.setSize(0, 0);
+ this.setOrigin(0, 0);
+ this.alpha = 0;
+ this.body.setAllowGravity(false);
+
+ this.setData('active', false);
+ this.body.setSize(0, 0);
+ }
+
+ update(...args) {
+ this.setPosition(this.player.body.x, this.player.body.y);
+ }
+
+ start() {
+
+ }
+
+ overlap(obj) {
+ this.setData('active', false);
+ obj.setData('hp', obj.getData('hp') - this.getData('dmg'));
+ obj.hit();
+ }
+}
\ No newline at end of file
diff --git a/src/entities/Enemys/Bat.js b/src/entities/Enemys/Bat.js
new file mode 100644
index 0000000..eb2dae9
--- /dev/null
+++ b/src/entities/Enemys/Bat.js
@@ -0,0 +1,33 @@
+/*
+ * Copyright (c) 2020. Pascal Syma
+ * All rights reserved.
+ */
+
+import FlyingEnemy from "./FlyingEnemy";
+
+export default class Bat extends FlyingEnemy {
+
+ constructor(scene, spawnPoint) {
+ super(scene, spawnPoint, 'batFly');
+ this.setData('hp', 5);
+
+ this.dieAnimation = 'batDie';
+
+ this.body.setCollideWorldBounds(true);
+ this.body.setBounceX(1);
+ this.play('batIdle');
+ }
+
+ fly(velocity) {
+ this.body.velocity.x = velocity;
+ }
+
+ update(...args) {
+ this.setFlipX(this.body.velocity.x > 0);
+ }
+
+ die() {
+ this.body.velocity.x = 0;
+ super.die();
+ }
+}
\ No newline at end of file
diff --git a/src/entities/Enemys/Enemy.js b/src/entities/Enemys/Enemy.js
new file mode 100644
index 0000000..3230b5c
--- /dev/null
+++ b/src/entities/Enemys/Enemy.js
@@ -0,0 +1,13 @@
+/*
+ * Copyright (c) 2020. Pascal Syma
+ * All rights reserved.
+ */
+
+import Entity from "../Entity";
+
+export default class Enemy extends Entity {
+
+ constructor(scene, spawnPoint, texture) {
+ super(scene, spawnPoint.x, spawnPoint.y, texture);
+ }
+}
\ No newline at end of file
diff --git a/src/entities/Enemys/FlyingEnemy.js b/src/entities/Enemys/FlyingEnemy.js
new file mode 100644
index 0000000..34fdddb
--- /dev/null
+++ b/src/entities/Enemys/FlyingEnemy.js
@@ -0,0 +1,15 @@
+/*
+ * Copyright (c) 2020. Pascal Syma
+ * All rights reserved.
+ */
+
+import Enemy from "./Enemy";
+
+export default class FlyingEnemy extends Enemy {
+
+ constructor(scene, spawnPoint, texture) {
+ super(scene, spawnPoint, texture);
+ this.body.setAllowGravity(false);
+ }
+
+}
\ No newline at end of file
diff --git a/src/entities/Entity.js b/src/entities/Entity.js
new file mode 100644
index 0000000..2830e34
--- /dev/null
+++ b/src/entities/Entity.js
@@ -0,0 +1,44 @@
+/*
+ * Copyright (c) 2020. Pascal Syma
+ * All rights reserved.
+ */
+
+export default class Entity extends Phaser.GameObjects.Sprite {
+
+ constructor(scene, x, y, key) {
+ super(scene, x, y, key);
+ this.setData('hp', 1);
+ this.setData('dmg', 0);
+ this.scene = scene;
+ this.scene.add.existing(this);
+ this.scene.physics.world.enableBody(this, 0);
+ this.hitAnimation = null;
+ this.dieAnimation = null;
+ }
+
+ hit() {
+ // play hit animation
+ const shouldDie = this.getData('hp') <= 0;
+ if (this.hitAnimation !== null) {
+ this.play(this.hitAnimation)
+ .once('animationcomplete', () => {
+ if (shouldDie) this.die()
+ });
+ } else {
+ if (shouldDie)
+ this.die();
+ }
+ }
+
+ die() {
+ if (this.dieAnimation !== null) {
+ this.play(this.dieAnimation)
+ .once('animationcomplete', () => this.destroy());
+ } else
+ this.destroy();
+ }
+
+ update(...args) {
+ super.update(...args);
+ }
+}
\ No newline at end of file
diff --git a/src/entities/Player.js b/src/entities/Player.js
new file mode 100644
index 0000000..2e5d952
--- /dev/null
+++ b/src/entities/Player.js
@@ -0,0 +1,90 @@
+/*
+ * Copyright (c) 2020. Pascal Syma
+ * All rights reserved.
+ */
+
+import Entity from "./Entity";
+import AttackA from "./Attacks/AttackA";
+
+export default class Player extends Entity {
+
+ constructor(scene, spawnPoint, texture) {
+ super(scene, spawnPoint.x, spawnPoint.y, texture);
+ this.setData("speed", 100);
+ this.setData('hp', 20);
+ this.setOrigin(0.5, 1).setScale(32 / 48);
+
+ this.body.setSize(48, 48, false);
+ this.body.setOffset(4, 16);
+
+ this.body.setCollideWorldBounds(true);
+ this.play('idle');
+
+ this.attackA = new AttackA(this);
+ this.attackHitbox = this.scene.add.group([
+ this.attackA
+ ]);
+ }
+
+ update(...args) {
+ if (this.scene.dieActive()) {
+ this.pause = true;
+ this.play('die', true)
+ .on('animationcomplete', () => {
+ this.setFrame(51);
+ this.scene.scene.pause();
+ })
+ }
+
+ if (this.pause)
+ return;
+
+ this.body.velocity.x = 0;
+
+ // Jumping, Dashing
+ if (this.scene.upActive() && this.body.blocked.down) {
+ this.body.velocity.y = -this.getData('speed') * 1.5;
+ } else if (this.scene.downActive() && !this.body.blocked.down) {
+ this.body.velocity.y = this.getData('speed');
+ }
+
+ // Walking L R
+ if (this.scene.leftActive()) {
+ this.body.velocity.x = -this.getData('speed');
+ if (!this.flipX)
+ this.x -= 16;
+ this.setFlipX(true);
+ this.body.setOffset(32 - 4, 16);
+ } else if (this.scene.rightActive()) {
+ this.body.velocity.x = this.getData('speed');
+ if (this.flipX)
+ this.x += 16;
+ this.setFlipX(false);
+ this.body.setOffset(4, 16);
+ }
+
+ this.setData('speed', 100);
+
+ // animation
+ if (this.anims.getCurrentKey().startsWith('attack_')) {
+ this.setData('speed', 50);
+ } else if (this.scene.keySpace.isDown) {
+ // const nextAttack = [this.attackA].sort(() => 0.5 - Math.random())[0];
+ // nextAttack.start();
+ this.attackA.start();
+ } else if (this.body.blocked.down) {
+ if (this.body.velocity.x !== 0) {
+ this.play('run', true);
+ } else {
+ this.play('idle', true);
+ }
+ } else if (this.anims.getCurrentKey() !== 'jump_start' && this.anims.getCurrentKey() !== 'jump') {
+ // this.play('jump', true)
+ this.play('jump_start', true).on('animationcomplete', () => this.play('jump', true));
+ }
+
+ this.attackHitbox.getChildren().forEach(c => {
+ c.update()
+ });
+ }
+}
\ No newline at end of file
diff --git a/src/index.js b/src/index.js
index f0b5de3..d9fa02d 100644
--- a/src/index.js
+++ b/src/index.js
@@ -5,23 +5,27 @@
import Phaser from "phaser";
import Menu from "./scenes/Menu";
+import Preload from "./scenes/Preload";
+import Game from "./scenes/Game";
const ratio = 16 / 9; // any ratio you want, 16/9 landscape or 9/16 portrait
-const DEFAULT_HEIGHT = 1080; // any height you want
+const DEFAULT_HEIGHT = 1080 / 4; // any height you want
const DEFAULT_WIDTH = ratio * DEFAULT_HEIGHT;
const config = {
- type: Phaser.AUTO,
- scale: {
- mode: Phaser.Scale.FIT,
- autoCenter: Phaser.Scale.CENTER_BOTH,
- width: DEFAULT_WIDTH,
- height: DEFAULT_HEIGHT
- },
- parent: "phaser-example",
- scene: [Menu],
- // pixelArt: true,
- // roundPixels: true
+ type: Phaser.AUTO,
+ scale: {
+ mode: Phaser.Scale.FIT,
+ autoCenter: Phaser.Scale.CENTER_BOTH,
+ width: DEFAULT_WIDTH,
+ height: DEFAULT_HEIGHT
+ },
+ parent: "phaser-example",
+ scene: [Preload, Menu, Game],
+ pixelArt: true,
+ antialias: false,
+ // pixelArt: true,
+ // roundPixels: true
};
const game = new Phaser.Game(config);
diff --git a/src/scenes/Game.js b/src/scenes/Game.js
new file mode 100644
index 0000000..1e7384b
--- /dev/null
+++ b/src/scenes/Game.js
@@ -0,0 +1,229 @@
+/*
+ * Copyright (c) 2020. Pascal Syma
+ * All rights reserved.
+ */
+
+import Player from "../entities/Player";
+import Bat from "../entities/Enemys/Bat";
+
+export default class Game extends Phaser.Scene {
+
+ constructor() {
+ super({
+ key: "Game",
+ pixelArt: true,
+ physics: {
+ default: 'arcade',
+ arcade: {
+ gravity: {y: 300},
+ // debug: true
+ }
+ }
+ });
+ }
+
+ static setTileCollision(mapLayer, idxOrArray, dirs) {
+
+ let mFunc; // tile index matching function
+ if (idxOrArray.length) {
+ // if idxOrArray is an array, use a function with a loop
+ mFunc = function (inp) {
+ for (let i = 0; i < idxOrArray.length; i++) {
+ if (idxOrArray[i] === inp - 1) {
+ return true;
+ }
+ }
+ return false;
+ };
+ } else {
+ // if idxOrArray is a single number, use a simple function
+ mFunc = function (inp) {
+ return inp - 1 === idxOrArray;
+ };
+ }
+
+ // get the 2-dimensional tiles array for this layer
+ // const d = mapLayer.map.layers[mapLayer.index].data;
+ const d = mapLayer.layer.data;
+
+ for (let i = 0; i < d.length; i++) {
+ for (let j = 0; j < d[i].length; j++) {
+ const t = d[i][j];
+ if (mFunc(t.index)) {
+
+ t.collideUp = dirs.top;
+ t.collideDown = dirs.bottom;
+ t.collideLeft = dirs.left;
+ t.collideRight = dirs.right;
+
+ t.faceTop = dirs.top;
+ t.faceBottom = dirs.bottom;
+ t.faceLeft = dirs.left;
+ t.faceRight = dirs.right;
+
+ }
+ }
+ }
+ }
+
+ create() {
+
+ this.anims.create({
+ key: 'idle',
+ frames: this.anims.generateFrameNumbers('char', {start: 126, end: 131}),
+ frameRate: 10,
+ repeat: -1
+ });
+
+ this.anims.create({
+ key: 'run',
+ frames: this.anims.generateFrameNumbers('char', {start: 154, end: 161}),
+ frameRate: 10,
+ repeat: -1
+ });
+
+ this.anims.create({
+ key: 'jump_start',
+ frames: this.anims.generateFrameNumbers('char', {start: 140, end: 143}),
+ frameRate: 10
+ });
+
+ this.anims.create({
+ key: 'jump',
+ frames: this.anims.generateFrameNumbers('char', {start: 144, end: 145}),
+ frameRate: 10,
+ repeat: -1
+ });
+
+ this.anims.create({
+ key: 'attack_a',
+ frames: this.anims.generateFrameNumbers('char', {start: 0, end: 13}),
+ frameRate: 15
+ });
+
+ this.anims.create({
+ key: 'attack_b',
+ frames: this.anims.generateFrameNumbers('char', {start: 14, end: 26}),
+ frameRate: 15
+ });
+
+ this.anims.create({
+ key: 'attack_c',
+ frames: this.anims.generateFrameNumbers('char', {start: 28, end: 41}),
+ frameRate: 15
+ });
+
+ this.anims.create({
+ key: 'die',
+ frames: this.anims.generateFrameNumbers('char', {start: 42, end: 51}),
+ frameRate: 10
+ });
+
+ this.anims.create({
+ key: 'batIdle',
+ frames: this.anims.generateFrameNumbers('batFly', {start: 0, end: 5}),
+ frameRate: 10,
+ repeat: -1
+ });
+
+ this.anims.create({
+ key: 'batDie',
+ frames: this.anims.generateFrameNumbers('batDie', {start: 0, end: 4}),
+ frameRate: 15
+ });
+
+
+ const map = this.make.tilemap({key: "map"});
+ const tileset = map.addTilesetImage("tileset", "tiles", 16, 16, 1, 2);
+
+ this.backLayer = map.createStaticLayer("Back", tileset, 0, 0);
+ this.backLayer2 = map.createStaticLayer("Back2", tileset, 0, 0);
+
+ this.worldLayer = map.createDynamicLayer("Main", tileset, 0, 0);
+
+
+ const spawnPoint = map.findObject("Objects", obj => obj.name === "player");
+
+ this.enemys = this.add.group();
+ this.player = new Player(this, spawnPoint, 'char');
+
+ const batSpawns = map.objects[0].objects.filter(obj => obj.name === "bat");
+
+
+ batSpawns.forEach(s => {
+ let bat = new Bat(this, s);
+ bat.fly(s.type === "" ? 90 : parseInt(s.type));
+ this.enemys.add(bat)
+ });
+
+
+ this.worldLayer.setCollisionByProperty({collides: true});
+ Game.setTileCollision(this.worldLayer, [29, 30, 31, 39], {
+ top: true,
+ bottom: false,
+ right: false,
+ left: false
+ })
+
+ this.physics.world.bounds.width = this.backLayer.width;
+ this.physics.world.bounds.height = this.backLayer.height;
+
+ this.cameras.main.setBounds(0, 0, map.widthInPixels, map.heightInPixels);
+
+
+ this.cameras.main.setBackgroundColor('#ccccff');
+
+
+ this.cameras.main.startFollow(this.player);
+
+ this.physics.add.collider(this.player, this.worldLayer);
+ this.physics.add.overlap(this.player.attackHitbox, this.enemys, (h, b) => {
+ if (h.getData('active') && h.overlap !== undefined) {
+ h.overlap(b);
+ }
+ })
+
+ this.keyW = this.input.keyboard.addKey(Phaser.Input.Keyboard.KeyCodes.W);
+ this.keyS = this.input.keyboard.addKey(Phaser.Input.Keyboard.KeyCodes.S);
+ this.keyA = this.input.keyboard.addKey(Phaser.Input.Keyboard.KeyCodes.A);
+ this.keyD = this.input.keyboard.addKey(Phaser.Input.Keyboard.KeyCodes.D);
+ this.keySpace = this.input.keyboard.addKey(Phaser.Input.Keyboard.KeyCodes.SPACE);
+ this.keyUp = this.input.keyboard.addKey(Phaser.Input.Keyboard.KeyCodes.UP);
+ this.keyLeft = this.input.keyboard.addKey(Phaser.Input.Keyboard.KeyCodes.LEFT);
+ this.keyRight = this.input.keyboard.addKey(Phaser.Input.Keyboard.KeyCodes.RIGHT);
+ this.keyDown = this.input.keyboard.addKey(Phaser.Input.Keyboard.KeyCodes.DOWN);
+ this.keyDie = this.input.keyboard.addKey(Phaser.Input.Keyboard.KeyCodes.C);
+ }
+
+ update(time, delta) {
+ this.enemys.getChildren().forEach(c => {
+ c.update()
+ });
+ this.player.update(time, delta);
+
+ }
+
+ dieActive() {
+ return this.keyDie.isDown;
+ }
+
+ rightActive() {
+ return this.keyRight.isDown || this.keyD.isDown/* || (this.game.input.activePointer.isDown &&
+ this.game.input.activePointer.x > 2*this.game.config.width/3)*/;
+ }
+
+ leftActive() {
+ return this.keyLeft.isDown || this.keyA.isDown/* || (this.game.input.activePointer.isDown &&
+ this.game.input.activePointer.x < this.game.config.width/3)*/;
+ }
+
+ downActive() {
+ return this.keyDown.isDown || this.keyS.isDown/* || (this.game.input.activePointer.isDown &&
+ this.game.input.activePointer.y > 2*this.game.config.height/3)*/;
+ }
+
+ upActive() {
+ return this.keyUp.isDown || this.keyW.isDown/* || (this.game.input.activePointer.isDown &&
+ this.game.input.activePointer.y < this.game.config.height/3)*/;
+ }
+}
\ No newline at end of file
diff --git a/src/scenes/Menu.js b/src/scenes/Menu.js
index 6bf623e..9316e5b 100644
--- a/src/scenes/Menu.js
+++ b/src/scenes/Menu.js
@@ -3,29 +3,53 @@
* All rights reserved.
*/
-import logoImg from "../assets/logo.png";
+import Player from "../entities/Player";
export default class Menu extends Phaser.Scene {
constructor() {
- super("Menu");
- }
-
- preload() {
- this.load.image("logo", logoImg);
- }
-
- create() {
- const logo = this.add.image(this.cameras.main.centerX, this.cameras.main.centerY * 1.5, "logo").setOrigin(0.5, 0.5);
-
- this.tweens.add({
- targets: logo,
- y: this.cameras.main.centerY,
- duration: 2000,
- ease: "Power2",
- yoyo: true,
- loop: -1
+ super({
+ key: "Menu",
+ pixelArt: true,
+ physics: {
+ default: 'arcade',
+ arcade: {
+ gravity: {y: 0},
+ // debug: true
+ }
+ }
});
}
+ create() {
+ const w = this.cameras.main.centerX;
+ const h = this.cameras.main.centerY;
+ [{x: w / 2, y: h / 2, key: 'A'},
+ {x: w / 2 + w, y: h / 2, key: 'B'},
+ {x: w / 2, y: h / 2 + h, key: 'C'},
+ {x: w / 2 + w, y: h / 2 + h, key: 'D'}]
+ .forEach((e) => this.addOption(e));
+
+ }
+
+ addOption(options) {
+ this.anims.create({
+ key: 'idle' + options.key,
+ frames: this.anims.generateFrameNumbers('char' + options.key, {start: 126, end: 131}),
+ frameRate: 10,
+ repeat: -1
+ });
+
+ new Player(this, options, 'char' + options.key).play('idle' + options.key, true)
+ .setInteractive()
+ .on('pointerdown', () => {
+
+ this.textures.addSpriteSheet('char', this.textures.get('char' + options.key).getSourceImage(), {
+ frameWidth: 79,
+ frameHeight: 63
+ });
+
+ this.scene.start('Game');
+ })
+ }
}
\ No newline at end of file
diff --git a/src/scenes/Preload.js b/src/scenes/Preload.js
new file mode 100644
index 0000000..1cef85f
--- /dev/null
+++ b/src/scenes/Preload.js
@@ -0,0 +1,89 @@
+/*
+ * Copyright (c) 2020. Pascal Syma
+ * All rights reserved.
+ */
+
+import logoImg from "../../public/favicon.png";
+import map from "../assets/map.json";
+import charA from "../assets/char_a/spritesheet.png";
+import charB from "../assets/char_b/spritesheet.png";
+import charC from "../assets/char_c/spritesheet.png";
+import charD from "../assets/char_d/spritesheet.png";
+import tiles from "../assets/tileset.png";
+import batFly from "../assets/BatFly.png";
+import batDie from "../assets/BatDie.png";
+
+export default class Preload extends Phaser.Scene {
+
+ constructor() {
+ super('Loading');
+ }
+
+ preload() {
+ this.loadingScreen();
+ this.load.image("logo", logoImg);
+ this.load.spritesheet('charA', charA, {frameWidth: 79, frameHeight: 63/*, margin: 1, spacing: 2*/});
+ this.load.spritesheet('charB', charB, {frameWidth: 79, frameHeight: 63/*, margin: 1, spacing: 2*/});
+ this.load.spritesheet('charC', charC, {frameWidth: 79, frameHeight: 63/*, margin: 1, spacing: 2*/});
+ this.load.spritesheet('charD', charD, {frameWidth: 79, frameHeight: 63/*, margin: 1, spacing: 2*/});
+ this.load.spritesheet('tiles', tiles, {frameWidth: 16, frameHeight: 16, margin: 1, spacing: 2});
+ this.load.spritesheet('batFly', batFly, {frameWidth: 48, frameHeight: 32/*, margin: 1, spacing: 2*/});
+ this.load.spritesheet('batDie', batDie, {frameWidth: 48, frameHeight: 32/*, margin: 1, spacing: 2*/});
+ this.load.tilemapTiledJSON("map", map);
+ }
+
+ create() {
+ this.add.image(this.cameras.main.centerX, this.cameras.main.centerY, 'logo').setOrigin(0.5, 0.5).setDisplaySize(this.cameras.main.centerX, this.cameras.main.centerX);
+ setTimeout(() => {
+ this.scene.start('Menu');
+ }, 2 * 1000)
+ }
+
+ loadingScreen() {
+ const progressBar = this.add.graphics();
+ const progressBox = this.add.graphics();
+ const width = this.cameras.main.width;
+ const height = this.cameras.main.height;
+
+ progressBox.fillStyle(0x222222, 0.8);
+ progressBox.fillRect(width / 4, height / 2 - 25, width / 2, 50);
+
+ const loadingText = this.make.text({
+ x: width / 2,
+ y: height / 2 - 25 - 20,
+ text: 'Loading...',
+ style: {
+ font: '20px monospace',
+ fill: '#ffffff'
+ }
+ });
+ loadingText.setOrigin(0.5, 1);
+
+ const percentText = this.make.text({
+ x: width / 2,
+ y: height / 2,
+ text: '0%',
+ style: {
+ font: '18px monospace',
+ fill: '#ffffff'
+ }
+ });
+ percentText.setOrigin(0.5, 0.5);
+
+ this.load.on('progress', (value) => {
+ percentText.setText(parseInt(value * 100) + '%');
+ progressBar.clear();
+ progressBar.fillStyle(0xffffff, 1);
+ progressBar.fillRect(width / 4 + 10, height / 2 - 25 + 10, (width / 2 - 20) * value, 50 - 20);
+ });
+
+ this.load.on('complete', () => {
+ progressBar.destroy();
+ progressBox.destroy();
+ loadingText.destroy();
+ percentText.destroy();
+
+ });
+ }
+
+}
\ No newline at end of file