├── .babelrc ├── .gitignore ├── LICENSE ├── README.md ├── assets ├── atlas.json ├── atlas.png ├── maps │ ├── level1.json │ ├── level2.json │ ├── level3.json │ ├── level4.json │ └── level5.json ├── minecraft.fnt ├── music │ ├── 03-Whydothenationsrage.mp3 │ ├── 06-RebelsBe.mp3 │ ├── 13Danger.mp3 │ ├── 14-BarbarianKing.mp3 │ ├── 15-Dungeon.mp3 │ ├── 20-GameOver.mp3 │ └── 25-Finale.mp3 ├── pack.json ├── sfx │ ├── sfx_alarm_loop8.wav │ ├── sfx_coin_double2.wav │ ├── sfx_deathscream_alien1.wav │ ├── sfx_deathscream_alien3.wav │ ├── sfx_deathscream_alien6.wav │ ├── sfx_deathscream_human3.wav │ ├── sfx_exp_short_hard14.wav │ ├── sfx_exp_short_soft11.wav │ ├── sfx_lowhealth_alarmloop7.wav │ ├── sfx_sounds_damage1.wav │ ├── sfx_sounds_error10.wav │ ├── sfx_sounds_fanfare3.wav │ ├── sfx_sounds_high2.wav │ ├── sfx_sounds_interaction1.wav │ ├── sfx_sounds_interaction12.wav │ ├── sfx_sounds_interaction14.wav │ ├── sfx_sounds_interaction7.wav │ ├── sfx_sounds_powerup2.wav │ ├── sfx_sounds_powerup6.wav │ └── sfx_wpn_laser9.wav └── tiles │ └── tiles.png ├── design ├── gameOver.png ├── minecraft.png ├── sprites │ ├── coins.png │ ├── crosshair.png │ ├── darkFireball.png │ ├── darkParticle.png │ ├── demon.png │ ├── enemy.png │ ├── exclamation.png │ ├── fireball.png │ ├── heart.png │ ├── jug.png │ ├── meat.png │ ├── player.png │ ├── potion.png │ ├── slime.png │ └── whiteParticle.png └── win.png ├── dist └── bundle.min.js ├── index.html ├── package-lock.json ├── package.json ├── screenshot.png ├── src ├── index.html ├── index.js ├── scenes │ ├── HUD.js │ ├── Level.js │ ├── Preload.js │ └── gameOver.js └── sprites │ ├── coins.js │ ├── darkFireball.js │ ├── demon.js │ ├── enemy.js │ ├── fireball.js │ ├── heart.js │ ├── jug.js │ ├── meat.js │ ├── player.js │ ├── potion.js │ └── slime.js └── webpack ├── base.js └── prod.js /.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": [ 3 | ["@babel/env", { 4 | "targets": { 5 | "browsers": [ 6 | ">0.25%", 7 | "not ie 11", 8 | "not op_mini all" 9 | ] 10 | }, 11 | "modules": false 12 | }] 13 | ], 14 | } 15 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # System and IDE files 2 | Thumbs.db 3 | .DS_Store 4 | .idea 5 | *.suo 6 | *.sublime-project 7 | *.sublime-workspace 8 | 9 | # Vendors 10 | node_modules/ 11 | 12 | # Build 13 | /npm-debug.log 14 | 15 | # Vim temps 16 | *~ 17 | *.swp 18 | *.swo 19 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 B3L7 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Phaser 3 Tilemap & File Pack Project Template 2 | 3 | ![Screenshot](https://github.com/B3L7/phaser3-tilemap-pack/raw/master/screenshot.png "Template Screenshot") 4 | 5 | A Phaser 3 Project Template with Webpack, Tilemap, and File Pack. This template was created to illustrate the conecept of having a single Level Class (Extended from the Scene Class) which generates the game level from dynamically loaded tilemaps. 6 | 7 | Try the [demo!](https://b3l7.github.io/phaser3-tilemap-pack/) 8 | 9 | ### Requirements 10 | 11 | We need [Node.js](https://nodejs.org) to install and run scripts. 12 | 13 | [Tiled](https://www.mapeditor.org/) needed to make and edit tilemaps. 14 | 15 | [Littera](http://kvazars.com/littera/) to make bitmap font. 16 | 17 | [Leshy Spritetool](https://www.leshylabs.com/apps/sstool/) used to make atlas. 18 | 19 | [Tile Extruder](https://github.com/sporadic-labs/tile-extruder) to extrude tileset and prevent bleed. 20 | 21 | ## Install and run 22 | 23 | | Command | Description | 24 | |---------|-------------| 25 | | `npm install` | Install project dependencies | 26 | | `npm start` | Build project and open web server running project | 27 | | `npm run build` | Builds code bundle with production settings (minification, uglification, etc..) | 28 | 29 | ## References 30 | Based on Project Template by Richard Davey: 31 | [Phaser 3 Webpack Project Template](https://github.com/photonstorm/phaser3-project-template) 32 | 33 | and 34 | 35 | [Generic Platformer and Phaser Bootstrap Project](https://github.com/nkholski/phaser3-es6-webpack) 36 | 37 | ## Graphics and Sound 38 | 39 | [16x16 Fantasy tileset](https://opengameart.org/content/16x16-fantasy-tileset) 40 | 41 | [Generic 8-bit JRPG Soundtrack](https://opengameart.org/content/generic-8-bit-jrpg-soundtrack) 42 | 43 | [512 Sound Effects (8-bit style)](https://opengameart.org/content/512-sound-effects-8-bit-style) 44 | 45 | [Minecraft Font](https://www.dafont.com/minecraft.font) 46 | 47 | 48 | 49 | ## Change Log 50 | 51 | ### Version 1.2.1 - May 22, 2019 52 | 53 | * Fireballl collision fix 54 | 55 | ### Version 1.2.0 - May 21, 2019 56 | 57 | * Upgrade to Phaser 3.17.0 58 | * Implemented pools for player and enemy fireballs 59 | * Added scaling to game config 60 | * Updated to babel and webpack 4 to be in line with Phaser 3 Webpack Project Template 61 | 62 | ### Version 1.1.0 - September 6, 2018 63 | 64 | * Upgrade to Phaser 3.12.0 65 | * Minor fixes for 3.12 compatibility 66 | -------------------------------------------------------------------------------- /assets/atlas.json: -------------------------------------------------------------------------------- 1 | {"frames":{"minecraft":{"frame":{"x":0,"y":120,"w":110,"h":414},"rotated":false,"trimmed":false,"spriteSourceSize":{"x":0,"y":0,"w":110,"h":414},"sourceSize":{"w":110,"h":414}},"crosshair":{"frame":{"x":111,"y":120,"w":16,"h":16},"rotated":false,"trimmed":false,"spriteSourceSize":{"x":0,"y":0,"w":16,"h":16},"sourceSize":{"w":16,"h":16}},"darkFireball":{"frame":{"x":111,"y":284,"w":9,"h":9},"rotated":false,"trimmed":false,"spriteSourceSize":{"x":0,"y":0,"w":9,"h":9},"sourceSize":{"w":9,"h":9}},"darkParticle":{"frame":{"x":111,"y":314,"w":1,"h":1},"rotated":false,"trimmed":false,"spriteSourceSize":{"x":0,"y":0,"w":1,"h":1},"sourceSize":{"w":1,"h":1}},"demon":{"frame":{"x":111,"y":137,"w":16,"h":16},"rotated":false,"trimmed":false,"spriteSourceSize":{"x":0,"y":0,"w":16,"h":16},"sourceSize":{"w":16,"h":16}},"enemy":{"frame":{"x":111,"y":154,"w":16,"h":16},"rotated":false,"trimmed":false,"spriteSourceSize":{"x":0,"y":0,"w":16,"h":16},"sourceSize":{"w":16,"h":16}},"exclamation":{"frame":{"x":111,"y":273,"w":10,"h":10},"rotated":false,"trimmed":false,"spriteSourceSize":{"x":0,"y":0,"w":10,"h":10},"sourceSize":{"w":10,"h":10}},"fireball":{"frame":{"x":111,"y":294,"w":9,"h":9},"rotated":false,"trimmed":false,"spriteSourceSize":{"x":0,"y":0,"w":9,"h":9},"sourceSize":{"w":9,"h":9}},"heart":{"frame":{"x":111,"y":171,"w":16,"h":16},"rotated":false,"trimmed":false,"spriteSourceSize":{"x":0,"y":0,"w":16,"h":16},"sourceSize":{"w":16,"h":16}},"jug":{"frame":{"x":111,"y":188,"w":16,"h":16},"rotated":false,"trimmed":false,"spriteSourceSize":{"x":0,"y":0,"w":16,"h":16},"sourceSize":{"w":16,"h":16}},"meat":{"frame":{"x":111,"y":205,"w":16,"h":16},"rotated":false,"trimmed":false,"spriteSourceSize":{"x":0,"y":0,"w":16,"h":16},"sourceSize":{"w":16,"h":16}},"player":{"frame":{"x":111,"y":222,"w":16,"h":16},"rotated":false,"trimmed":false,"spriteSourceSize":{"x":0,"y":0,"w":16,"h":16},"sourceSize":{"w":16,"h":16}},"potion":{"frame":{"x":111,"y":239,"w":16,"h":16},"rotated":false,"trimmed":false,"spriteSourceSize":{"x":0,"y":0,"w":16,"h":16},"sourceSize":{"w":16,"h":16}},"slime":{"frame":{"x":111,"y":256,"w":16,"h":16},"rotated":false,"trimmed":false,"spriteSourceSize":{"x":0,"y":0,"w":16,"h":16},"sourceSize":{"w":16,"h":16}},"whiteParticle":{"frame":{"x":111,"y":316,"w":1,"h":1},"rotated":false,"trimmed":false,"spriteSourceSize":{"x":0,"y":0,"w":1,"h":1},"sourceSize":{"w":1,"h":1}},"gameOver":{"frame":{"x":0,"y":58,"w":387,"h":61},"rotated":false,"trimmed":false,"spriteSourceSize":{"x":0,"y":0,"w":387,"h":61},"sourceSize":{"w":387,"h":61}},"win":{"frame":{"x":0,"y":0,"w":389,"h":57},"rotated":false,"trimmed":false,"spriteSourceSize":{"x":0,"y":0,"w":389,"h":57},"sourceSize":{"w":389,"h":57}},"coins":{"frame":{"x":111,"y":304,"w":9,"h":9},"rotated":false,"trimmed":false,"spriteSourceSize":{"x":0,"y":0,"w":9,"h":9},"sourceSize":{"w":9,"h":9}}},"meta":{"app":"https://www.leshylabs.com/apps/sstool/","version":"Leshy SpriteSheet Tool v0.8.4","image":"atlas.png","size":{"w":389,"h":534},"scale":1}} -------------------------------------------------------------------------------- /assets/atlas.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/B3L7/phaser3-tilemap-pack/365d09d2b8f7c9160346c23591eff25056e0914b/assets/atlas.png -------------------------------------------------------------------------------- /assets/maps/level1.json: -------------------------------------------------------------------------------- 1 | { "height":38, 2 | "infinite":false, 3 | "layers":[ 4 | { 5 | "data":"UQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAABUAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAACAAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABcAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAHwAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAABSAAAAIQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAAAfAAAAUgAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAAAhAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAB8AAABSAAAAUgAAABAAAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAAAQAAAAUgAAACEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAHwAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAABSAAAAIQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAAAfAAAAUgAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAABAAAAAQAAAAEAAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAAAhAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAB8AAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAACEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAHwAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAABSAAAAIQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAAApAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFwAAAFIAAABSAAAAUgAAABUAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAArAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAAAhAAAAUgAAAFIAAABSAAAAHwAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAACEAAABSAAAAUgAAAFIAAAAfAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAIQAAAFIAAABSAAAAUgAAAB8AAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAAAVAAAAFgAAABYAAAAWAAAAFgAAABYAAAArAAAAUgAAAFIAAABSAAAAKQAAABYAAAAWAAAAFgAAABYAAAAWAAAAFwAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAB8AAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAAAhAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAHwAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAACEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAAAfAAAAUgAAAFIAAAAQAAAAUgAAAFIAAABSAAAAUgAAABAAAABSAAAAUgAAAFIAAAAQAAAAUgAAAFIAAABSAAAAIQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAB8AAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAAAhAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAHwAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAACEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAAAfAAAAUgAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAABSAAAAIQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAB8AAABSAAAAEAAAAFIAAABSAAAAEAAAAFIAAABSAAAAEAAAAFIAAABSAAAAEAAAAFIAAABSAAAAEAAAAFIAAAAhAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAHwAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAACEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAAAfAAAAUgAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAABSAAAAIQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAB8AAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAAAhAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAHwAAAFIAAAAQAAAAUgAAABAAAABSAAAAEAAAAFIAAAAQAAAAUgAAABAAAABSAAAAEAAAAFIAAAAQAAAAUgAAACEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAAAfAAAAUgAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAABSAAAAIQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAB8AAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAAAhAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAHwAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAACEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAAAfAAAAUgAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAABSAAAAIQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAB8AAABSAAAAUgAAAFIAAAAQAAAAUgAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAAAhAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAHwAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAACEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAAAfAAAAUgAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAABSAAAAIQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAACkAAAAWAAAAFgAAABYAAAAWAAAAFgAAABkAAAAUAAAAFAAAABQAAAAYAAAAFgAAABYAAAAWAAAAFgAAABYAAAArAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAHwAAABQAAAAUAAAAFAAAACEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAAAfAAAAFAAAABQAAAAUAAAAIQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAB8AAAAUAAAAFAAAABQAAAAhAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAA==", 6 | "encoding":"base64", 7 | "height":38, 8 | "name":"tileLayer", 9 | "opacity":1, 10 | "type":"tilelayer", 11 | "visible":true, 12 | "width":50, 13 | "x":0, 14 | "y":0 15 | }, 16 | { 17 | "draworder":"topdown", 18 | "name":"objects", 19 | "objects":[ 20 | { 21 | "gid":92, 22 | "height":16, 23 | "id":1, 24 | "name":"spawnCenter", 25 | "rotation":0, 26 | "type":"spawn", 27 | "visible":true, 28 | "width":16, 29 | "x":352, 30 | "y":80 31 | }, 32 | { 33 | "gid":91, 34 | "height":16, 35 | "id":2, 36 | "name":"", 37 | "rotation":0, 38 | "type":"enemy", 39 | "visible":true, 40 | "width":16, 41 | "x":304, 42 | "y":512 43 | }, 44 | { 45 | "gid":91, 46 | "height":16, 47 | "id":3, 48 | "name":"", 49 | "rotation":0, 50 | "type":"enemy", 51 | "visible":true, 52 | "width":16, 53 | "x":416, 54 | "y":512 55 | }, 56 | { 57 | "gid":92, 58 | "height":16, 59 | "id":4, 60 | "name":"spawnDown", 61 | "rotation":0, 62 | "type":"spawn", 63 | "visible":true, 64 | "width":16, 65 | "x":352, 66 | "y":608 67 | }, 68 | { 69 | "gid":93, 70 | "height":16, 71 | "id":5, 72 | "name":"", 73 | "rotation":0, 74 | "type":"coins", 75 | "visible":true, 76 | "width":16, 77 | "x":416, 78 | "y":384 79 | }, 80 | { 81 | "gid":93, 82 | "height":16, 83 | "id":6, 84 | "name":"", 85 | "rotation":0, 86 | "type":"coins", 87 | "visible":true, 88 | "width":16, 89 | "x":288, 90 | "y":464 91 | }, 92 | { 93 | "gid":93, 94 | "height":16, 95 | "id":7, 96 | "name":"", 97 | "rotation":0, 98 | "type":"coins", 99 | "visible":true, 100 | "width":16, 101 | "x":336, 102 | "y":368 103 | }, 104 | { 105 | "gid":96, 106 | "height":16, 107 | "id":8, 108 | "name":"", 109 | "rotation":0, 110 | "type":"meat", 111 | "visible":true, 112 | "width":16, 113 | "x":448, 114 | "y":480 115 | }, 116 | { 117 | "gid":95, 118 | "height":16, 119 | "id":10, 120 | "name":"", 121 | "rotation":0, 122 | "type":"potion", 123 | "visible":true, 124 | "width":16, 125 | "x":448, 126 | "y":400 127 | }, 128 | { 129 | "gid":95, 130 | "height":16, 131 | "id":11, 132 | "name":"", 133 | "rotation":0, 134 | "type":"potion", 135 | "visible":true, 136 | "width":16, 137 | "x":336, 138 | "y":464 139 | }, 140 | { 141 | "gid":99, 142 | "height":16, 143 | "id":17, 144 | "name":"", 145 | "rotation":0, 146 | "type":"slime", 147 | "visible":true, 148 | "width":16, 149 | "x":352, 150 | "y":272 151 | }, 152 | { 153 | "gid":97, 154 | "height":16, 155 | "id":18, 156 | "name":"", 157 | "rotation":0, 158 | "type":"jug", 159 | "visible":true, 160 | "width":16, 161 | "x":352, 162 | "y":528 163 | }, 164 | { 165 | "gid":93, 166 | "height":16, 167 | "id":19, 168 | "name":"", 169 | "rotation":0, 170 | "type":"coins", 171 | "visible":true, 172 | "width":16, 173 | "x":352, 174 | "y":192 175 | }, 176 | { 177 | "gid":99, 178 | "height":16, 179 | "id":21, 180 | "name":"", 181 | "rotation":0, 182 | "type":"slime", 183 | "visible":true, 184 | "width":16, 185 | "x":288, 186 | "y":400 187 | }, 188 | { 189 | "gid":99, 190 | "height":16, 191 | "id":22, 192 | "name":"", 193 | "rotation":0, 194 | "type":"slime", 195 | "visible":true, 196 | "width":16, 197 | "x":416, 198 | "y":400 199 | }, 200 | { 201 | "gid":99, 202 | "height":16, 203 | "id":23, 204 | "name":"", 205 | "rotation":0, 206 | "type":"", 207 | "visible":true, 208 | "width":16, 209 | "x":352, 210 | "y":464 211 | }, 212 | { 213 | "gid":99, 214 | "height":16, 215 | "id":24, 216 | "name":"", 217 | "rotation":0, 218 | "type":"slime", 219 | "visible":true, 220 | "width":16, 221 | "x":304, 222 | "y":336 223 | }, 224 | { 225 | "gid":99, 226 | "height":16, 227 | "id":25, 228 | "name":"", 229 | "rotation":0, 230 | "type":"slime", 231 | "visible":true, 232 | "width":16, 233 | "x":400, 234 | "y":336 235 | }, 236 | { 237 | "gid":99, 238 | "height":16, 239 | "id":26, 240 | "name":"", 241 | "rotation":0, 242 | "type":"slime", 243 | "visible":true, 244 | "width":16, 245 | "x":352, 246 | "y":400 247 | }, 248 | { 249 | "gid":93, 250 | "height":16, 251 | "id":27, 252 | "name":"", 253 | "rotation":0, 254 | "type":"coins", 255 | "visible":true, 256 | "width":16, 257 | "x":272, 258 | "y":144 259 | }, 260 | { 261 | "gid":93, 262 | "height":16, 263 | "id":28, 264 | "name":"", 265 | "rotation":0, 266 | "type":"coins", 267 | "visible":true, 268 | "width":16, 269 | "x":352, 270 | "y":112 271 | }, 272 | { 273 | "gid":93, 274 | "height":16, 275 | "id":29, 276 | "name":"", 277 | "rotation":0, 278 | "type":"coins", 279 | "visible":true, 280 | "width":16, 281 | "x":448, 282 | "y":144 283 | }, 284 | { 285 | "gid":96, 286 | "height":16, 287 | "id":30, 288 | "name":"", 289 | "rotation":0, 290 | "type":"meat", 291 | "visible":true, 292 | "width":16, 293 | "x":224, 294 | "y":176 295 | }, 296 | { 297 | "gid":95, 298 | "height":16, 299 | "id":31, 300 | "name":"", 301 | "rotation":0, 302 | "type":"potion", 303 | "visible":true, 304 | "width":16, 305 | "x":480, 306 | "y":176 307 | }, 308 | { 309 | "gid":93, 310 | "height":16, 311 | "id":32, 312 | "name":"", 313 | "rotation":0, 314 | "type":"coins", 315 | "visible":true, 316 | "width":16, 317 | "x":400, 318 | "y":464 319 | }, 320 | { 321 | "gid":93, 322 | "height":16, 323 | "id":33, 324 | "name":"", 325 | "rotation":0, 326 | "type":"coins", 327 | "visible":true, 328 | "width":16, 329 | "x":352, 330 | "y":544 331 | }, 332 | { 333 | "gid":93, 334 | "height":16, 335 | "id":34, 336 | "name":"", 337 | "rotation":0, 338 | "type":"coins", 339 | "visible":true, 340 | "width":16, 341 | "x":352, 342 | "y":320 343 | }], 344 | "opacity":1, 345 | "type":"objectgroup", 346 | "visible":true, 347 | "x":0, 348 | "y":0 349 | }], 350 | "nextobjectid":35, 351 | "orientation":"orthogonal", 352 | "properties": 353 | { 354 | "loadDown":"Level2", 355 | "loadLeft":"", 356 | "loadRight":"", 357 | "loadUP":"", 358 | "spawnDown":"spawnUp", 359 | "spawnLeft":"", 360 | "spawnRight":"", 361 | "spawnUp":"" 362 | }, 363 | "propertytypes": 364 | { 365 | "loadDown":"string", 366 | "loadLeft":"string", 367 | "loadRight":"string", 368 | "loadUP":"string", 369 | "spawnDown":"string", 370 | "spawnLeft":"string", 371 | "spawnRight":"string", 372 | "spawnUp":"string" 373 | }, 374 | "renderorder":"right-down", 375 | "tiledversion":"1.1.5", 376 | "tileheight":16, 377 | "tilesets":[ 378 | { 379 | "columns":10, 380 | "firstgid":1, 381 | "image":"..\/tiles\/tiles.png", 382 | "imageheight":162, 383 | "imagewidth":180, 384 | "margin":1, 385 | "name":"tiles", 386 | "spacing":2, 387 | "tilecount":90, 388 | "tileheight":16, 389 | "tileproperties": 390 | { 391 | "0": 392 | { 393 | "collide":false 394 | }, 395 | "1": 396 | { 397 | "collide":false 398 | }, 399 | "10": 400 | { 401 | "collide":false 402 | }, 403 | "11": 404 | { 405 | "collide":false 406 | }, 407 | "12": 408 | { 409 | "collide":false 410 | }, 411 | "13": 412 | { 413 | "collide":false 414 | }, 415 | "14": 416 | { 417 | "collide":false 418 | }, 419 | "15": 420 | { 421 | "collide":true 422 | }, 423 | "16": 424 | { 425 | "collide":false 426 | }, 427 | "17": 428 | { 429 | "collide":false 430 | }, 431 | "18": 432 | { 433 | "collide":false 434 | }, 435 | "19": 436 | { 437 | "collide":false 438 | }, 439 | "2": 440 | { 441 | "collide":false 442 | }, 443 | "20": 444 | { 445 | "collide":true 446 | }, 447 | "21": 448 | { 449 | "collide":true 450 | }, 451 | "22": 452 | { 453 | "collide":true 454 | }, 455 | "23": 456 | { 457 | "collide":true 458 | }, 459 | "24": 460 | { 461 | "collide":true 462 | }, 463 | "25": 464 | { 465 | "collide":false 466 | }, 467 | "26": 468 | { 469 | "collide":false 470 | }, 471 | "27": 472 | { 473 | "collide":false 474 | }, 475 | "28": 476 | { 477 | "collide":false 478 | }, 479 | "29": 480 | { 481 | "collide":false 482 | }, 483 | "3": 484 | { 485 | "collide":false 486 | }, 487 | "30": 488 | { 489 | "collide":true 490 | }, 491 | "31": 492 | { 493 | "collide":true 494 | }, 495 | "32": 496 | { 497 | "collide":true 498 | }, 499 | "33": 500 | { 501 | "collide":true 502 | }, 503 | "34": 504 | { 505 | "collide":true 506 | }, 507 | "35": 508 | { 509 | "collide":false 510 | }, 511 | "36": 512 | { 513 | "collide":false 514 | }, 515 | "37": 516 | { 517 | "collide":false 518 | }, 519 | "38": 520 | { 521 | "collide":false 522 | }, 523 | "39": 524 | { 525 | "collide":false 526 | }, 527 | "4": 528 | { 529 | "collide":false 530 | }, 531 | "40": 532 | { 533 | "collide":true 534 | }, 535 | "41": 536 | { 537 | "collide":true 538 | }, 539 | "42": 540 | { 541 | "collide":true 542 | }, 543 | "43": 544 | { 545 | "collide":false 546 | }, 547 | "44": 548 | { 549 | "collide":false 550 | }, 551 | "45": 552 | { 553 | "collide":false 554 | }, 555 | "46": 556 | { 557 | "collide":false 558 | }, 559 | "47": 560 | { 561 | "collide":false 562 | }, 563 | "48": 564 | { 565 | "collide":false 566 | }, 567 | "49": 568 | { 569 | "collide":false 570 | }, 571 | "5": 572 | { 573 | "collide":false 574 | }, 575 | "50": 576 | { 577 | "collide":false 578 | }, 579 | "51": 580 | { 581 | "collide":false 582 | }, 583 | "52": 584 | { 585 | "collide":false 586 | }, 587 | "53": 588 | { 589 | "collide":false 590 | }, 591 | "54": 592 | { 593 | "collide":false 594 | }, 595 | "55": 596 | { 597 | "collide":false 598 | }, 599 | "56": 600 | { 601 | "collide":false 602 | }, 603 | "57": 604 | { 605 | "collide":false 606 | }, 607 | "58": 608 | { 609 | "collide":false 610 | }, 611 | "59": 612 | { 613 | "collide":false 614 | }, 615 | "6": 616 | { 617 | "collide":false 618 | }, 619 | "60": 620 | { 621 | "collide":false 622 | }, 623 | "61": 624 | { 625 | "collide":false 626 | }, 627 | "62": 628 | { 629 | "collide":false 630 | }, 631 | "63": 632 | { 633 | "collide":false 634 | }, 635 | "64": 636 | { 637 | "collide":false 638 | }, 639 | "65": 640 | { 641 | "collide":false 642 | }, 643 | "66": 644 | { 645 | "collide":false 646 | }, 647 | "67": 648 | { 649 | "collide":false 650 | }, 651 | "68": 652 | { 653 | "collide":false 654 | }, 655 | "69": 656 | { 657 | "collide":false 658 | }, 659 | "7": 660 | { 661 | "collide":false 662 | }, 663 | "70": 664 | { 665 | "collide":false 666 | }, 667 | "71": 668 | { 669 | "collide":false 670 | }, 671 | "72": 672 | { 673 | "collide":false 674 | }, 675 | "73": 676 | { 677 | "collide":false 678 | }, 679 | "74": 680 | { 681 | "collide":false 682 | }, 683 | "75": 684 | { 685 | "collide":false 686 | }, 687 | "76": 688 | { 689 | "collide":false 690 | }, 691 | "77": 692 | { 693 | "collide":false 694 | }, 695 | "78": 696 | { 697 | "collide":false 698 | }, 699 | "79": 700 | { 701 | "collide":false 702 | }, 703 | "8": 704 | { 705 | "collide":false 706 | }, 707 | "9": 708 | { 709 | "collide":false 710 | } 711 | }, 712 | "tilepropertytypes": 713 | { 714 | "0": 715 | { 716 | "collide":"bool" 717 | }, 718 | "1": 719 | { 720 | "collide":"bool" 721 | }, 722 | "10": 723 | { 724 | "collide":"bool" 725 | }, 726 | "11": 727 | { 728 | "collide":"bool" 729 | }, 730 | "12": 731 | { 732 | "collide":"bool" 733 | }, 734 | "13": 735 | { 736 | "collide":"bool" 737 | }, 738 | "14": 739 | { 740 | "collide":"bool" 741 | }, 742 | "15": 743 | { 744 | "collide":"bool" 745 | }, 746 | "16": 747 | { 748 | "collide":"bool" 749 | }, 750 | "17": 751 | { 752 | "collide":"bool" 753 | }, 754 | "18": 755 | { 756 | "collide":"bool" 757 | }, 758 | "19": 759 | { 760 | "collide":"bool" 761 | }, 762 | "2": 763 | { 764 | "collide":"bool" 765 | }, 766 | "20": 767 | { 768 | "collide":"bool" 769 | }, 770 | "21": 771 | { 772 | "collide":"bool" 773 | }, 774 | "22": 775 | { 776 | "collide":"bool" 777 | }, 778 | "23": 779 | { 780 | "collide":"bool" 781 | }, 782 | "24": 783 | { 784 | "collide":"bool" 785 | }, 786 | "25": 787 | { 788 | "collide":"bool" 789 | }, 790 | "26": 791 | { 792 | "collide":"bool" 793 | }, 794 | "27": 795 | { 796 | "collide":"bool" 797 | }, 798 | "28": 799 | { 800 | "collide":"bool" 801 | }, 802 | "29": 803 | { 804 | "collide":"bool" 805 | }, 806 | "3": 807 | { 808 | "collide":"bool" 809 | }, 810 | "30": 811 | { 812 | "collide":"bool" 813 | }, 814 | "31": 815 | { 816 | "collide":"bool" 817 | }, 818 | "32": 819 | { 820 | "collide":"bool" 821 | }, 822 | "33": 823 | { 824 | "collide":"bool" 825 | }, 826 | "34": 827 | { 828 | "collide":"bool" 829 | }, 830 | "35": 831 | { 832 | "collide":"bool" 833 | }, 834 | "36": 835 | { 836 | "collide":"bool" 837 | }, 838 | "37": 839 | { 840 | "collide":"bool" 841 | }, 842 | "38": 843 | { 844 | "collide":"bool" 845 | }, 846 | "39": 847 | { 848 | "collide":"bool" 849 | }, 850 | "4": 851 | { 852 | "collide":"bool" 853 | }, 854 | "40": 855 | { 856 | "collide":"bool" 857 | }, 858 | "41": 859 | { 860 | "collide":"bool" 861 | }, 862 | "42": 863 | { 864 | "collide":"bool" 865 | }, 866 | "43": 867 | { 868 | "collide":"bool" 869 | }, 870 | "44": 871 | { 872 | "collide":"bool" 873 | }, 874 | "45": 875 | { 876 | "collide":"bool" 877 | }, 878 | "46": 879 | { 880 | "collide":"bool" 881 | }, 882 | "47": 883 | { 884 | "collide":"bool" 885 | }, 886 | "48": 887 | { 888 | "collide":"bool" 889 | }, 890 | "49": 891 | { 892 | "collide":"bool" 893 | }, 894 | "5": 895 | { 896 | "collide":"bool" 897 | }, 898 | "50": 899 | { 900 | "collide":"bool" 901 | }, 902 | "51": 903 | { 904 | "collide":"bool" 905 | }, 906 | "52": 907 | { 908 | "collide":"bool" 909 | }, 910 | "53": 911 | { 912 | "collide":"bool" 913 | }, 914 | "54": 915 | { 916 | "collide":"bool" 917 | }, 918 | "55": 919 | { 920 | "collide":"bool" 921 | }, 922 | "56": 923 | { 924 | "collide":"bool" 925 | }, 926 | "57": 927 | { 928 | "collide":"bool" 929 | }, 930 | "58": 931 | { 932 | "collide":"bool" 933 | }, 934 | "59": 935 | { 936 | "collide":"bool" 937 | }, 938 | "6": 939 | { 940 | "collide":"bool" 941 | }, 942 | "60": 943 | { 944 | "collide":"bool" 945 | }, 946 | "61": 947 | { 948 | "collide":"bool" 949 | }, 950 | "62": 951 | { 952 | "collide":"bool" 953 | }, 954 | "63": 955 | { 956 | "collide":"bool" 957 | }, 958 | "64": 959 | { 960 | "collide":"bool" 961 | }, 962 | "65": 963 | { 964 | "collide":"bool" 965 | }, 966 | "66": 967 | { 968 | "collide":"bool" 969 | }, 970 | "67": 971 | { 972 | "collide":"bool" 973 | }, 974 | "68": 975 | { 976 | "collide":"bool" 977 | }, 978 | "69": 979 | { 980 | "collide":"bool" 981 | }, 982 | "7": 983 | { 984 | "collide":"bool" 985 | }, 986 | "70": 987 | { 988 | "collide":"bool" 989 | }, 990 | "71": 991 | { 992 | "collide":"bool" 993 | }, 994 | "72": 995 | { 996 | "collide":"bool" 997 | }, 998 | "73": 999 | { 1000 | "collide":"bool" 1001 | }, 1002 | "74": 1003 | { 1004 | "collide":"bool" 1005 | }, 1006 | "75": 1007 | { 1008 | "collide":"bool" 1009 | }, 1010 | "76": 1011 | { 1012 | "collide":"bool" 1013 | }, 1014 | "77": 1015 | { 1016 | "collide":"bool" 1017 | }, 1018 | "78": 1019 | { 1020 | "collide":"bool" 1021 | }, 1022 | "79": 1023 | { 1024 | "collide":"bool" 1025 | }, 1026 | "8": 1027 | { 1028 | "collide":"bool" 1029 | }, 1030 | "9": 1031 | { 1032 | "collide":"bool" 1033 | } 1034 | }, 1035 | "tilewidth":16 1036 | }, 1037 | { 1038 | "columns":0, 1039 | "firstgid":91, 1040 | "grid": 1041 | { 1042 | "height":1, 1043 | "orientation":"orthogonal", 1044 | "width":1 1045 | }, 1046 | "margin":0, 1047 | "name":"objects", 1048 | "spacing":0, 1049 | "tilecount":9, 1050 | "tileheight":16, 1051 | "tiles": 1052 | { 1053 | "0": 1054 | { 1055 | "image":"..\/..\/design\/sprites\/enemy.png", 1056 | "imageheight":16, 1057 | "imagewidth":16, 1058 | "type":"enemy" 1059 | }, 1060 | "1": 1061 | { 1062 | "image":"..\/..\/design\/sprites\/player.png", 1063 | "imageheight":16, 1064 | "imagewidth":16, 1065 | "type":"spawn" 1066 | }, 1067 | "2": 1068 | { 1069 | "image":"..\/..\/design\/sprites\/coins.png", 1070 | "imageheight":16, 1071 | "imagewidth":16, 1072 | "type":"coins" 1073 | }, 1074 | "3": 1075 | { 1076 | "image":"..\/..\/design\/sprites\/heart.png", 1077 | "imageheight":16, 1078 | "imagewidth":16, 1079 | "type":"heart" 1080 | }, 1081 | "4": 1082 | { 1083 | "image":"..\/..\/design\/sprites\/potion.png", 1084 | "imageheight":16, 1085 | "imagewidth":16, 1086 | "type":"potion" 1087 | }, 1088 | "5": 1089 | { 1090 | "image":"..\/..\/design\/sprites\/meat.png", 1091 | "imageheight":16, 1092 | "imagewidth":16, 1093 | "type":"meat" 1094 | }, 1095 | "6": 1096 | { 1097 | "image":"..\/..\/design\/sprites\/jug.png", 1098 | "imageheight":16, 1099 | "imagewidth":16, 1100 | "type":"jug" 1101 | }, 1102 | "7": 1103 | { 1104 | "image":"..\/..\/design\/sprites\/demon.png", 1105 | "imageheight":16, 1106 | "imagewidth":16, 1107 | "type":"demon" 1108 | }, 1109 | "8": 1110 | { 1111 | "image":"..\/..\/design\/sprites\/slime.png", 1112 | "imageheight":16, 1113 | "imagewidth":16, 1114 | "type":"slime" 1115 | } 1116 | }, 1117 | "tilewidth":16 1118 | }, 1119 | { 1120 | "columns":0, 1121 | "firstgid":100, 1122 | "grid": 1123 | { 1124 | "height":1, 1125 | "orientation":"orthogonal", 1126 | "width":1 1127 | }, 1128 | "margin":0, 1129 | "name":"objects", 1130 | "spacing":0, 1131 | "tilecount":9, 1132 | "tileheight":16, 1133 | "tiles": 1134 | { 1135 | "0": 1136 | { 1137 | "image":"..\/..\/design\/sprites\/enemy.png", 1138 | "imageheight":16, 1139 | "imagewidth":16, 1140 | "type":"enemy" 1141 | }, 1142 | "1": 1143 | { 1144 | "image":"..\/..\/design\/sprites\/player.png", 1145 | "imageheight":16, 1146 | "imagewidth":16, 1147 | "type":"spawn" 1148 | }, 1149 | "2": 1150 | { 1151 | "image":"..\/..\/design\/sprites\/coins.png", 1152 | "imageheight":16, 1153 | "imagewidth":16, 1154 | "type":"coins" 1155 | }, 1156 | "3": 1157 | { 1158 | "image":"..\/..\/design\/sprites\/slime.png", 1159 | "imageheight":14, 1160 | "imagewidth":14, 1161 | "type":"slime" 1162 | }, 1163 | "4": 1164 | { 1165 | "image":"..\/..\/design\/sprites\/potion.png", 1166 | "imageheight":16, 1167 | "imagewidth":16, 1168 | "type":"potion" 1169 | }, 1170 | "5": 1171 | { 1172 | "image":"..\/..\/design\/sprites\/meat.png", 1173 | "imageheight":16, 1174 | "imagewidth":16, 1175 | "type":"meat" 1176 | }, 1177 | "6": 1178 | { 1179 | "image":"..\/..\/design\/sprites\/demon.png", 1180 | "imageheight":16, 1181 | "imagewidth":16, 1182 | "type":"demon" 1183 | }, 1184 | "7": 1185 | { 1186 | "image":"..\/..\/design\/sprites\/jug.png", 1187 | "imageheight":16, 1188 | "imagewidth":16, 1189 | "type":"jug" 1190 | }, 1191 | "8": 1192 | { 1193 | "image":"..\/..\/design\/sprites\/heart.png", 1194 | "imageheight":16, 1195 | "imagewidth":16, 1196 | "type":"heart" 1197 | } 1198 | }, 1199 | "tilewidth":16 1200 | }], 1201 | "tilewidth":16, 1202 | "type":"map", 1203 | "version":1, 1204 | "width":50 1205 | } -------------------------------------------------------------------------------- /assets/maps/level2.json: -------------------------------------------------------------------------------- 1 | { "height":38, 2 | "infinite":false, 3 | "layers":[ 4 | { 5 | "data":"UQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAAAfAAAAFAAAABQAAAAUAAAAIQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAB8AAAAUAAAAFAAAABQAAAAhAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAHwAAABQAAAAUAAAAFAAAACEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAAAfAAAAFAAAABQAAAAUAAAAIQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAB8AAAAUAAAAFAAAABQAAAAhAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAHwAAABQAAAAUAAAAFAAAACEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAAAfAAAAFAAAABQAAAAUAAAAIQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAB8AAAAUAAAAFAAAABQAAAAhAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAHwAAABQAAAAUAAAAFAAAACEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAAAVAAAAFgAAABYAAAAWAAAAFgAAABYAAAAjAAAAFAAAABQAAAAUAAAAIgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFwAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAB8AAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAAAhAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAHwAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAACEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAAAfAAAAUgAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAABSAAAAIQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAB8AAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAAAhAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAHwAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAACEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAAAfAAAAUgAAAFIAAAAQAAAAEAAAABAAAAAQAAAAUgAAAFIAAABSAAAAEAAAABAAAAAQAAAAEAAAAFIAAABSAAAAIQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAB8AAABSAAAAUgAAABAAAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAAAQAAAAUgAAAFIAAAAhAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAHwAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAACEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAAAfAAAAUgAAAFIAAABSAAAAUgAAABAAAABSAAAAUgAAABAAAABSAAAAUgAAABAAAABSAAAAUgAAAFIAAABSAAAAIQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAACMAAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAAAiAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAAB4AAAAeAAAAHgAAAB4AAAAeAAAAHgAAAB4AAAAeAAAAHgAAAB4AAAAeAAAAHgAAAB4AAAAeAAAAHgAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAABsAAAAbAAAAGwAAABsAAAAbAAAAGwAAABsAAAAbAAAAGwAAABsAAAAbAAAAGwAAABsAAAAbAAAAGwAAABsAAAAbAAAAGwAAABsAAAAbAAAAHgAAAB4AAAAeAAAAHgAAAB4AAAAeAAAAHgAAAB4AAAAeAAAAHgAAAB4AAAAeAAAAHgAAAB4AAAAeAAAAUgAAAFIAAABSAAAAUgAAABAAAABSAAAAUgAAAFIAAABSAAAAUgAAABAAAABSAAAAUgAAAFIAAABSAAAAGwAAABsAAAAbAAAAGwAAABsAAAAbAAAAGwAAABsAAAAbAAAAGwAAABsAAAAbAAAAGwAAABsAAAAbAAAAGwAAABsAAAAbAAAAGwAAABsAAAAeAAAAHgAAAB4AAAAeAAAAHgAAAB4AAAAeAAAAHgAAAB4AAAAeAAAAHgAAAB4AAAAeAAAAHgAAAB4AAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAAAbAAAAGwAAABsAAAAbAAAAGwAAABsAAAAbAAAAGwAAABsAAAAbAAAAGwAAABsAAAAbAAAAGwAAABsAAAAbAAAAGwAAABsAAAAbAAAAGwAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAGQAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAABgAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAAAfAAAAUgAAAFIAAABSAAAAUgAAABAAAABSAAAAUgAAABAAAABSAAAAUgAAABAAAABSAAAAUgAAAFIAAABSAAAAIQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAB8AAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAAAhAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAHwAAAFIAAABSAAAAEAAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAABAAAABSAAAAUgAAACEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAAAfAAAAUgAAAFIAAAAQAAAAEAAAABAAAAAQAAAAUgAAAFIAAABSAAAAEAAAABAAAAAQAAAAEAAAAFIAAABSAAAAIQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAB8AAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAAAhAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAHwAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAACEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAAAfAAAAUgAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAABSAAAAIQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAB8AAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAABSAAAAUgAAAFIAAAAhAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAKQAAABYAAAAWAAAAFgAAABYAAAAWAAAAFwAAABoAAAAaAAAAGgAAABUAAAAWAAAAFgAAABYAAAAWAAAAFgAAACsAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAAAhAAAAGgAAABoAAAAaAAAAHwAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAACEAAAAaAAAAGgAAABoAAAAfAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAIQAAABoAAAAaAAAAGgAAAB8AAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAAAhAAAAGgAAABoAAAAaAAAAHwAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAACEAAAAaAAAAGgAAABoAAAAfAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAFEAAABRAAAAUQAAAA==", 6 | "encoding":"base64", 7 | "height":38, 8 | "name":"tileLayer", 9 | "opacity":1, 10 | "type":"tilelayer", 11 | "visible":true, 12 | "width":50, 13 | "x":0, 14 | "y":0 15 | }, 16 | { 17 | "draworder":"topdown", 18 | "name":"objects", 19 | "objects":[ 20 | { 21 | "gid":92, 22 | "height":16, 23 | "id":1, 24 | "name":"spawnUp", 25 | "rotation":0, 26 | "type":"spawn", 27 | "visible":true, 28 | "width":16, 29 | "x":352, 30 | "y":16 31 | }, 32 | { 33 | "gid":92, 34 | "height":16, 35 | "id":6, 36 | "name":"spawnRight", 37 | "rotation":0, 38 | "type":"spawn", 39 | "visible":true, 40 | "width":16, 41 | "x":784, 42 | "y":352 43 | }, 44 | { 45 | "gid":92, 46 | "height":16, 47 | "id":7, 48 | "name":"spawnDown", 49 | "rotation":0, 50 | "type":"spawn", 51 | "visible":true, 52 | "width":16, 53 | "x":352, 54 | "y":608 55 | }, 56 | { 57 | "gid":92, 58 | "height":16, 59 | "id":8, 60 | "name":"spawnLeft", 61 | "rotation":0, 62 | "type":"spawn", 63 | "visible":true, 64 | "width":16, 65 | "x":0, 66 | "y":352 67 | }, 68 | { 69 | "gid":107, 70 | "height":16, 71 | "id":28, 72 | "name":"", 73 | "rotation":0, 74 | "type":"demon", 75 | "visible":true, 76 | "width":16, 77 | "x":352, 78 | "y":352 79 | }, 80 | { 81 | "gid":100, 82 | "height":16, 83 | "id":29, 84 | "name":"", 85 | "rotation":0, 86 | "type":"", 87 | "visible":true, 88 | "width":16, 89 | "x":272, 90 | "y":512 91 | }, 92 | { 93 | "gid":100, 94 | "height":16, 95 | "id":30, 96 | "name":"", 97 | "rotation":0, 98 | "type":"enemy", 99 | "visible":true, 100 | "width":16, 101 | "x":432, 102 | "y":512 103 | }, 104 | { 105 | "gid":100, 106 | "height":16, 107 | "id":31, 108 | "name":"", 109 | "rotation":0, 110 | "type":"enemy", 111 | "visible":true, 112 | "width":16, 113 | "x":272, 114 | "y":512 115 | }, 116 | { 117 | "gid":104, 118 | "height":16, 119 | "id":33, 120 | "name":"", 121 | "rotation":0, 122 | "type":"potion", 123 | "visible":true, 124 | "width":16, 125 | "x":352, 126 | "y":288 127 | }, 128 | { 129 | "gid":104, 130 | "height":16, 131 | "id":34, 132 | "name":"", 133 | "rotation":0, 134 | "type":"potion", 135 | "visible":true, 136 | "width":16, 137 | "x":416, 138 | "y":352 139 | }, 140 | { 141 | "gid":104, 142 | "height":16, 143 | "id":35, 144 | "name":"", 145 | "rotation":0, 146 | "type":"potion", 147 | "visible":true, 148 | "width":16, 149 | "x":288, 150 | "y":352 151 | }, 152 | { 153 | "gid":104, 154 | "height":16, 155 | "id":36, 156 | "name":"", 157 | "rotation":0, 158 | "type":"potion", 159 | "visible":true, 160 | "width":16, 161 | "x":352, 162 | "y":416 163 | }, 164 | { 165 | "gid":104, 166 | "height":16, 167 | "id":37, 168 | "name":"", 169 | "rotation":0, 170 | "type":"potion", 171 | "visible":true, 172 | "width":16, 173 | "x":464, 174 | "y":176 175 | }, 176 | { 177 | "gid":104, 178 | "height":16, 179 | "id":38, 180 | "name":"", 181 | "rotation":0, 182 | "type":"potion", 183 | "visible":true, 184 | "width":16, 185 | "x":240, 186 | "y":176 187 | }, 188 | { 189 | "gid":108, 190 | "height":16, 191 | "id":39, 192 | "name":"", 193 | "rotation":0, 194 | "type":"slime", 195 | "visible":true, 196 | "width":16, 197 | "x":352, 198 | "y":208 199 | }, 200 | { 201 | "gid":108, 202 | "height":16, 203 | "id":40, 204 | "name":"", 205 | "rotation":0, 206 | "type":"slime", 207 | "visible":true, 208 | "width":16, 209 | "x":448, 210 | "y":176 211 | }, 212 | { 213 | "gid":108, 214 | "height":16, 215 | "id":41, 216 | "name":"", 217 | "rotation":0, 218 | "type":"slime", 219 | "visible":true, 220 | "width":16, 221 | "x":256, 222 | "y":176 223 | }, 224 | { 225 | "gid":105, 226 | "height":16, 227 | "id":42, 228 | "name":"", 229 | "rotation":0, 230 | "type":"meat", 231 | "visible":true, 232 | "width":16, 233 | "x":352, 234 | "y":256 235 | }, 236 | { 237 | "gid":106, 238 | "height":16, 239 | "id":44, 240 | "name":"", 241 | "rotation":0, 242 | "type":"jug", 243 | "visible":true, 244 | "width":16, 245 | "x":368, 246 | "y":352 247 | }, 248 | { 249 | "gid":105, 250 | "height":16, 251 | "id":45, 252 | "name":"", 253 | "rotation":0, 254 | "type":"meat", 255 | "visible":true, 256 | "width":16, 257 | "x":416, 258 | "y":432 259 | }, 260 | { 261 | "gid":102, 262 | "height":16, 263 | "id":48, 264 | "name":"", 265 | "rotation":0, 266 | "type":"coins", 267 | "visible":true, 268 | "width":16, 269 | "x":416, 270 | "y":272 271 | }, 272 | { 273 | "gid":102, 274 | "height":16, 275 | "id":49, 276 | "name":"", 277 | "rotation":0, 278 | "type":"coins", 279 | "visible":true, 280 | "width":16, 281 | "x":288, 282 | "y":272 283 | }, 284 | { 285 | "gid":102, 286 | "height":16, 287 | "id":50, 288 | "name":"", 289 | "rotation":0, 290 | "type":"coins", 291 | "visible":true, 292 | "width":16, 293 | "x":288, 294 | "y":432 295 | }, 296 | { 297 | "gid":102, 298 | "height":16, 299 | "id":51, 300 | "name":"", 301 | "rotation":0, 302 | "type":"coins", 303 | "visible":true, 304 | "width":16, 305 | "x":240, 306 | "y":512 307 | }, 308 | { 309 | "gid":102, 310 | "height":16, 311 | "id":52, 312 | "name":"", 313 | "rotation":0, 314 | "type":"coins", 315 | "visible":true, 316 | "width":16, 317 | "x":464, 318 | "y":512 319 | }, 320 | { 321 | "gid":102, 322 | "height":16, 323 | "id":53, 324 | "name":"", 325 | "rotation":0, 326 | "type":"coins", 327 | "visible":true, 328 | "width":16, 329 | "x":240, 330 | "y":352 331 | }, 332 | { 333 | "gid":102, 334 | "height":16, 335 | "id":54, 336 | "name":"", 337 | "rotation":0, 338 | "type":"coins", 339 | "visible":true, 340 | "width":16, 341 | "x":464, 342 | "y":352 343 | }, 344 | { 345 | "gid":102, 346 | "height":16, 347 | "id":55, 348 | "name":"", 349 | "rotation":0, 350 | "type":"coins", 351 | "visible":true, 352 | "width":16, 353 | "x":352, 354 | "y":448 355 | }, 356 | { 357 | "gid":102, 358 | "height":16, 359 | "id":56, 360 | "name":"", 361 | "rotation":0, 362 | "type":"coins", 363 | "visible":true, 364 | "width":16, 365 | "x":352, 366 | "y":512 367 | }, 368 | { 369 | "gid":102, 370 | "height":16, 371 | "id":57, 372 | "name":"", 373 | "rotation":0, 374 | "type":"coins", 375 | "visible":true, 376 | "width":16, 377 | "x":352, 378 | "y":160 379 | }], 380 | "opacity":1, 381 | "type":"objectgroup", 382 | "visible":true, 383 | "x":0, 384 | "y":0 385 | }], 386 | "nextobjectid":58, 387 | "orientation":"orthogonal", 388 | "properties": 389 | { 390 | "loadDown":"Level4", 391 | "loadLeft":"Level5", 392 | "loadRight":"Level3", 393 | "loadUp":"Level1", 394 | "spawnDown":"spawnUp", 395 | "spawnLeft":"spawnRight", 396 | "spawnRight":"spawnLeft", 397 | "spawnUp":"spawnDown" 398 | }, 399 | "propertytypes": 400 | { 401 | "loadDown":"string", 402 | "loadLeft":"string", 403 | "loadRight":"string", 404 | "loadUp":"string", 405 | "spawnDown":"string", 406 | "spawnLeft":"string", 407 | "spawnRight":"string", 408 | "spawnUp":"string" 409 | }, 410 | "renderorder":"right-down", 411 | "tiledversion":"1.1.5", 412 | "tileheight":16, 413 | "tilesets":[ 414 | { 415 | "columns":10, 416 | "firstgid":1, 417 | "image":"..\/tiles\/tiles.png", 418 | "imageheight":162, 419 | "imagewidth":180, 420 | "margin":1, 421 | "name":"tiles", 422 | "spacing":2, 423 | "tilecount":90, 424 | "tileheight":16, 425 | "tileproperties": 426 | { 427 | "0": 428 | { 429 | "collide":false 430 | }, 431 | "1": 432 | { 433 | "collide":false 434 | }, 435 | "10": 436 | { 437 | "collide":false 438 | }, 439 | "11": 440 | { 441 | "collide":false 442 | }, 443 | "12": 444 | { 445 | "collide":false 446 | }, 447 | "13": 448 | { 449 | "collide":false 450 | }, 451 | "14": 452 | { 453 | "collide":false 454 | }, 455 | "15": 456 | { 457 | "collide":true 458 | }, 459 | "16": 460 | { 461 | "collide":false 462 | }, 463 | "17": 464 | { 465 | "collide":false 466 | }, 467 | "18": 468 | { 469 | "collide":false 470 | }, 471 | "19": 472 | { 473 | "collide":false 474 | }, 475 | "2": 476 | { 477 | "collide":false 478 | }, 479 | "20": 480 | { 481 | "collide":true 482 | }, 483 | "21": 484 | { 485 | "collide":true 486 | }, 487 | "22": 488 | { 489 | "collide":true 490 | }, 491 | "23": 492 | { 493 | "collide":true 494 | }, 495 | "24": 496 | { 497 | "collide":true 498 | }, 499 | "25": 500 | { 501 | "collide":false 502 | }, 503 | "26": 504 | { 505 | "collide":false 506 | }, 507 | "27": 508 | { 509 | "collide":false 510 | }, 511 | "28": 512 | { 513 | "collide":false 514 | }, 515 | "29": 516 | { 517 | "collide":false 518 | }, 519 | "3": 520 | { 521 | "collide":false 522 | }, 523 | "30": 524 | { 525 | "collide":true 526 | }, 527 | "31": 528 | { 529 | "collide":false 530 | }, 531 | "32": 532 | { 533 | "collide":true 534 | }, 535 | "33": 536 | { 537 | "collide":true 538 | }, 539 | "34": 540 | { 541 | "collide":true 542 | }, 543 | "35": 544 | { 545 | "collide":false 546 | }, 547 | "36": 548 | { 549 | "collide":false 550 | }, 551 | "37": 552 | { 553 | "collide":false 554 | }, 555 | "38": 556 | { 557 | "collide":false 558 | }, 559 | "39": 560 | { 561 | "collide":false 562 | }, 563 | "4": 564 | { 565 | "collide":false 566 | }, 567 | "40": 568 | { 569 | "collide":true 570 | }, 571 | "41": 572 | { 573 | "collide":true 574 | }, 575 | "42": 576 | { 577 | "collide":true 578 | }, 579 | "43": 580 | { 581 | "collide":false 582 | }, 583 | "44": 584 | { 585 | "collide":false 586 | }, 587 | "45": 588 | { 589 | "collide":false 590 | }, 591 | "46": 592 | { 593 | "collide":false 594 | }, 595 | "47": 596 | { 597 | "collide":false 598 | }, 599 | "48": 600 | { 601 | "collide":false 602 | }, 603 | "49": 604 | { 605 | "collide":false 606 | }, 607 | "5": 608 | { 609 | "collide":false 610 | }, 611 | "50": 612 | { 613 | "collide":false 614 | }, 615 | "51": 616 | { 617 | "collide":false 618 | }, 619 | "52": 620 | { 621 | "collide":false 622 | }, 623 | "53": 624 | { 625 | "collide":false 626 | }, 627 | "54": 628 | { 629 | "collide":false 630 | }, 631 | "55": 632 | { 633 | "collide":false 634 | }, 635 | "56": 636 | { 637 | "collide":false 638 | }, 639 | "57": 640 | { 641 | "collide":false 642 | }, 643 | "58": 644 | { 645 | "collide":false 646 | }, 647 | "59": 648 | { 649 | "collide":false 650 | }, 651 | "6": 652 | { 653 | "collide":false 654 | }, 655 | "60": 656 | { 657 | "collide":false 658 | }, 659 | "61": 660 | { 661 | "collide":false 662 | }, 663 | "62": 664 | { 665 | "collide":false 666 | }, 667 | "63": 668 | { 669 | "collide":false 670 | }, 671 | "64": 672 | { 673 | "collide":false 674 | }, 675 | "65": 676 | { 677 | "collide":false 678 | }, 679 | "66": 680 | { 681 | "collide":false 682 | }, 683 | "67": 684 | { 685 | "collide":false 686 | }, 687 | "68": 688 | { 689 | "collide":false 690 | }, 691 | "69": 692 | { 693 | "collide":false 694 | }, 695 | "7": 696 | { 697 | "collide":false 698 | }, 699 | "70": 700 | { 701 | "collide":false 702 | }, 703 | "71": 704 | { 705 | "collide":false 706 | }, 707 | "72": 708 | { 709 | "collide":false 710 | }, 711 | "73": 712 | { 713 | "collide":false 714 | }, 715 | "74": 716 | { 717 | "collide":false 718 | }, 719 | "75": 720 | { 721 | "collide":false 722 | }, 723 | "76": 724 | { 725 | "collide":false 726 | }, 727 | "77": 728 | { 729 | "collide":false 730 | }, 731 | "78": 732 | { 733 | "collide":false 734 | }, 735 | "79": 736 | { 737 | "collide":false 738 | }, 739 | "8": 740 | { 741 | "collide":false 742 | }, 743 | "9": 744 | { 745 | "collide":false 746 | } 747 | }, 748 | "tilepropertytypes": 749 | { 750 | "0": 751 | { 752 | "collide":"bool" 753 | }, 754 | "1": 755 | { 756 | "collide":"bool" 757 | }, 758 | "10": 759 | { 760 | "collide":"bool" 761 | }, 762 | "11": 763 | { 764 | "collide":"bool" 765 | }, 766 | "12": 767 | { 768 | "collide":"bool" 769 | }, 770 | "13": 771 | { 772 | "collide":"bool" 773 | }, 774 | "14": 775 | { 776 | "collide":"bool" 777 | }, 778 | "15": 779 | { 780 | "collide":"bool" 781 | }, 782 | "16": 783 | { 784 | "collide":"bool" 785 | }, 786 | "17": 787 | { 788 | "collide":"bool" 789 | }, 790 | "18": 791 | { 792 | "collide":"bool" 793 | }, 794 | "19": 795 | { 796 | "collide":"bool" 797 | }, 798 | "2": 799 | { 800 | "collide":"bool" 801 | }, 802 | "20": 803 | { 804 | "collide":"bool" 805 | }, 806 | "21": 807 | { 808 | "collide":"bool" 809 | }, 810 | "22": 811 | { 812 | "collide":"bool" 813 | }, 814 | "23": 815 | { 816 | "collide":"bool" 817 | }, 818 | "24": 819 | { 820 | "collide":"bool" 821 | }, 822 | "25": 823 | { 824 | "collide":"bool" 825 | }, 826 | "26": 827 | { 828 | "collide":"bool" 829 | }, 830 | "27": 831 | { 832 | "collide":"bool" 833 | }, 834 | "28": 835 | { 836 | "collide":"bool" 837 | }, 838 | "29": 839 | { 840 | "collide":"bool" 841 | }, 842 | "3": 843 | { 844 | "collide":"bool" 845 | }, 846 | "30": 847 | { 848 | "collide":"bool" 849 | }, 850 | "31": 851 | { 852 | "collide":"bool" 853 | }, 854 | "32": 855 | { 856 | "collide":"bool" 857 | }, 858 | "33": 859 | { 860 | "collide":"bool" 861 | }, 862 | "34": 863 | { 864 | "collide":"bool" 865 | }, 866 | "35": 867 | { 868 | "collide":"bool" 869 | }, 870 | "36": 871 | { 872 | "collide":"bool" 873 | }, 874 | "37": 875 | { 876 | "collide":"bool" 877 | }, 878 | "38": 879 | { 880 | "collide":"bool" 881 | }, 882 | "39": 883 | { 884 | "collide":"bool" 885 | }, 886 | "4": 887 | { 888 | "collide":"bool" 889 | }, 890 | "40": 891 | { 892 | "collide":"bool" 893 | }, 894 | "41": 895 | { 896 | "collide":"bool" 897 | }, 898 | "42": 899 | { 900 | "collide":"bool" 901 | }, 902 | "43": 903 | { 904 | "collide":"bool" 905 | }, 906 | "44": 907 | { 908 | "collide":"bool" 909 | }, 910 | "45": 911 | { 912 | "collide":"bool" 913 | }, 914 | "46": 915 | { 916 | "collide":"bool" 917 | }, 918 | "47": 919 | { 920 | "collide":"bool" 921 | }, 922 | "48": 923 | { 924 | "collide":"bool" 925 | }, 926 | "49": 927 | { 928 | "collide":"bool" 929 | }, 930 | "5": 931 | { 932 | "collide":"bool" 933 | }, 934 | "50": 935 | { 936 | "collide":"bool" 937 | }, 938 | "51": 939 | { 940 | "collide":"bool" 941 | }, 942 | "52": 943 | { 944 | "collide":"bool" 945 | }, 946 | "53": 947 | { 948 | "collide":"bool" 949 | }, 950 | "54": 951 | { 952 | "collide":"bool" 953 | }, 954 | "55": 955 | { 956 | "collide":"bool" 957 | }, 958 | "56": 959 | { 960 | "collide":"bool" 961 | }, 962 | "57": 963 | { 964 | "collide":"bool" 965 | }, 966 | "58": 967 | { 968 | "collide":"bool" 969 | }, 970 | "59": 971 | { 972 | "collide":"bool" 973 | }, 974 | "6": 975 | { 976 | "collide":"bool" 977 | }, 978 | "60": 979 | { 980 | "collide":"bool" 981 | }, 982 | "61": 983 | { 984 | "collide":"bool" 985 | }, 986 | "62": 987 | { 988 | "collide":"bool" 989 | }, 990 | "63": 991 | { 992 | "collide":"bool" 993 | }, 994 | "64": 995 | { 996 | "collide":"bool" 997 | }, 998 | "65": 999 | { 1000 | "collide":"bool" 1001 | }, 1002 | "66": 1003 | { 1004 | "collide":"bool" 1005 | }, 1006 | "67": 1007 | { 1008 | "collide":"bool" 1009 | }, 1010 | "68": 1011 | { 1012 | "collide":"bool" 1013 | }, 1014 | "69": 1015 | { 1016 | "collide":"bool" 1017 | }, 1018 | "7": 1019 | { 1020 | "collide":"bool" 1021 | }, 1022 | "70": 1023 | { 1024 | "collide":"bool" 1025 | }, 1026 | "71": 1027 | { 1028 | "collide":"bool" 1029 | }, 1030 | "72": 1031 | { 1032 | "collide":"bool" 1033 | }, 1034 | "73": 1035 | { 1036 | "collide":"bool" 1037 | }, 1038 | "74": 1039 | { 1040 | "collide":"bool" 1041 | }, 1042 | "75": 1043 | { 1044 | "collide":"bool" 1045 | }, 1046 | "76": 1047 | { 1048 | "collide":"bool" 1049 | }, 1050 | "77": 1051 | { 1052 | "collide":"bool" 1053 | }, 1054 | "78": 1055 | { 1056 | "collide":"bool" 1057 | }, 1058 | "79": 1059 | { 1060 | "collide":"bool" 1061 | }, 1062 | "8": 1063 | { 1064 | "collide":"bool" 1065 | }, 1066 | "9": 1067 | { 1068 | "collide":"bool" 1069 | } 1070 | }, 1071 | "tilewidth":16 1072 | }, 1073 | { 1074 | "columns":0, 1075 | "firstgid":91, 1076 | "grid": 1077 | { 1078 | "height":1, 1079 | "orientation":"orthogonal", 1080 | "width":1 1081 | }, 1082 | "margin":0, 1083 | "name":"objects", 1084 | "spacing":0, 1085 | "tilecount":9, 1086 | "tileheight":16, 1087 | "tiles": 1088 | { 1089 | "0": 1090 | { 1091 | "image":"..\/..\/design\/sprites\/enemy.png", 1092 | "imageheight":16, 1093 | "imagewidth":16, 1094 | "type":"enemy" 1095 | }, 1096 | "1": 1097 | { 1098 | "image":"..\/..\/design\/sprites\/player.png", 1099 | "imageheight":16, 1100 | "imagewidth":16, 1101 | "type":"spawn" 1102 | }, 1103 | "2": 1104 | { 1105 | "image":"..\/..\/design\/sprites\/coins.png", 1106 | "imageheight":16, 1107 | "imagewidth":16, 1108 | "type":"coins" 1109 | }, 1110 | "3": 1111 | { 1112 | "image":"..\/..\/design\/sprites\/slime.png", 1113 | "imageheight":14, 1114 | "imagewidth":14, 1115 | "type":"slime" 1116 | }, 1117 | "4": 1118 | { 1119 | "image":"..\/..\/design\/sprites\/potion.png", 1120 | "imageheight":16, 1121 | "imagewidth":16, 1122 | "type":"potion" 1123 | }, 1124 | "5": 1125 | { 1126 | "image":"..\/..\/design\/sprites\/meat.png", 1127 | "imageheight":16, 1128 | "imagewidth":16, 1129 | "type":"meat" 1130 | }, 1131 | "6": 1132 | { 1133 | "image":"..\/..\/design\/sprites\/demon.png", 1134 | "imageheight":16, 1135 | "imagewidth":16, 1136 | "type":"demon" 1137 | }, 1138 | "7": 1139 | { 1140 | "image":"..\/..\/design\/sprites\/jug.png", 1141 | "imageheight":16, 1142 | "imagewidth":16, 1143 | "type":"jug" 1144 | }, 1145 | "8": 1146 | { 1147 | "image":"..\/..\/design\/sprites\/heart.png", 1148 | "imageheight":16, 1149 | "imagewidth":16, 1150 | "type":"heart" 1151 | } 1152 | }, 1153 | "tilewidth":16 1154 | }, 1155 | { 1156 | "columns":0, 1157 | "firstgid":100, 1158 | "grid": 1159 | { 1160 | "height":1, 1161 | "orientation":"orthogonal", 1162 | "width":1 1163 | }, 1164 | "margin":0, 1165 | "name":"objects", 1166 | "spacing":0, 1167 | "tilecount":9, 1168 | "tileheight":16, 1169 | "tiles": 1170 | { 1171 | "0": 1172 | { 1173 | "image":"..\/..\/design\/sprites\/enemy.png", 1174 | "imageheight":16, 1175 | "imagewidth":16, 1176 | "type":"enemy" 1177 | }, 1178 | "1": 1179 | { 1180 | "image":"..\/..\/design\/sprites\/player.png", 1181 | "imageheight":16, 1182 | "imagewidth":16, 1183 | "type":"spawn" 1184 | }, 1185 | "2": 1186 | { 1187 | "image":"..\/..\/design\/sprites\/coins.png", 1188 | "imageheight":16, 1189 | "imagewidth":16, 1190 | "type":"coins" 1191 | }, 1192 | "3": 1193 | { 1194 | "image":"..\/..\/design\/sprites\/heart.png", 1195 | "imageheight":16, 1196 | "imagewidth":16, 1197 | "type":"heart" 1198 | }, 1199 | "4": 1200 | { 1201 | "image":"..\/..\/design\/sprites\/potion.png", 1202 | "imageheight":16, 1203 | "imagewidth":16, 1204 | "type":"potion" 1205 | }, 1206 | "5": 1207 | { 1208 | "image":"..\/..\/design\/sprites\/meat.png", 1209 | "imageheight":16, 1210 | "imagewidth":16, 1211 | "type":"meat" 1212 | }, 1213 | "6": 1214 | { 1215 | "image":"..\/..\/design\/sprites\/jug.png", 1216 | "imageheight":16, 1217 | "imagewidth":16, 1218 | "type":"jug" 1219 | }, 1220 | "7": 1221 | { 1222 | "image":"..\/..\/design\/sprites\/demon.png", 1223 | "imageheight":16, 1224 | "imagewidth":16, 1225 | "type":"demon" 1226 | }, 1227 | "8": 1228 | { 1229 | "image":"..\/..\/design\/sprites\/slime.png", 1230 | "imageheight":16, 1231 | "imagewidth":16, 1232 | "type":"slime" 1233 | } 1234 | }, 1235 | "tilewidth":16 1236 | }], 1237 | "tilewidth":16, 1238 | "type":"map", 1239 | "version":1, 1240 | "width":50 1241 | } -------------------------------------------------------------------------------- /assets/minecraft.fnt: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | -------------------------------------------------------------------------------- /assets/music/03-Whydothenationsrage.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/B3L7/phaser3-tilemap-pack/365d09d2b8f7c9160346c23591eff25056e0914b/assets/music/03-Whydothenationsrage.mp3 -------------------------------------------------------------------------------- /assets/music/06-RebelsBe.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/B3L7/phaser3-tilemap-pack/365d09d2b8f7c9160346c23591eff25056e0914b/assets/music/06-RebelsBe.mp3 -------------------------------------------------------------------------------- /assets/music/13Danger.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/B3L7/phaser3-tilemap-pack/365d09d2b8f7c9160346c23591eff25056e0914b/assets/music/13Danger.mp3 -------------------------------------------------------------------------------- /assets/music/14-BarbarianKing.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/B3L7/phaser3-tilemap-pack/365d09d2b8f7c9160346c23591eff25056e0914b/assets/music/14-BarbarianKing.mp3 -------------------------------------------------------------------------------- /assets/music/15-Dungeon.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/B3L7/phaser3-tilemap-pack/365d09d2b8f7c9160346c23591eff25056e0914b/assets/music/15-Dungeon.mp3 -------------------------------------------------------------------------------- /assets/music/20-GameOver.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/B3L7/phaser3-tilemap-pack/365d09d2b8f7c9160346c23591eff25056e0914b/assets/music/20-GameOver.mp3 -------------------------------------------------------------------------------- /assets/music/25-Finale.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/B3L7/phaser3-tilemap-pack/365d09d2b8f7c9160346c23591eff25056e0914b/assets/music/25-Finale.mp3 -------------------------------------------------------------------------------- /assets/pack.json: -------------------------------------------------------------------------------- 1 | { 2 | "z": { 3 | "files": [ 4 | { 5 | "type": "atlas", 6 | "key": "atlas", 7 | "textureURL": "assets/atlas.png", 8 | "atlasURL": "assets/atlas.json" 9 | }, 10 | { 11 | "type": "xml", 12 | "key": "minecraftXML", 13 | "url": "assets/minecraft.fnt" 14 | }, 15 | { 16 | "type": "image", 17 | "key": "tiles", 18 | "url": "assets/tiles/tiles.png" 19 | }, 20 | { 21 | "type": "audio", 22 | "key": "fanfareSFX", 23 | "url": "assets/sfx/sfx_sounds_fanfare3.wav" 24 | }, 25 | { 26 | "type": "audio", 27 | "key": "coinSFX", 28 | "url": "assets/sfx/sfx_coin_double2.wav" 29 | }, 30 | { 31 | "type": "audio", 32 | "key": "meatSFX", 33 | "url": "assets/sfx/sfx_sounds_interaction1.wav" 34 | }, 35 | { 36 | "type": "audio", 37 | "key": "potionSFX", 38 | "url": "assets/sfx/sfx_sounds_interaction12.wav" 39 | }, 40 | { 41 | "type": "audio", 42 | "key": "jugSFX", 43 | "url": "assets/sfx/sfx_sounds_powerup2.wav" 44 | }, 45 | { 46 | "type": "audio", 47 | "key": "heartSFX", 48 | "url": "assets/sfx/sfx_sounds_powerup6.wav" 49 | }, 50 | { 51 | "type": "audio", 52 | "key": "itemDropSFX", 53 | "url": "assets/sfx/sfx_sounds_interaction14.wav" 54 | }, 55 | { 56 | "type": "audio", 57 | "key": "enemyDeathSFX", 58 | "url": "assets/sfx/sfx_deathscream_alien3.wav" 59 | }, 60 | { 61 | "type": "audio", 62 | "key": "demonDeathSFX", 63 | "url": "assets/sfx/sfx_deathscream_alien1.wav" 64 | }, 65 | { 66 | "type": "audio", 67 | "key": "slimeDeathSFX", 68 | "url": "assets/sfx/sfx_deathscream_alien6.wav" 69 | }, 70 | { 71 | "type": "audio", 72 | "key": "enemyExclaim", 73 | "url": "assets/sfx/sfx_sounds_high2.wav" 74 | }, 75 | { 76 | "type": "audio", 77 | "key": "demonExclaim", 78 | "url": "assets/sfx/sfx_alarm_loop8.wav" 79 | }, 80 | { 81 | "type": "audio", 82 | "key": "playerDamageSFX", 83 | "url": "assets/sfx/sfx_sounds_damage1.wav" 84 | }, 85 | { 86 | "type": "audio", 87 | "key": "playerDeathSFX", 88 | "url": "assets/sfx/sfx_deathscream_human3.wav" 89 | }, 90 | { 91 | "type": "audio", 92 | "key": "lowHealthSFX", 93 | "url": "assets/sfx/sfx_lowhealth_alarmloop7.wav" 94 | }, 95 | { 96 | "type": "audio", 97 | "key": "fireballSFX", 98 | "url": "assets/sfx/sfx_wpn_laser9.wav" 99 | }, 100 | { 101 | "type": "audio", 102 | "key": "outOfMagicSFX", 103 | "url": "assets/sfx/sfx_sounds_error10.wav" 104 | }, 105 | { 106 | "type": "audio", 107 | "key": "fireballWallSFX", 108 | "url": "assets/sfx/sfx_exp_short_soft11.wav" 109 | }, 110 | { 111 | "type": "audio", 112 | "key": "fireballEnemySFX", 113 | "url": "assets/sfx/sfx_exp_short_hard14.wav" 114 | }, 115 | { 116 | "type": "tilemapTiledJSON", 117 | "key": "Level1Map", 118 | "url": "assets/maps/level1.json" 119 | }, 120 | { 121 | "type": "audio", 122 | "key": "Level1Music", 123 | "url": "assets/music/14-BarbarianKing.mp3" 124 | }, 125 | { 126 | "type": "tilemapTiledJSON", 127 | "key": "Level2Map", 128 | "url": "assets/maps/level2.json" 129 | }, 130 | { 131 | "type": "audio", 132 | "key": "Level2Music", 133 | "url": "assets/music/15-Dungeon.mp3" 134 | }, 135 | { 136 | "type": "tilemapTiledJSON", 137 | "key": "Level3Map", 138 | "url": "assets/maps/level3.json" 139 | }, 140 | { 141 | "type": "audio", 142 | "key": "Level3Music", 143 | "url": "assets/music/06-RebelsBe.mp3" 144 | }, 145 | { 146 | "type": "tilemapTiledJSON", 147 | "key": "Level4Map", 148 | "url": "assets/maps/level4.json" 149 | }, 150 | { 151 | "type": "audio", 152 | "key": "Level4Music", 153 | "url": "assets/music/03-Whydothenationsrage.mp3" 154 | }, 155 | { 156 | "type": "tilemapTiledJSON", 157 | "key": "Level5Map", 158 | "url": "assets/maps/level5.json" 159 | }, 160 | { 161 | "type": "audio", 162 | "key": "Level5Music", 163 | "url": "assets/music/13Danger.mp3" 164 | }, 165 | { 166 | "type": "audio", 167 | "key": "overMusic", 168 | "url": "assets/music/20-GameOver.mp3" 169 | }, 170 | { 171 | "type": "audio", 172 | "key": "winMusic", 173 | "url": "assets/music/25-Finale.mp3" 174 | } 175 | 176 | ] 177 | }, 178 | "meta": { 179 | "game": "Phaser3 Tilemap Asset-pack Example", 180 | "author": "B3L7", 181 | "URL": "https://github.com/B3L7/phaser3-tilemap-pack" 182 | } 183 | } 184 | -------------------------------------------------------------------------------- /assets/sfx/sfx_alarm_loop8.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/B3L7/phaser3-tilemap-pack/365d09d2b8f7c9160346c23591eff25056e0914b/assets/sfx/sfx_alarm_loop8.wav -------------------------------------------------------------------------------- /assets/sfx/sfx_coin_double2.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/B3L7/phaser3-tilemap-pack/365d09d2b8f7c9160346c23591eff25056e0914b/assets/sfx/sfx_coin_double2.wav -------------------------------------------------------------------------------- /assets/sfx/sfx_deathscream_alien1.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/B3L7/phaser3-tilemap-pack/365d09d2b8f7c9160346c23591eff25056e0914b/assets/sfx/sfx_deathscream_alien1.wav -------------------------------------------------------------------------------- /assets/sfx/sfx_deathscream_alien3.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/B3L7/phaser3-tilemap-pack/365d09d2b8f7c9160346c23591eff25056e0914b/assets/sfx/sfx_deathscream_alien3.wav -------------------------------------------------------------------------------- /assets/sfx/sfx_deathscream_alien6.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/B3L7/phaser3-tilemap-pack/365d09d2b8f7c9160346c23591eff25056e0914b/assets/sfx/sfx_deathscream_alien6.wav -------------------------------------------------------------------------------- /assets/sfx/sfx_deathscream_human3.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/B3L7/phaser3-tilemap-pack/365d09d2b8f7c9160346c23591eff25056e0914b/assets/sfx/sfx_deathscream_human3.wav -------------------------------------------------------------------------------- /assets/sfx/sfx_exp_short_hard14.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/B3L7/phaser3-tilemap-pack/365d09d2b8f7c9160346c23591eff25056e0914b/assets/sfx/sfx_exp_short_hard14.wav -------------------------------------------------------------------------------- /assets/sfx/sfx_exp_short_soft11.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/B3L7/phaser3-tilemap-pack/365d09d2b8f7c9160346c23591eff25056e0914b/assets/sfx/sfx_exp_short_soft11.wav -------------------------------------------------------------------------------- /assets/sfx/sfx_lowhealth_alarmloop7.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/B3L7/phaser3-tilemap-pack/365d09d2b8f7c9160346c23591eff25056e0914b/assets/sfx/sfx_lowhealth_alarmloop7.wav -------------------------------------------------------------------------------- /assets/sfx/sfx_sounds_damage1.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/B3L7/phaser3-tilemap-pack/365d09d2b8f7c9160346c23591eff25056e0914b/assets/sfx/sfx_sounds_damage1.wav -------------------------------------------------------------------------------- /assets/sfx/sfx_sounds_error10.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/B3L7/phaser3-tilemap-pack/365d09d2b8f7c9160346c23591eff25056e0914b/assets/sfx/sfx_sounds_error10.wav -------------------------------------------------------------------------------- /assets/sfx/sfx_sounds_fanfare3.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/B3L7/phaser3-tilemap-pack/365d09d2b8f7c9160346c23591eff25056e0914b/assets/sfx/sfx_sounds_fanfare3.wav -------------------------------------------------------------------------------- /assets/sfx/sfx_sounds_high2.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/B3L7/phaser3-tilemap-pack/365d09d2b8f7c9160346c23591eff25056e0914b/assets/sfx/sfx_sounds_high2.wav -------------------------------------------------------------------------------- /assets/sfx/sfx_sounds_interaction1.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/B3L7/phaser3-tilemap-pack/365d09d2b8f7c9160346c23591eff25056e0914b/assets/sfx/sfx_sounds_interaction1.wav -------------------------------------------------------------------------------- /assets/sfx/sfx_sounds_interaction12.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/B3L7/phaser3-tilemap-pack/365d09d2b8f7c9160346c23591eff25056e0914b/assets/sfx/sfx_sounds_interaction12.wav -------------------------------------------------------------------------------- /assets/sfx/sfx_sounds_interaction14.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/B3L7/phaser3-tilemap-pack/365d09d2b8f7c9160346c23591eff25056e0914b/assets/sfx/sfx_sounds_interaction14.wav -------------------------------------------------------------------------------- /assets/sfx/sfx_sounds_interaction7.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/B3L7/phaser3-tilemap-pack/365d09d2b8f7c9160346c23591eff25056e0914b/assets/sfx/sfx_sounds_interaction7.wav -------------------------------------------------------------------------------- /assets/sfx/sfx_sounds_powerup2.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/B3L7/phaser3-tilemap-pack/365d09d2b8f7c9160346c23591eff25056e0914b/assets/sfx/sfx_sounds_powerup2.wav -------------------------------------------------------------------------------- /assets/sfx/sfx_sounds_powerup6.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/B3L7/phaser3-tilemap-pack/365d09d2b8f7c9160346c23591eff25056e0914b/assets/sfx/sfx_sounds_powerup6.wav -------------------------------------------------------------------------------- /assets/sfx/sfx_wpn_laser9.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/B3L7/phaser3-tilemap-pack/365d09d2b8f7c9160346c23591eff25056e0914b/assets/sfx/sfx_wpn_laser9.wav -------------------------------------------------------------------------------- /assets/tiles/tiles.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/B3L7/phaser3-tilemap-pack/365d09d2b8f7c9160346c23591eff25056e0914b/assets/tiles/tiles.png -------------------------------------------------------------------------------- /design/gameOver.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/B3L7/phaser3-tilemap-pack/365d09d2b8f7c9160346c23591eff25056e0914b/design/gameOver.png -------------------------------------------------------------------------------- /design/minecraft.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/B3L7/phaser3-tilemap-pack/365d09d2b8f7c9160346c23591eff25056e0914b/design/minecraft.png -------------------------------------------------------------------------------- /design/sprites/coins.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/B3L7/phaser3-tilemap-pack/365d09d2b8f7c9160346c23591eff25056e0914b/design/sprites/coins.png -------------------------------------------------------------------------------- /design/sprites/crosshair.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/B3L7/phaser3-tilemap-pack/365d09d2b8f7c9160346c23591eff25056e0914b/design/sprites/crosshair.png -------------------------------------------------------------------------------- /design/sprites/darkFireball.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/B3L7/phaser3-tilemap-pack/365d09d2b8f7c9160346c23591eff25056e0914b/design/sprites/darkFireball.png -------------------------------------------------------------------------------- /design/sprites/darkParticle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/B3L7/phaser3-tilemap-pack/365d09d2b8f7c9160346c23591eff25056e0914b/design/sprites/darkParticle.png -------------------------------------------------------------------------------- /design/sprites/demon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/B3L7/phaser3-tilemap-pack/365d09d2b8f7c9160346c23591eff25056e0914b/design/sprites/demon.png -------------------------------------------------------------------------------- /design/sprites/enemy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/B3L7/phaser3-tilemap-pack/365d09d2b8f7c9160346c23591eff25056e0914b/design/sprites/enemy.png -------------------------------------------------------------------------------- /design/sprites/exclamation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/B3L7/phaser3-tilemap-pack/365d09d2b8f7c9160346c23591eff25056e0914b/design/sprites/exclamation.png -------------------------------------------------------------------------------- /design/sprites/fireball.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/B3L7/phaser3-tilemap-pack/365d09d2b8f7c9160346c23591eff25056e0914b/design/sprites/fireball.png -------------------------------------------------------------------------------- /design/sprites/heart.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/B3L7/phaser3-tilemap-pack/365d09d2b8f7c9160346c23591eff25056e0914b/design/sprites/heart.png -------------------------------------------------------------------------------- /design/sprites/jug.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/B3L7/phaser3-tilemap-pack/365d09d2b8f7c9160346c23591eff25056e0914b/design/sprites/jug.png -------------------------------------------------------------------------------- /design/sprites/meat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/B3L7/phaser3-tilemap-pack/365d09d2b8f7c9160346c23591eff25056e0914b/design/sprites/meat.png -------------------------------------------------------------------------------- /design/sprites/player.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/B3L7/phaser3-tilemap-pack/365d09d2b8f7c9160346c23591eff25056e0914b/design/sprites/player.png -------------------------------------------------------------------------------- /design/sprites/potion.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/B3L7/phaser3-tilemap-pack/365d09d2b8f7c9160346c23591eff25056e0914b/design/sprites/potion.png -------------------------------------------------------------------------------- /design/sprites/slime.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/B3L7/phaser3-tilemap-pack/365d09d2b8f7c9160346c23591eff25056e0914b/design/sprites/slime.png -------------------------------------------------------------------------------- /design/sprites/whiteParticle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/B3L7/phaser3-tilemap-pack/365d09d2b8f7c9160346c23591eff25056e0914b/design/sprites/whiteParticle.png -------------------------------------------------------------------------------- /design/win.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/B3L7/phaser3-tilemap-pack/365d09d2b8f7c9160346c23591eff25056e0914b/design/win.png -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "phaser3-tilemap-pack", 3 | "version": "1.2.1", 4 | "description": "A Phaser 3 Tilemap & File Pack Template", 5 | "main": "src/index.js", 6 | "scripts": { 7 | "build": "webpack --config webpack/prod.js ", 8 | "start": "webpack-dev-server --config webpack/base.js --open" 9 | }, 10 | "repository": { 11 | "type": "git", 12 | "url": "https://github.com/B3L7/phaser3-tilemap-pack" 13 | }, 14 | "author": "B3L7", 15 | "license": "MIT", 16 | "licenseUrl": "http://www.opensource.org/licenses/mit-license.php", 17 | "bugs": { 18 | "url": "https://github.com/B3L7/phaser3-tilemap-pack/issues" 19 | }, 20 | "homepage": "http://b3l7.com", 21 | "devDependencies": { 22 | "@babel/core": "^7.2.2", 23 | "@babel/preset-env": "^7.2.3", 24 | "babel-loader": "^8.0.5", 25 | "clean-webpack-plugin": "^1.0.0", 26 | "file-loader": "^3.0.1", 27 | "html-webpack-plugin": "^3.2.0", 28 | "raw-loader": "^1.0.0", 29 | "terser-webpack-plugin": "^1.2.1", 30 | "webpack": "^4.28.3", 31 | "webpack-cli": "^3.2.1", 32 | "webpack-dev-server": "^3.1.14", 33 | "webpack-merge": "^4.2.1" 34 | }, 35 | "dependencies": { 36 | "phaser": "^3.17.0" 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/B3L7/phaser3-tilemap-pack/365d09d2b8f7c9160346c23591eff25056e0914b/screenshot.png -------------------------------------------------------------------------------- /src/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | import Phaser from "phaser"; 2 | 3 | import Preload from './scenes/Preload'; 4 | import Level from './scenes/Level'; 5 | import HUD from './scenes/HUD'; 6 | import GameOver from './scenes/gameOver'; 7 | 8 | document.body.style.cursor = 'none'; //remove cursor so we can replace it with our crosshair 9 | 10 | const config = { 11 | type: Phaser.AUTO, 12 | parent: 'phaser-tilemap-pack', 13 | pixelArt: true, 14 | clearBeforeRender: false, 15 | scale: { 16 | mode: Phaser.Scale.FIT, 17 | parent: 'phaser-example', 18 | width: 640, 19 | height: 360 20 | }, 21 | physics: { 22 | default: 'arcade' 23 | }, 24 | scene: [ 25 | Preload, 26 | Level, 27 | HUD, 28 | GameOver 29 | ] 30 | }; 31 | 32 | const game = new Phaser.Game(config); 33 | -------------------------------------------------------------------------------- /src/scenes/HUD.js: -------------------------------------------------------------------------------- 1 | export default class HUD extends Phaser.Scene { 2 | constructor() 3 | { 4 | super({ 5 | key: 'HUD' 6 | }); 7 | } 8 | 9 | create() 10 | { 11 | this.health = this.add.bitmapText(1, 1, 'minecraft', `Health: ${this.registry.get('health_current')} / ${this.registry.get('health_max')}`).setScrollFactor(0); 12 | this.magic = this.add.bitmapText(1, 18, 'minecraft', `Magic: ${this.registry.get('magic_current')} / ${this.registry.get('magic_max')}`).setScrollFactor(0); 13 | this.coins = this.add.bitmapText(this.cameras.main.width - 1, 1, 'minecraft', `Coins: ${this.registry.get('coins_current')} / ${this.registry.get('coins_max')}`).setScrollFactor(0); 14 | this.coins.setOrigin(1, 0); 15 | 16 | this.healthAlarm = this.sound.add('lowHealthSFX') 17 | this.healthAlarm.setVolume(.2); 18 | this.healthAlarm.setLoop(true); 19 | this.alarmed = false; 20 | 21 | const level = this.scene.get('Level'); 22 | level.events.on('coinChange', this.updateCoins, this); //watch the level to see if the coin count has changed. Event emitted by coin class. 23 | level.events.on('healthChange', this.updateHealth, this); //watch the level to see if the coin health has changed. Event emitted by player and meat class. 24 | level.events.on('magicChange', this.updateMagic, this); //watch the level to see if the coin magic has changed. Event emitted by player and potion class. 25 | 26 | level.events.on('gameOver', this.gameOver, this); //watch for Game Over 27 | 28 | } 29 | 30 | updateCoins() 31 | { 32 | this.coins.setText(`Coins: ${this.registry.get('coins_current')} / ${this.registry.get('coins_max')}`); 33 | } 34 | 35 | updateHealth() 36 | { 37 | this.health.setText(`Health: ${this.registry.get('health_current')} / ${this.registry.get('health_max')}`); 38 | if (this.registry.get('health_current') <= 1 && !this.alarmed) { 39 | this.alarmed = true; 40 | this.healthAlarm.play(); 41 | } else if (this.registry.get('health_current') > 1 && this.alarmed) { 42 | this.alarmed = false; 43 | this.healthAlarm.stop(); 44 | } 45 | } 46 | 47 | updateMagic() 48 | { 49 | this.magic.setText(`Magic: ${this.registry.get('magic_current')} / ${this.registry.get('magic_max')}`); 50 | } 51 | 52 | gameOver() 53 | { 54 | this.healthAlarm.stop(); 55 | this.health.destroy(); 56 | this.magic.destroy(); 57 | this.coins.destroy(); 58 | } 59 | 60 | } -------------------------------------------------------------------------------- /src/scenes/Level.js: -------------------------------------------------------------------------------- 1 | import Player from '../sprites/player'; 2 | import Fireball from '../sprites/fireball'; 3 | import Enemy from '../sprites/enemy'; 4 | import Demon from '../sprites/demon'; 5 | import DarkFireball from '../sprites/darkFireball'; 6 | import Slime from '../sprites/slime'; 7 | import Coins from '../sprites/coins'; 8 | import Meat from '../sprites/meat'; 9 | import Potion from '../sprites/potion'; 10 | import Jug from '../sprites/jug'; 11 | import Heart from '../sprites/heart'; 12 | 13 | export default class Level extends Phaser.Scene { 14 | constructor() 15 | { 16 | super({ 17 | key: 'Level' 18 | }); 19 | } 20 | 21 | create() 22 | { 23 | this.cameras.main.setBackgroundColor(0x2a0503); 24 | //point the variable at the registry which is assigned either at the Preload scene or just prior to level restart 25 | let load = this.registry.get('load'); 26 | 27 | //load music based on registry value, loop, and play 28 | this.music = this.sound.add(`${load}Music`); 29 | this.music.setLoop(true); 30 | this.music.play(); 31 | 32 | this.fanfare = this.sound.add('fanfareSFX'); 33 | this.fanfare.setVolume(.5); 34 | 35 | //load map based on registry value, set physics bounds, and create layer 36 | this.map = this.make.tilemap({ key: `${load}Map` }); 37 | this.physics.world.bounds.width = this.map.widthInPixels; 38 | this.physics.world.bounds.height = this.map.heightInPixels; 39 | this.tileset = this.map.addTilesetImage('tiles'); 40 | this.layer = this.map.createStaticLayer('tileLayer', this.tileset, 0, 0); 41 | this.layer.setCollisionByProperty({ collide: true }); //make the layer collidable by the property set on the tileset in Tiled 42 | 43 | this.spawnpoints = []; //create an array to hold the spawnpoints populated by converObjects() 44 | //set up groups, tell group to run updates on its children, then call the object conversion method 45 | this.enemies = this.add.group(); 46 | this.enemies.runChildUpdate = true; 47 | this.enemyAttack = this.add.group({ 48 | classType: DarkFireball, 49 | maxSize: 50, 50 | runChildUpdate: true 51 | }); 52 | this.pickups = this.add.group(); 53 | this.convertObjects(); 54 | 55 | let spawn = this.spawnpoints[this.registry.get('spawn')]; //assign spawn variable that points to the currently loaded spawnpoint 56 | 57 | this.crosshair = this.add.image(0, 0, 'atlas', 'crosshair'); //create crosshair which is controlled by player class 58 | //create a new instance of the player class at the currently loaded spawnpoint 59 | this.player = new Player({ 60 | scene: this, 61 | x: spawn.x, 62 | y: spawn.y, 63 | }); 64 | this.cameras.main.startFollow(this.player); 65 | this.playerAttack = this.add.group({ 66 | classType: Fireball, 67 | maxSize: 100, 68 | runChildUpdate: true 69 | }); //create attack group to hold player's fireballs 70 | 71 | //tell the physics system to collide player, appropriate tiles, and other objects based on group, run callbacks when appropriate 72 | this.physics.add.collider(this.player, this.layer); 73 | this.physics.add.collider(this.player, this.enemies, this.playerEnemy); 74 | this.physics.add.collider(this.enemies, this.layer); 75 | this.physics.add.collider(this.enemies, this.enemies); 76 | this.physics.add.collider(this.playerAttack, this.layer, this.fireballWall); //collide callback for fireball hitting wall 77 | this.physics.add.collider(this.enemyAttack, this.layer, this.fireballWall); //collide callback for fireball hitting wall 78 | this.physics.add.collider(this.playerAttack, this.enemies, this.fireballEnemy); //collide callback for fireball hitting enemy 79 | this.physics.add.collider(this.playerAttack, this.enemyAttack, this.fireballFireball); //collide callback for fireball hitting darkFireball 80 | this.physics.add.collider(this.player, this.enemyAttack, this.fireballPlayer); //collide callback for fireball hitting player 81 | 82 | if (this.registry.get('newGame') === true) { 83 | this.newGame(); 84 | this.centerText = true; 85 | this.textCall = 1; 86 | } else { 87 | this.centerText = false; 88 | } 89 | } 90 | 91 | update (time, delta) 92 | { 93 | this.player.update(time, delta); //the player class update method must be called each cycle as the class is not currently part of a group 94 | 95 | //center text over player if a new game 96 | if (this.centerText) { 97 | this.text.setPosition(this.player.x, this.player.y - 32); 98 | } 99 | 100 | //win condition 101 | if (this.player.alive){ 102 | let coinsCurrent = this.registry.get('coins_current'); 103 | let coinsMax = this.registry.get('coins_max'); 104 | if (coinsCurrent >= coinsMax) { 105 | this.player.alive = false; 106 | this.player.body.setVelocity(0); 107 | this.fanfare.play(); 108 | this.particles = this.add.particles('atlas', 'coins'); 109 | this.emitter = this.particles.createEmitter(); 110 | this.emitter.setPosition(this.player.x, this.player.y); 111 | this.emitter.setSpeed(32); 112 | this.emitter.explode( 16, this.player.x, this.player.y ); 113 | this.time.addEvent({ delay: 1000, callback: () => {this.end('win');}, callbackScope: this }); 114 | } 115 | } 116 | } 117 | 118 | convertObjects() 119 | { 120 | //objects in map are checked by type(assigned in object layer in Tiled) and the appopriate extended sprite is created 121 | const objects = this.map.getObjectLayer('objects'); //find the object layer in the tilemap named 'objects' 122 | const level = this.registry.get('load'); 123 | let coinNum = 1; //initialize our coin numbering used to check if the coin has been picked up 124 | let meatNum = 1; //initialize our meat numbering used to check if the meat has been picked up 125 | let potNum = 1; //initialize our potion numbering used to check if the potion has been picked up 126 | let jugNum = 1; //initialize our jug numbering used to check if the jug has been picked up 127 | let heartNum = 1; //initialize our heart numbering used to check if the heart has been picked up 128 | let enemyNum = 1; //initialize our enemy numbering used to check if the enemy has been killed 129 | let demonNum = 1; //initialize our demon numbering used to check if the demon has been killed 130 | let slimeNum = 1; //initialize our slime numbering used to check if the slime has been killed 131 | let regName 132 | objects.objects.forEach( 133 | (object) => { 134 | //create a series of points in our spawnpoints array 135 | if (object.type === 'spawn') { 136 | this.spawnpoints[object.name] = { 137 | x: object.x + 8, 138 | y: object.y - 8 139 | } 140 | } 141 | if (object.type === 'coins') { 142 | //check the registry to see if the coin has already been picked. If not create the coin in the level and register it with the game 143 | regName = `${level}_Coins_${coinNum}`; 144 | if (this.registry.get(regName) !== 'picked') { 145 | let coins = new Coins({ 146 | scene: this, 147 | x: object.x + 8, 148 | y: object.y - 8, 149 | number: coinNum 150 | }); 151 | this.pickups.add(coins); 152 | this.registry.set(regName, 'active'); 153 | } 154 | coinNum += 1; 155 | } 156 | if (object.type === 'meat') { 157 | //check the registry to see if the meat has already been picked. If not create the meat in the level and register it with the game 158 | regName = `${level}_Meat_${meatNum}`; 159 | if (this.registry.get(regName) !== 'picked') { 160 | let meat = new Meat({ 161 | scene: this, 162 | x: object.x + 8, 163 | y: object.y - 8, 164 | number: meatNum 165 | }); 166 | this.pickups.add(meat); 167 | this.registry.set(regName, 'active'); 168 | } 169 | coinNum += 1; 170 | } 171 | if (object.type === 'potion') { 172 | //check the registry to see if the potion has already been picked. If not create the potion in the level and register it with the game 173 | regName = `${level}_Potion_${potNum}`; 174 | if (this.registry.get(regName) !== 'picked') { 175 | let potion = new Potion({ 176 | scene: this, 177 | x: object.x + 8, 178 | y: object.y - 8, 179 | number: potNum 180 | }); 181 | this.pickups.add(potion); 182 | this.registry.set(regName, 'active'); 183 | } 184 | potNum += 1; 185 | } 186 | if (object.type === 'jug') { 187 | //check the registry to see if the jug has already been picked. If not create the jug in the level and register it with the game 188 | regName = `${level}_Jug_${jugNum}`; 189 | if (this.registry.get(regName) !== 'picked') { 190 | let jug = new Jug({ 191 | scene: this, 192 | x: object.x + 8, 193 | y: object.y - 8, 194 | number: jugNum 195 | }); 196 | this.pickups.add(jug); 197 | this.registry.set(regName, 'active'); 198 | } 199 | jugNum += 1; 200 | } 201 | if (object.type === 'heart') { 202 | //check the registry to see if the heart has already been picked. If not create the heart in the level and register it with the game 203 | regName = `${level}_Heart_${heartNum}`; 204 | if (this.registry.get(regName) !== 'picked') { 205 | let heart = new Heart({ 206 | scene: this, 207 | x: object.x + 8, 208 | y: object.y - 8, 209 | number: heartNum 210 | }); 211 | this.pickups.add(heart); 212 | this.registry.set(regName, 'active'); 213 | } 214 | heartNum += 1; 215 | } 216 | if (object.type === "enemy") { 217 | //check the registry to see if the enemy has already been killed. If not create the enemy in the level and register it with the game 218 | regName = `${level}_Enemies_${enemyNum}`; 219 | if (this.registry.get(regName) !== 'dead') { 220 | let enemy = new Enemy({ 221 | scene: this, 222 | x: object.x + 8, 223 | y: object.y - 8, 224 | number: enemyNum 225 | }); 226 | this.enemies.add(enemy); 227 | this.registry.set(regName, 'active'); 228 | } 229 | enemyNum += 1; 230 | } 231 | if (object.type === "demon") { 232 | //check the registry to see if the demon has already been killed. If not create the demon in the level and register it with the game 233 | regName = `${level}_Demon_${demonNum}`; 234 | if (this.registry.get(regName) !== 'dead') { 235 | let demon = new Demon({ 236 | scene: this, 237 | x: object.x + 8, 238 | y: object.y - 8, 239 | number: demonNum 240 | }); 241 | this.enemies.add(demon); 242 | this.registry.set(regName, 'active'); 243 | } 244 | demonNum += 1; 245 | } 246 | if (object.type === "slime") { 247 | //check the registry to see if the slime has already been killed. If not create the slime in the level and register it with the game 248 | regName = `${level}_Slime_${slimeNum}`; 249 | if (this.registry.get(regName) !== 'dead') { 250 | let slime = new Slime({ 251 | scene: this, 252 | x: object.x + 8, 253 | y: object.y - 8, 254 | number: slimeNum 255 | }); 256 | this.enemies.add(slime); 257 | this.registry.set(regName, 'active'); 258 | } 259 | slimeNum += 1; 260 | } 261 | }); 262 | } 263 | 264 | playerEnemy(player, enemy){ 265 | if (enemy.alive){ 266 | player.damage(enemy.attack); 267 | } 268 | } 269 | 270 | fireballWall(fireball, wall) 271 | { 272 | if (fireball.active) { 273 | fireball.wallCollide(); 274 | } 275 | } 276 | 277 | fireballEnemy(fireball, enemy) 278 | { 279 | if (fireball.active){ 280 | fireball.enemyCollide(enemy); 281 | } 282 | } 283 | 284 | fireballPlayer(player, fireball) 285 | { 286 | if (fireball.active) { 287 | fireball.playerCollide(player); 288 | } 289 | } 290 | 291 | fireballFireball(fireball1, fireball2) 292 | { 293 | if (fireball1.active && fireball2.active) { 294 | fireball1.fireballCollide(); 295 | fireball2.fireballCollide(); 296 | } 297 | } 298 | 299 | newGame() 300 | { 301 | this.registry.set('newGame', false); 302 | this.text = this.add.bitmapText(this.player.x, this.player.y - 32, 'minecraft', 'Press UP, DOWN, LEFT, and RIGHT to move.'); 303 | this.text.setOrigin(.5); 304 | this.time.addEvent({ delay: 6000, 305 | callback: () => { 306 | this.changeText(this.textCall); 307 | this.textCall += 1; 308 | }, 309 | callbackScope: this, 310 | repeat: 5 311 | }); 312 | } 313 | 314 | changeText(number) 315 | { 316 | let coins = this.registry.get('coins_max'); 317 | let text = this.text; 318 | let centerText = this.centerText; 319 | if (number === 1) { 320 | let alpha = 1; 321 | this.tweens.addCounter({ 322 | from: 0, 323 | to: 10, 324 | duration: 2000, 325 | onUpdate: function () 326 | { 327 | text.setAlpha(alpha); 328 | alpha -= .1; 329 | }, 330 | onComplete: () => { 331 | text.setAlpha(0); 332 | text.setText('POINT and CLICK to attack.'); 333 | } 334 | }); 335 | } else if (number === 2) { 336 | let alpha = 0; 337 | this.tweens.addCounter({ 338 | from: 0, 339 | to: 10, 340 | duration: 2000, 341 | onUpdate: function () 342 | { 343 | text.setAlpha(alpha); 344 | alpha += .1; 345 | }, 346 | onComplete: () => { 347 | text.setAlpha(1); 348 | } 349 | }); 350 | } else if (number === 3) { 351 | let alpha = 1; 352 | this.tweens.addCounter({ 353 | from: 0, 354 | to: 10, 355 | duration: 2000, 356 | onUpdate: function () 357 | { 358 | text.setAlpha(alpha); 359 | alpha -= .1; 360 | }, 361 | onComplete: () => { 362 | text.setAlpha(0); 363 | text.setText(`Collect ${coins} coins!`); 364 | } 365 | }); 366 | } else if (number === 4) { 367 | let alpha = 0; 368 | this.tweens.addCounter({ 369 | from: 0, 370 | to: 10, 371 | duration: 2000, 372 | onUpdate: function () 373 | { 374 | text.setAlpha(alpha); 375 | alpha += .1; 376 | }, 377 | onComplete: () => { 378 | text.setAlpha(1); 379 | } 380 | }); 381 | } else if (number === 5) { 382 | let alpha = 1; 383 | this.tweens.addCounter({ 384 | from: 0, 385 | to: 10, 386 | duration: 2000, 387 | onUpdate: function () 388 | { 389 | text.setAlpha(alpha); 390 | alpha -= .1; 391 | }, 392 | onComplete: () => { 393 | text.setAlpha(0); 394 | centerText = false; 395 | text.destroy(); 396 | } 397 | }); 398 | } 399 | } 400 | 401 | end(type) 402 | { 403 | //restart the scene. You can place additional cleanup functions in here 404 | this.music.stop(); 405 | if (type === 'restart') { 406 | this.scene.restart(); 407 | } else if (type === 'gameOver') { 408 | this.cameras.main.fade(1000, 16.5, 2.0, 1.2); 409 | this.events.emit('gameOver'); 410 | this.time.addEvent({ delay: 1000, callback: () => {this.scene.start('GameOver', 'lose');}, callbackScope: this }); 411 | } else if (type === 'win') { 412 | this.cameras.main.fade(1000, 16.5, 2.0, 1.2); 413 | this.events.emit('gameOver'); 414 | this.time.addEvent({ delay: 1000, callback: () => {this.scene.start('GameOver', 'win');}, callbackScope: this }); 415 | } 416 | } 417 | 418 | } 419 | -------------------------------------------------------------------------------- /src/scenes/Preload.js: -------------------------------------------------------------------------------- 1 | export default class Preload extends Phaser.Scene { 2 | constructor() 3 | { 4 | super({ 5 | key: 'Preload' 6 | }); 7 | } 8 | 9 | preload() 10 | { 11 | //create a background and prepare loading bar 12 | this.cameras.main.setBackgroundColor(0x2a0503); 13 | this.fullBar = this.add.graphics(); 14 | this.fullBar.fillStyle(0xda7a34, 1); 15 | this.fullBar.fillRect((this.cameras.main.width / 4)-2,(this.cameras.main.height /2) - 18, (this.cameras.main.width / 2) + 4, 20); 16 | this.progress = this.add.graphics(); 17 | 18 | //pass loading progress as value to loading bar and redraw as files load 19 | this.load.on('progress', function (value) { 20 | this.progress.clear(); 21 | this.progress.fillStyle(0xfff6d3, 1); 22 | this.progress.fillRect((this.cameras.main.width / 4), (this.cameras.main.height /2) - 16, (this.cameras.main.width / 2) * value, 16); 23 | }, this); 24 | 25 | //cleanup our graphics on complete 26 | this.load.on('complete', function () { 27 | this.progress.destroy(); 28 | this.fullBar.destroy(); 29 | }, this); 30 | 31 | //start loading 32 | this.load.pack('Preload', 'assets/pack.json', 'Preload'); 33 | } 34 | 35 | create() 36 | { 37 | Phaser.GameObjects.BitmapText.ParseFromAtlas(this, 'minecraft', 'atlas', 'minecraft', 'minecraftXML'); //assemble the bitmap font from the atlas 38 | this.initRegistry(); //initialize the starting registry values. 39 | this.scene.launch('HUD'); //launch HUD 40 | this.scene.start('Level'); 41 | } 42 | 43 | initRegistry() 44 | { 45 | //the game registry provides a place accessible by all scenes to set and get data. 46 | //Here we store our key that tells the LevelScene what map to load. 47 | this.registry.set('newGame', true); 48 | this.registry.set('health_max', 4); 49 | this.registry.set('health_current', 4); 50 | this.registry.set('magic_max', 20); 51 | this.registry.set('magic_current', 20); 52 | this.registry.set('coins_max', 50); 53 | this.registry.set('coins_current', 0); 54 | this.registry.set('load', 'Level1'); 55 | this.registry.set('spawn', 'spawnCenter'); 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /src/scenes/gameOver.js: -------------------------------------------------------------------------------- 1 | export default class GameOver extends Phaser.Scene { 2 | constructor() 3 | { 4 | super({ 5 | key: 'GameOver' 6 | }); 7 | } 8 | 9 | init(condition) 10 | { 11 | this.condition = condition; 12 | } 13 | 14 | create() 15 | { 16 | this.cameras.main.setBackgroundColor(0x2a0503); 17 | if (this.condition === 'win') { 18 | this.overText = this.add.image(this.cameras.main.width / 2, this.cameras.main.height / 2 - 64, 'atlas', 'win'); 19 | this.music = this.sound.add(`winMusic`); 20 | } else if (this.condition === 'lose') { 21 | this.overText = this.add.image(this.cameras.main.width / 2, this.cameras.main.height / 2 - 64, 'atlas', 'gameOver'); 22 | this.music = this.sound.add(`overMusic`); 23 | } 24 | this.text = this.add.bitmapText(this.cameras.main.width / 2, this.cameras.main.height / 2 + 64, 'minecraft', 'Press ENTER to Continue'); 25 | this.text.setOrigin(.5); 26 | this.music.setLoop(true); 27 | this.music.play(); 28 | this.input.keyboard.on('keydown_ENTER', function (event) { 29 | location.reload(); 30 | }); 31 | } 32 | 33 | 34 | } 35 | -------------------------------------------------------------------------------- /src/sprites/coins.js: -------------------------------------------------------------------------------- 1 | export default class Coins extends Phaser.GameObjects.Sprite { 2 | constructor(config) 3 | { 4 | super(config.scene, config.x, config.y,'atlas', 'coins'); 5 | config.scene.physics.world.enable(this); 6 | this.scene = config.scene; 7 | this.number = config.number; 8 | this.sound = this.scene.sound.add('coinSFX'); 9 | this.sound.setVolume(.4); 10 | this.scene.add.existing(this); 11 | } 12 | 13 | pickup () 14 | { 15 | this.sound.play(); 16 | let coins = this.scene.registry.get('coins_current'); //find out how many coins the player currently has 17 | this.scene.registry.set('coins_current', coins + 1); //update the player's coin total 18 | this.scene.registry.set(`${this.scene.registry.get('load')}_Coins_${this.number}`, 'picked'); //register this object as collected with game so it is not added to future intances of this level 19 | this.scene.events.emit('coinChange'); //tell the scene the coint count has changed so the HUD is updated 20 | this.destroy(); 21 | } 22 | 23 | } -------------------------------------------------------------------------------- /src/sprites/darkFireball.js: -------------------------------------------------------------------------------- 1 | export default class DarkFireball extends Phaser.GameObjects.Sprite { 2 | constructor(scene) 3 | { 4 | super(scene, 0, 0,'atlas', 'darkFireball'); 5 | scene.physics.world.enable(this); 6 | this.damage = 1; 7 | this.sound = this.scene.sound.add('fireballSFX'); 8 | this.sound.setVolume(.2); 9 | this.sound.play(); 10 | this.wallSound = this.scene.sound.add('fireballWallSFX'); 11 | this.wallSound.setVolume(.2); 12 | this.playerSound = this.scene.sound.add('fireballEnemySFX'); 13 | this.playerSound.setVolume(.2); 14 | this.scene.add.existing(this); 15 | this.particles = this.scene.add.particles('atlas', 'darkParticle'); 16 | this.emitter = this.particles.createEmitter(); 17 | this.emitter.setPosition(this.x, this.y); 18 | this.emitter.setSpeed(16); 19 | } 20 | 21 | fire (x, y) 22 | { 23 | this.setPosition(x, y); 24 | this.scene.physics.moveTo(this, this.scene.player.x, this.scene.player.y); 25 | this.emitter.flow(0) 26 | this.setActive(true); 27 | this.setVisible(true); 28 | } 29 | 30 | update(time, delta) 31 | { 32 | this.emitter.setPosition(this.x, this.y); 33 | } 34 | 35 | wallCollide () 36 | { 37 | this.emitter.explode( 64, this.x, this.y ); 38 | this.wallSound.play(); 39 | this.setActive(false); 40 | this.setVisible(false); 41 | } 42 | 43 | fireballCollide () 44 | { 45 | this.emitter.explode( 64, this.x, this.y ); 46 | this.wallSound.play(); 47 | this.setActive(false); 48 | this.setVisible(false); 49 | } 50 | 51 | playerCollide (player) 52 | { 53 | this.emitter.explode( 32, this.x, this.y ); 54 | this.playerSound.play(); 55 | player.damage(this.damage); 56 | this.setActive(false); 57 | this.setVisible(false); 58 | } 59 | 60 | } -------------------------------------------------------------------------------- /src/sprites/demon.js: -------------------------------------------------------------------------------- 1 | import Enemy from './enemy'; 2 | import Meat from './meat'; 3 | import Potion from './potion'; 4 | import Jug from './jug'; 5 | import Heart from './heart'; 6 | 7 | export default class Demon extends Enemy { 8 | constructor(config) 9 | { 10 | super(config); 11 | this.setFrame('demon'); 12 | this.number 13 | this.health = 6; 14 | this.exclaimSound = this.scene.sound.add('demonExclaim'); 15 | this.exclaimSound.setVolume(.2); 16 | this.deathSound = this.scene.sound.add('demonDeathSFX'); 17 | this.deathSound.setVolume(.4); 18 | this.detectionDistance = 128; 19 | this.canFireball = true; 20 | } 21 | 22 | detectBehavior() 23 | { 24 | if ((this.distanceToPlayerX > 32 || this.distanceToPlayerY > 32) && this.canFireball){ 25 | this.canFireball = false; 26 | this.scene.time.addEvent({ delay: 2000, callback: this.enableFireball, callbackScope: this }); 27 | let fireball = this.scene.enemyAttack.get(); 28 | if (fireball) 29 | { 30 | fireball.fire(this.x, this.y); 31 | 32 | } 33 | } else { 34 | if (this.x > this.scene.player.x) { 35 | this.moveX = 'left'; 36 | } else if (this.x < this.scene.player.x) { 37 | this.moveX = 'right'; 38 | } else { 39 | this.moveX = 'none'; 40 | } 41 | if (this.y > this.scene.player.y) { 42 | this.moveY = 'up'; 43 | } else if (this.y < this.scene.player.y) { 44 | this.moveY = 'down'; 45 | } else { 46 | this.moveY = 'none'; 47 | } 48 | } 49 | } 50 | 51 | enableFireball() 52 | { 53 | this.canFireball = true; 54 | } 55 | 56 | deathRegister() 57 | { 58 | this.scene.registry.set(`${this.scene.registry.get('load')}_Demon_${this.number}`, 'dead'); 59 | } 60 | 61 | dropLoot() 62 | { 63 | let decision = Phaser.Math.RND.integerInRange(1, 20); 64 | if (decision <= 2 ) { 65 | let heart = new Heart({ 66 | scene: this.scene, 67 | x: this.x, 68 | y: this.y, 69 | number: 0 70 | }); 71 | this.scene.pickups.add(heart); 72 | this.dropSound.play(); 73 | } else if (decision > 2 && decision <=4 ) { 74 | let jug = new Jug({ 75 | scene: this.scene, 76 | x: this.x, 77 | y: this.y, 78 | number: 0 79 | }); 80 | this.scene.pickups.add(jug); 81 | this.dropSound.play(); 82 | } else if (decision > 4 && decision <= 12) { 83 | let potion = new Potion({ 84 | scene: this.scene, 85 | x: this.x, 86 | y: this.y, 87 | number: 0 88 | }); 89 | this.scene.pickups.add(potion); 90 | this.dropSound.play(); 91 | } else if (decision > 12 && decision <= 20) { 92 | let meat = new Meat({ 93 | scene: this.scene, 94 | x: this.x, 95 | y: this.y, 96 | number: 0 97 | }); 98 | this.scene.pickups.add(meat); 99 | this.dropSound.play(); 100 | } 101 | } 102 | } -------------------------------------------------------------------------------- /src/sprites/enemy.js: -------------------------------------------------------------------------------- 1 | import Meat from './meat'; 2 | import Potion from './potion'; 3 | import Jug from './jug'; 4 | import Heart from './heart'; 5 | 6 | export default class Enemy extends Phaser.GameObjects.Sprite { 7 | constructor(config) 8 | { 9 | super(config.scene, config.x, config.y,'atlas', 'enemy'); 10 | config.scene.physics.world.enable(this); 11 | this.scene = config.scene; 12 | this.number = config.number; 13 | this.body.setDrag(8, 8); 14 | this.body.setBounce(.5, .5); 15 | this.health = 4; 16 | this.alive = true; 17 | this.attack = 1; 18 | this.damaged = false; 19 | this.canExclaim = true; 20 | this.exclaimSound = this.scene.sound.add('enemyExclaim'); 21 | this.exclaimSound.setVolume(.2); 22 | this.exclamation = this.scene.add.image(this.x, this.y - 10, 'atlas', 'exclamation'); 23 | this.exclamation.alpha = 0; 24 | this.playerDetected = false; 25 | this.detectionDistance = 64; 26 | this.canDecide = true; 27 | this.moveX = 'none'; 28 | this.moveY = 'none'; 29 | this.walk = 16; 30 | this.run = 32; 31 | this.deathSound = this.scene.sound.add('enemyDeathSFX'); 32 | this.deathSound.setVolume(.4); 33 | this.dropSound = this.scene.sound.add('itemDropSFX'); 34 | this.dropSound.setVolume(.2); 35 | this.scene.add.existing(this); 36 | } 37 | 38 | update(time, delta) 39 | { 40 | if (this.alive) { 41 | this.exclamation.setPosition(this.x, this.y - 12); 42 | this.playerDetected = this.detectPlayer(); 43 | if (!this.damaged) { 44 | if (this.playerDetected) { 45 | if (this.canExclaim) { 46 | this.canExclaim = false; 47 | this.exclaimSound.play(); 48 | this.exclamation.alpha = 1; 49 | this.scene.time.addEvent({ delay: 500, callback: this.hideExclaim, callbackScope: this }); 50 | } 51 | //call the player detected behavior 52 | this.detectBehavior(); 53 | } else { 54 | if (!this.canExclaim){ 55 | this.canExclaim = true; 56 | } 57 | //decide where to move 58 | if (this.canDecide) { 59 | this.canDecide = false; 60 | this.scene.time.addEvent({ delay: 500, callback: this.resetDecide, callbackScope: this }); 61 | let decisionX = Phaser.Math.RND.integerInRange(1, 4); 62 | if (decisionX === 1 || decisionX === 2) { 63 | this.moveX = 'none'; 64 | } else if (decisionX === 3) { 65 | this.moveX = 'left'; 66 | } else if (decisionX === 4) { 67 | this.moveX = 'right'; 68 | } 69 | let decisionY = Phaser.Math.RND.integerInRange(1, 4); 70 | if (decisionY === 1 || decisionY === 2) { 71 | this.moveY = 'none'; 72 | } else if (decisionY === 3) { 73 | this.moveY = 'up'; 74 | } else if (decisionY === 4) { 75 | this.moveY = 'down'; 76 | } 77 | } 78 | } 79 | 80 | //move based on above behavior 81 | this.movement(); 82 | } 83 | 84 | //kill this dude! 85 | if (this.health <= 0) { 86 | this.deathSound.play(); 87 | this.alive = false; 88 | this.setTint(0x2a0503); 89 | this.scene.time.addEvent({ delay: 1000, callback: this.die, callbackScope: this }); 90 | } 91 | 92 | //hide if out of bounds 93 | if (this.x > this.scene.physics.world.bounds.width) { 94 | this.setAlpha(0); 95 | } else if (this.x < 0) { 96 | this.setAlpha(0); 97 | } else if (this.y > this.scene.physics.world.bounds.height) { 98 | this.setAlpha(0); 99 | } else if (this.y < 0) { 100 | this.setAlpha(0); 101 | } else { 102 | this.setAlpha(1); 103 | } 104 | } 105 | } 106 | 107 | detectPlayer() 108 | { 109 | this.distanceToPlayerX = Math.abs(this.x - this.scene.player.x); 110 | this.distanceToPlayerY = Math.abs(this.y - this.scene.player.y); 111 | return (this.distanceToPlayerY <= this.detectionDistance) && (this.distanceToPlayerX <= this.detectionDistance) && this.scene.player.alive && !this.scene.player.damaged; 112 | } 113 | 114 | detectBehavior() 115 | { 116 | if (this.x > this.scene.player.x) { 117 | this.moveX = 'left'; 118 | } else if (this.x < this.scene.player.x) { 119 | this.moveX = 'right'; 120 | } else { 121 | this.moveX = 'none'; 122 | } 123 | if (this.y > this.scene.player.y) { 124 | this.moveY = 'up'; 125 | } else if (this.y < this.scene.player.y) { 126 | this.moveY = 'down'; 127 | } else { 128 | this.moveY = 'none'; 129 | } 130 | } 131 | 132 | movement() 133 | { 134 | let speed; 135 | if (this.playerDetected) { 136 | speed = this.run; 137 | } else { 138 | speed = this.walk; 139 | } 140 | if (this.moveX === 'none') { 141 | this.body.setVelocityX(0); 142 | } else if (this.moveX === 'left') { 143 | this.body.setVelocityX(-speed); 144 | } else if (this.moveX === 'right') { 145 | this.body.setVelocityX(speed); 146 | } 147 | 148 | if (this.moveY === 'none') { 149 | this.body.setVelocityY(0); 150 | } else if (this.moveY === 'up') { 151 | this.body.setVelocityY(-speed); 152 | } else if (this.moveY === 'down') { 153 | this.body.setVelocityY(speed); 154 | } 155 | } 156 | 157 | resetDecide() 158 | { 159 | this.canDecide = true; 160 | } 161 | 162 | damage(ammount) 163 | { 164 | if (!this.damaged) { 165 | this.health -= ammount; 166 | this.damaged = true; 167 | this.setTint(0x8e2f15); 168 | this.scene.time.addEvent({ delay: 1000, callback: this.normalize, callbackScope: this }); 169 | } 170 | } 171 | 172 | normalize() 173 | { 174 | this.damaged = false; 175 | this.setTint(0xffffff); 176 | } 177 | 178 | hideExclaim() 179 | { 180 | this.exclamation.alpha = 0; 181 | } 182 | 183 | die() 184 | { 185 | this.deathRegister(); 186 | this.exclamation.destroy(); 187 | this.dropLoot(); 188 | this.destroy(); 189 | } 190 | 191 | deathRegister() 192 | { 193 | this.scene.registry.set(`${this.scene.registry.get('load')}_Enemies_${this.number}`, 'dead'); //register this enemy as dead so it is not added to future instances of this level. 194 | } 195 | 196 | dropLoot() 197 | { 198 | let decision = Phaser.Math.RND.integerInRange(1, 20); 199 | if (decision === 1 ) { 200 | let heart = new Heart({ 201 | scene: this.scene, 202 | x: this.x, 203 | y: this.y, 204 | number: 0 205 | }); 206 | this.scene.pickups.add(heart); 207 | this.dropSound.play(); 208 | } else if (decision === 2 ) { 209 | let jug = new Jug({ 210 | scene: this.scene, 211 | x: this.x, 212 | y: this.y, 213 | number: 0 214 | }); 215 | this.scene.pickups.add(jug); 216 | this.dropSound.play(); 217 | } else if (decision > 2 && decision <= 6) { 218 | let potion = new Potion({ 219 | scene: this.scene, 220 | x: this.x, 221 | y: this.y, 222 | number: 0 223 | }); 224 | this.scene.pickups.add(potion); 225 | this.dropSound.play(); 226 | } else if (decision > 6 && decision <= 10) { 227 | let meat = new Meat({ 228 | scene: this.scene, 229 | x: this.x, 230 | y: this.y, 231 | number: 0 232 | }); 233 | this.scene.pickups.add(meat); 234 | this.dropSound.play(); 235 | } 236 | } 237 | 238 | } -------------------------------------------------------------------------------- /src/sprites/fireball.js: -------------------------------------------------------------------------------- 1 | export default class Fireball extends Phaser.GameObjects.Sprite { 2 | constructor(scene) 3 | { 4 | super(scene, 0, 0, 'atlas', 'fireball'); 5 | scene.physics.world.enable(this); 6 | this.damage = 1; 7 | this.sound = this.scene.sound.add('fireballSFX'); 8 | this.sound.setVolume(.2); 9 | this.sound.play(); 10 | this.wallSound = this.scene.sound.add('fireballWallSFX'); 11 | this.wallSound.setVolume(.2); 12 | this.enemySound = this.scene.sound.add('fireballEnemySFX'); 13 | this.enemySound.setVolume(.2); 14 | this.scene.add.existing(this); 15 | this.particles = this.scene.add.particles('atlas', 'whiteParticle'); 16 | this.emitter = this.particles.createEmitter(); 17 | this.emitter.setPosition(this.x, this.y); 18 | this.emitter.setSpeed(16); 19 | this.emitter.setBlendMode(Phaser.BlendModes.ADD); 20 | } 21 | 22 | fire (x, y) 23 | { 24 | this.setPosition(x, y); 25 | this.scene.physics.moveTo(this, this.scene.crosshair.x, this.scene.crosshair.y); 26 | this.emitter.flow(0) 27 | this.setActive(true); 28 | this.setVisible(true); 29 | } 30 | 31 | update(time, delta) 32 | { 33 | this.emitter.setPosition(this.x, this.y); 34 | } 35 | 36 | wallCollide () 37 | { 38 | this.emitter.explode( 64, this.x, this.y ); 39 | this.wallSound.play(); 40 | this.setActive(false); 41 | this.setVisible(false); 42 | } 43 | 44 | fireballCollide () 45 | { 46 | this.emitter.explode( 64, this.x, this.y ); 47 | this.wallSound.play(); 48 | this.setActive(false); 49 | this.setVisible(false); 50 | } 51 | 52 | enemyCollide (enemy) 53 | { 54 | this.emitter.explode( 32, this.x, this.y ); 55 | this.enemySound.play(); 56 | enemy.damage(this.damage); 57 | this.setActive(false); 58 | this.setVisible(false); 59 | } 60 | 61 | } -------------------------------------------------------------------------------- /src/sprites/heart.js: -------------------------------------------------------------------------------- 1 | export default class Heart extends Phaser.GameObjects.Sprite { 2 | constructor(config) 3 | { 4 | super(config.scene, config.x, config.y,'atlas', 'heart'); 5 | config.scene.physics.world.enable(this); 6 | this.scene = config.scene; 7 | this.number = config.number; 8 | this.sound = this.scene.sound.add('heartSFX'); 9 | this.sound.setVolume(.2); 10 | this.scene.add.existing(this); 11 | } 12 | 13 | pickup () 14 | { 15 | this.sound.play(); 16 | let healthCurrent = this.scene.registry.get('health_current'); //find out how much health the player currently has 17 | let healthMax = this.scene.registry.get('health_max'); //find out how much health the player currently has 18 | this.scene.registry.set('health_current', healthCurrent + 1); //update the player's current health 19 | this.scene.registry.set('health_max', healthMax + 1); //update the player's max health 20 | healthCurrent = this.scene.registry.get('health_current'); //find out how much health the player currently has 21 | healthMax = this.scene.registry.get('health_max'); //find out how much health the player currently has 22 | if (healthCurrent > healthMax){ //make sure current health has not exceeded max health 23 | this.scene.registry.set('health_current', healthMax); 24 | } 25 | this.scene.registry.set(`${this.scene.registry.get('load')}_Heart_${this.number}`, 'picked'); //register this object as collected with game so it is not added to future intances of this level 26 | this.scene.events.emit('healthChange'); //tell the scene the health has changed so the HUD is updated 27 | this.destroy(); 28 | } 29 | 30 | } -------------------------------------------------------------------------------- /src/sprites/jug.js: -------------------------------------------------------------------------------- 1 | export default class Jug extends Phaser.GameObjects.Sprite { 2 | constructor(config) 3 | { 4 | super(config.scene, config.x, config.y,'atlas', 'jug'); 5 | config.scene.physics.world.enable(this); 6 | this.scene = config.scene; 7 | this.number = config.number; 8 | this.sound = this.scene.sound.add('jugSFX'); 9 | this.sound.setVolume(.2); 10 | this.particles = this.scene.add.particles('atlas', 'whiteParticle'); 11 | this.emitter = this.particles.createEmitter(); 12 | this.emitter.setPosition(this.x, this.y); 13 | this.emitter.setSpeed(16); 14 | this.emitter.setBlendMode(Phaser.BlendModes.ADD); 15 | this.scene.add.existing(this); 16 | } 17 | 18 | pickup () 19 | { 20 | this.sound.play(); 21 | this.emitter.explode( 64, this.x, this.y ); 22 | let magicMax = this.scene.registry.get('magic_max'); //find out how the max magic the player has 23 | let magicCurrent = this.scene.registry.get('magic_current'); //find out how the current magic the player has 24 | this.scene.registry.set('magic_max', magicMax + 5); //update the player's max magic 25 | this.scene.registry.set('magic_current', magicCurrent + 5); //update the player's max magic 26 | magicMax = this.scene.registry.get('magic_max'); //find out how the max magic the player has 27 | magicCurrent = this.scene.registry.get('magic_current'); //find out how the current magic the player has 28 | if (magicCurrent > magicMax){//check to see if current magic exceeded max magic 29 | this.scene.registry.set('magic_current', magicMax); //update the player's current magic 30 | } 31 | 32 | this.scene.registry.set(`${this.scene.registry.get('load')}_Jug_${this.number}`, 'picked'); //register this object as collected with game so it is not added to future intances of this level 33 | this.scene.events.emit('magicChange'); //tell the scene the magic count has changed so the HUD is updated 34 | this.destroy(); 35 | } 36 | 37 | } -------------------------------------------------------------------------------- /src/sprites/meat.js: -------------------------------------------------------------------------------- 1 | export default class Meat extends Phaser.GameObjects.Sprite { 2 | constructor(config) 3 | { 4 | super(config.scene, config.x, config.y,'atlas', 'meat'); 5 | config.scene.physics.world.enable(this); 6 | this.scene = config.scene; 7 | this.number = config.number; 8 | this.sound = this.scene.sound.add('meatSFX'); 9 | this.sound.setVolume(.2); 10 | this.scene.add.existing(this); 11 | } 12 | 13 | pickup () 14 | { 15 | this.sound.play(); 16 | let health = this.scene.registry.get('health_current'); //find out how much health the player currently has 17 | if (health < this.scene.registry.get('health_max')){ 18 | this.scene.registry.set('health_current', health + 1); //update the player's current health 19 | } 20 | this.scene.registry.set(`${this.scene.registry.get('load')}_Meat_${this.number}`, 'picked'); //register this object as collected with game so it is not added to future intances of this level 21 | this.scene.events.emit('healthChange'); //tell the scene the health has changed so the HUD is updated 22 | this.destroy(); 23 | } 24 | 25 | } -------------------------------------------------------------------------------- /src/sprites/player.js: -------------------------------------------------------------------------------- 1 | export default class Player extends Phaser.GameObjects.Sprite { 2 | constructor(config) 3 | { 4 | super(config.scene, config.x, config.y, 'atlas', 'player'); 5 | config.scene.physics.world.enable(this); 6 | this.scene = config.scene; 7 | this.body.setDrag(8, 8); 8 | this.body.setBounce(.5, .5); 9 | this.alive = true; 10 | this.damaged = false; 11 | this.input = this.scene.input.keyboard.createCursorKeys(); 12 | this.canLoad = true; //property controls whether the level can restart so that it can only be called once 13 | 14 | this.noMagicSound = this.scene.sound.add('outOfMagicSFX'); 15 | this.noMagicSound.setVolume(.4); 16 | 17 | this.hurtSound = this.scene.sound.add('playerDamageSFX'); 18 | this.hurtSound.setVolume(.4); 19 | 20 | this.deathSound = this.scene.sound.add('playerDeathSFX'); 21 | this.deathSound.setVolume(.4); 22 | 23 | //sync crosshair position with pointer 24 | this.scene.input.on('pointermove', function (pointer) { 25 | let mouse = pointer 26 | this.scene.crosshair.setPosition(mouse.x + this.scene.cameras.main.scrollX, mouse.y + this.scene.cameras.main.scrollY); 27 | }, this); 28 | 29 | //create a new instance of fireball class when pointer is clicked and add it to player attack group for collision callbacks 30 | this.scene.input.on('pointerdown', function (pointer) { 31 | let magic = this.scene.registry.get('magic_current'); 32 | if (magic > 0) { 33 | let fireball = this.scene.playerAttack.get(); 34 | if (fireball) 35 | { 36 | fireball.fire(this.x, this.y); 37 | 38 | } 39 | this.scene.registry.set('magic_current', magic - 1); 40 | this.scene.events.emit('magicChange'); //tell the scene the magic has changed so the HUD is updated 41 | } else { 42 | this.noMagicSound.play(); 43 | } 44 | }, this); 45 | 46 | 47 | this.scene.add.existing(this); 48 | } 49 | 50 | update(time, delta) 51 | { 52 | if (this.alive) { 53 | let healthCurrent = this.scene.registry.get('health_current'); 54 | if (healthCurrent <= 0) { 55 | this.alive = false; 56 | this.setTint(0x2a0503); 57 | this.deathSound.play(); 58 | this.scene.time.addEvent({ delay: 1000, callback: this.gameOver, callbackScope: this }); 59 | } 60 | 61 | this.scene.physics.overlap( this, this.scene.pickups, this.pickup); //call pickup method when player overlaps pickup objects 62 | 63 | //movement 64 | if (!this.damaged) { 65 | this.body.setVelocity(0); 66 | } 67 | 68 | if (this.input.left.isDown) 69 | { 70 | this.body.setVelocityX(-64); 71 | } 72 | else if (this.input.right.isDown) 73 | { 74 | this.body.setVelocityX(64); 75 | } 76 | 77 | if (this.input.up.isDown) 78 | { 79 | this.body.setVelocityY(-64); 80 | } 81 | else if (this.input.down.isDown) 82 | { 83 | this.body.setVelocityY(64); 84 | } 85 | 86 | 87 | //check if outside bounds, if out of bounds set load and spawn registry to appropriate value from map then tell the Level to reload 88 | if (this.canLoad) 89 | { 90 | if (this.x > this.scene.physics.world.bounds.width) { 91 | this.scene.registry.set('load', this.scene.map.properties.loadRight); 92 | this.scene.registry.set('spawn', this.scene.map.properties.spawnRight); 93 | this.canLoad = false; 94 | this.scene.end('restart'); 95 | } else if (this.x < 0) { 96 | this.scene.registry.set('load', this.scene.map.properties.loadLeft); 97 | this.scene.registry.set('spawn', this.scene.map.properties.spawnLeft); 98 | this.canLoad = false; 99 | this.scene.end('restart'); 100 | } else if (this.y > this.scene.physics.world.bounds.height) { 101 | this.scene.registry.set('load', this.scene.map.properties.loadDown); 102 | this.scene.registry.set('spawn', this.scene.map.properties.spawnDown); 103 | this.canLoad = false; 104 | this.scene.end('restart'); 105 | } else if (this.y < 0) { 106 | this.scene.registry.set('load', this.scene.map.properties.loadUp); 107 | this.scene.registry.set('spawn', this.scene.map.properties.spawnUp); 108 | this.canLoad = false; 109 | this.scene.end('restart'); 110 | } 111 | } 112 | } 113 | } 114 | 115 | pickup(player, object) 116 | { 117 | object.pickup(); //call the pickup objects method 118 | } 119 | 120 | damage(ammount) 121 | { 122 | if (!this.damaged && this.alive) { 123 | this.hurtSound.play(); 124 | this.scene.cameras.main.shake(32); 125 | this.damaged = true; 126 | let health = this.scene.registry.get('health_current'); //find out the player's current health 127 | this.scene.registry.set('health_current', health - ammount); //update the player's current health 128 | this.scene.events.emit('healthChange'); //tell the scene the health has changed so the HUD is updated 129 | this.setTint(0x8e2f15); 130 | this.scene.time.addEvent({ delay: 1000, callback: this.normalize, callbackScope: this }); 131 | } 132 | } 133 | 134 | gameOver() 135 | { 136 | this.scene.end('gameOver'); 137 | } 138 | 139 | normalize() 140 | { 141 | if (this.alive) { 142 | this.damaged = false; 143 | this.setTint(0xffffff); 144 | } 145 | } 146 | 147 | } -------------------------------------------------------------------------------- /src/sprites/potion.js: -------------------------------------------------------------------------------- 1 | export default class Potion extends Phaser.GameObjects.Sprite { 2 | constructor(config) 3 | { 4 | super(config.scene, config.x, config.y,'atlas', 'potion'); 5 | config.scene.physics.world.enable(this); 6 | this.scene = config.scene; 7 | this.number = config.number; 8 | this.sound = this.scene.sound.add('potionSFX'); 9 | this.sound.setVolume(.2); 10 | this.scene.add.existing(this); 11 | } 12 | 13 | pickup () 14 | { 15 | this.sound.play(); 16 | let magic = this.scene.registry.get('magic_current'); //find out how much magic the player currently has 17 | if (magic < this.scene.registry.get('magic_max')){ 18 | this.scene.registry.set('magic_current', magic + 5); //update the player's current magic 19 | } 20 | magic = this.scene.registry.get('magic_current'); 21 | if (magic > this.scene.registry.get('magic_max')){//check to see if current magic exceeded max magic 22 | this.scene.registry.set('magic_current', this.scene.registry.get('magic_max')); //update the player's current magic 23 | } 24 | this.scene.registry.set(`${this.scene.registry.get('load')}_Potion_${this.number}`, 'picked'); //register this object as collected with game so it is not added to future intances of this level 25 | this.scene.events.emit('magicChange'); //tell the scene the magic count has changed so the HUD is updated 26 | this.destroy(); 27 | } 28 | 29 | } -------------------------------------------------------------------------------- /src/sprites/slime.js: -------------------------------------------------------------------------------- 1 | import Enemy from './enemy'; 2 | import Meat from './meat'; 3 | import Potion from './potion'; 4 | 5 | export default class Demon extends Enemy { 6 | constructor(config) 7 | { 8 | super(config); 9 | this.setFrame('slime'); 10 | this.number 11 | this.health = 2; 12 | this.deathSound = this.scene.sound.add('slimeDeathSFX'); 13 | this.deathSound.setVolume(.4); 14 | this.detectionDistance = 48; 15 | this.walk = 8; 16 | this.run = 16; 17 | } 18 | 19 | deathRegister() 20 | { 21 | this.scene.registry.set(`${this.scene.registry.get('load')}_Slime_${this.number}`, 'dead'); 22 | } 23 | 24 | dropLoot() 25 | { 26 | let decision = Phaser.Math.RND.integerInRange(1, 20); 27 | if (decision <= 2) { 28 | let potion = new Potion({ 29 | scene: this.scene, 30 | x: this.x, 31 | y: this.y, 32 | number: 0 33 | }); 34 | this.scene.pickups.add(potion); 35 | this.dropSound.play(); 36 | } else if (decision > 2 && decision <= 4) { 37 | let meat = new Meat({ 38 | scene: this.scene, 39 | x: this.x, 40 | y: this.y, 41 | number: 0 42 | }); 43 | this.scene.pickups.add(meat); 44 | this.dropSound.play(); 45 | } 46 | } 47 | 48 | 49 | 50 | } -------------------------------------------------------------------------------- /webpack/base.js: -------------------------------------------------------------------------------- 1 | const webpack = require("webpack"); 2 | const path = require("path"); 3 | const HtmlWebpackPlugin = require("html-webpack-plugin"); 4 | 5 | module.exports = { 6 | output: { 7 | filename: "bundle.min.js" 8 | }, 9 | mode: "development", 10 | devtool: "eval-source-map", 11 | devServer: { 12 | contentBase: path.resolve(__dirname, '../'), 13 | publicPath: '/dist/', 14 | }, 15 | module: { 16 | rules: [ 17 | { 18 | test: /\.js$/, 19 | exclude: /node_modules/, 20 | use: { 21 | loader: "babel-loader" 22 | } 23 | }, 24 | { 25 | test: [/\.vert$/, /\.frag$/], 26 | use: "raw-loader" 27 | }, 28 | { 29 | test: /\.(gif|png|jpe?g|svg|xml)$/i, 30 | use: "file-loader" 31 | } 32 | ] 33 | }, 34 | plugins: [ 35 | new webpack.DefinePlugin({ 36 | CANVAS_RENDERER: JSON.stringify(true), 37 | WEBGL_RENDERER: JSON.stringify(true) 38 | }), 39 | new HtmlWebpackPlugin({ 40 | template: "./src/index.html", 41 | filename: "../index.html" 42 | }) 43 | ] 44 | }; 45 | -------------------------------------------------------------------------------- /webpack/prod.js: -------------------------------------------------------------------------------- 1 | const merge = require("webpack-merge"); 2 | const path = require("path"); 3 | const base = require("./base"); 4 | const TerserPlugin = require("terser-webpack-plugin"); 5 | const CleanWebpackPlugin = require("clean-webpack-plugin"); 6 | 7 | module.exports = merge(base, { 8 | mode: "production", 9 | devtool: false, 10 | performance: { 11 | maxEntrypointSize: 900000, 12 | maxAssetSize: 900000 13 | }, 14 | optimization: { 15 | minimizer: [ 16 | new TerserPlugin({ 17 | terserOptions: { 18 | output: { 19 | comments: false 20 | } 21 | } 22 | }) 23 | ] 24 | }, 25 | plugins: [ 26 | new CleanWebpackPlugin(["dist"], { 27 | root: path.resolve(__dirname, "../") 28 | }) 29 | ] 30 | }); 31 | --------------------------------------------------------------------------------