diff --git a/res/aseprite/tilemap.aseprite b/res/aseprite/tilemap.aseprite index 532b123..27ccf2b 100644 Binary files a/res/aseprite/tilemap.aseprite and b/res/aseprite/tilemap.aseprite differ diff --git a/res/mage.png b/res/mage.png new file mode 100644 index 0000000..096382d Binary files /dev/null and b/res/mage.png differ diff --git a/res/tilemap.min.js b/res/tilemap.min.js index a88b17a..73d63d8 100644 --- a/res/tilemap.min.js +++ b/res/tilemap.min.js @@ -2,45 +2,46 @@ * Tile map for caa-game * Index for tilemap file * - * 0. Corner top-left - * 1. normal top wall middle piece - * 2. Corner top -> left wall - * 3. Left wall - * 4. top wall before corner - * 5. corner top -> right wall - * 6. normal right wall piece - * 7. Corner right -> top - * 8. Corner right -> bottom - * 9. bottom wall piece before 8. - * 10. normal bottom wall piece - * 11. Corner bottom -> right - * 12. Corner right -> bottom - * 13. Corner bottom -> left - * 14. Bottom wall piece before 13. - * 15. Corner left -> bottom - * 32. Normal floor tile - * 17. +-shaped floor tile - * 18. Heavily cracked floor tile - * 19. Lightly cracked floor tile - * 20. Normal brick wall 1 - * 21. Normal brick wall 2 - * 22. Normal brick wall 3 - * 23. blood brick wall 1 - * 24. blood brick wall 2 - * 25. blood brick wall 3 - * 26. light vines brick wall 1 - * 27. light vines brick wall 2 - * 28. light vines brick wall 3 - * 29. heavy vines brick wall 1 - * 30. heavy vines brick wall 2 - * 31. heavy vines brick wall 3 - * 64. Chest closed - * 33. Chest opened - * 34. Rock 1 - * 35. Rock 2 - * 36. door - * 37. Ladder (should be over wall) - * 38. Torch - * 39. Staircase + * 0. Empty tile + * 1. Corner top-left + * 2. normal top wall middle piece + * 3. Corner top -> left wall + * 4. Left wall + * 5. top wall before corner + * 6. corner top -> right wall + * 7. normal right wall piece + * 8. Corner right -> top + * 9. Corner right -> bottom + * 10. bottom wall piece before 8. + * 12. normal bottom wall piece + * 12. Corner bottom -> right + * 13. Corner right -> bottom + * 14. Corner bottom -> left + * 16. Bottom wall piece before 13. + * 17. Corner left -> bottom + * 33. Normal floor tile + * 18. +-shaped floor tile + * 19. Heavily cracked floor tile + * 20. Lightly cracked floor tile + * 21. Normal brick wall 1 + * 22. Normal brick wall 2 + * 23. Normal brick wall 3 + * 24. blood brick wall 1 + * 25. blood brick wall 2 + * 26. blood brick wall 3 + * 27. light vines brick wall 1 + * 28. light vines brick wall 2 + * 29. light vines brick wall 3 + * 30. heavy vines brick wall 1 + * 31. heavy vines brick wall 2 + * 32. heavy vines brick wall 3 + * 65. Chest closed + * 34. Chest opened + * 35. Rock 1 + * 36. Rock 2 + * 37. door + * 38. Ladder (should be over wall) + * 39. Torch + * 40. Staircase ------------------------------------------------------------------- */ -module.exports=[{x:0,y:0,walkable:!1},{x:32,y:0,walkable:!1},{x:64,y:0,walkable:!1},{x:96,y:0,walkable:!1},{x:128,y:0,walkable:!1},{x:0,y:32,walkable:!1},{x:32,y:32,walkable:!1},{x:64,y:32,walkable:!1},{x:96,y:32,walkable:!1},{x:128,y:32,walkable:!1},{x:0,y:64,walkable:!1},{x:32,y:64,walkable:!1},{x:64,y:64,walkable:!1},{x:96,y:64,walkable:!1},{x:128,y:64,walkable:!1},{x:0,y:96,walkable:!1},{x:32,y:96,walkable:!0},{x:64,y:96,walkable:!0},{x:96,y:96,walkable:!0},{x:128,y:96,walkable:!0},{x:0,y:128,walkable:!1},{x:32,y:128,walkable:!1},{x:64,y:128,walkable:!1},{x:96,y:128,walkable:!1},{x:128,y:128,walkable:!1},{x:0,y:80,walkable:!1},{x:32,y:80,walkable:!1},{x:64,y:80,walkable:!1},{x:96,y:80,walkable:!1},{x:128,y:80,walkable:!1},{x:0,y:96,walkable:!1},{x:32,y:96,walkable:!1},{x:64,y:96,walkable:!1},{x:96,y:96,walkable:!1},{x:128,y:96,walkable:!1},{x:0,y:224,walkable:!1},{x:32,y:224,walkable:!1},{x:64,y:224,walkable:!1},{x:96,y:224,walkable:!1},{x:128,y:224,walkable:!1}]; \ No newline at end of file +module.exports=[{x:0,y:256,walkable:!1},{x:0,y:0,walkable:!1},{x:32,y:0,walkable:!1},{x:64,y:0,walkable:!1},{x:96,y:0,walkable:!1},{x:128,y:0,walkable:!1},{x:0,y:32,walkable:!1},{x:32,y:32,walkable:!1},{x:64,y:32,walkable:!1},{x:96,y:32,walkable:!1},{x:128,y:32,walkable:!1},{x:0,y:64,walkable:!1},{x:32,y:64,walkable:!1},{x:64,y:64,walkable:!1},{x:96,y:64,walkable:!1},{x:128,y:64,walkable:!1},{x:0,y:96,walkable:!1},{x:32,y:96,walkable:!0},{x:64,y:96,walkable:!0},{x:96,y:96,walkable:!0},{x:128,y:96,walkable:!0},{x:0,y:128,walkable:!1},{x:32,y:128,walkable:!1},{x:64,y:128,walkable:!1},{x:96,y:128,walkable:!1},{x:128,y:128,walkable:!1},{x:0,y:80,walkable:!1},{x:32,y:80,walkable:!1},{x:64,y:80,walkable:!1},{x:96,y:80,walkable:!1},{x:128,y:80,walkable:!1},{x:0,y:96,walkable:!1},{x:32,y:96,walkable:!1},{x:64,y:96,walkable:!1},{x:96,y:96,walkable:!1},{x:128,y:96,walkable:!1},{x:0,y:224,walkable:!1},{x:32,y:224,walkable:!1},{x:64,y:224,walkable:!1},{x:96,y:224,walkable:!1},{x:128,y:224,walkable:!1}]; \ No newline at end of file diff --git a/res/tilemap.png b/res/tilemap.png index fa12395..2511fe0 100644 Binary files a/res/tilemap.png and b/res/tilemap.png differ diff --git a/src/entities/mage.js b/src/entities/mage.js new file mode 100644 index 0000000..36e628d --- /dev/null +++ b/src/entities/mage.js @@ -0,0 +1,81 @@ +var asdf = require("asdf-games"); +// eslint-disable-next-line no-unused-vars +const { Texture, TileSprite, AnimManager, wallslide, entity } = asdf; + +var texture = new Texture("./res/mage.png"); + +const states = { + idle: 0, + attack: 1, + evade: 2 +}; + +class Mage extends TileSprite { + constructor(pos, player, level) { + super(texture, 16, 16); + this.pos = pos; + this.scale = { x: 3, y: 3 }; + + this.anims = new AnimManager(this); + // North + this.anims.add("move_n", [4, 5, 6, 7].map(x => ({ x, y: 0 })), 0.1); + // East + this.anims.add("move_e", [0, 1, 2, 3].map(x => ({ x, y: 1 })), 0.1); + // South + this.anims.add("move_s", [0, 1, 2, 3].map(x => ({ x, y: 0 })), 0.1); + // West + this.anims.add("move_w", [4, 5, 6, 7].map(x => ({ x, y: 1 })), 0.1); + // Inactive + this.anims.add("idle", [{ x: 0, y: 2 }], 0.1); + + this.anims.play("idle"); + + this.state = states.idle; + + this.level = level; + this.player = player; + + this.hitBox = { + x: 4, + y: 1, + w: 8, + h: 14 + }; + } + + update(dt) { + super.update(dt); + + if (this.state != states.idle) { + // Move + + const angle = entity.angle(this.player, this); + const xo = Math.cos(angle) * 100 * dt; + const yo = Math.sin(angle) * 100 * dt; + const r = wallslide.wallslide(this, this.level, xo, yo); + + this.pos.x += r.x; + this.pos.y += r.y; + + if (Math.abs(r.x) > Math.abs(r.y)) { + // Animation x axis + if (r.x >= 0) { + this.anims.play("move_e"); + } else { + this.anims.play("move_w"); + } + } else { + // Animation y axis + if (r.y >= 0) { + this.anims.play("move_s"); + } else { + this.anims.play("move_n"); + } + } + } else { + this.anims.play("idle"); + } + } +} + +module.exports = Mage; \ No newline at end of file diff --git a/src/entities/player.js b/src/entities/player.js index e906dca..7bc2a69 100644 --- a/src/entities/player.js +++ b/src/entities/player.js @@ -4,17 +4,22 @@ const { Texture, TileSprite, AnimManager, wallslide } = asdf; var texture = new Texture("./res/player.png"); class Player extends TileSprite { - constructor(keys, window, level) { + constructor(keys, window) { super(texture, 24, 24); this.scale = { x: 2, y: 2 }; - this.window = window; + this.keys = keys; this.rate = { walking: 0.2, running: 0.1 }; + this.speed = { + walking: 75, + running: 150 + }; + this.anims = new AnimManager(this); // North this.anims.add("walk_n", [0, 1, 2, 3].map(x => ({ x, y: 0 })), this.rate.walking); @@ -31,12 +36,11 @@ class Player extends TileSprite { this.anims.play("walk_s"); - this.pos.x = (level.w / 2) - (24 * this.scale.x / 2); - this.pos.y = (level.h / 2) - (24 * this.scale.y / 2); - - this.level = level; - - this.keys = keys; + this.lives = 5; + this.stamina = { + current: 5, + max: 5 + }; this.hitBox = { x: 4, @@ -52,30 +56,45 @@ class Player extends TileSprite { // Animate if (this.keys.x == -1) { // Left - (this.keys.action) ? + (this.keys.action && !(this.stamina.current <= 0)) ? this.anims.play("run_w") : this.anims.play("walk_w"); } else if (this.keys.x == 1) { // Right - (this.keys.action) ? + (this.keys.action && !(this.stamina.current <= 0)) ? this.anims.play("run_e") : this.anims.play("walk_e"); } else if (this.keys.y == -1) { // Up - (this.keys.action) ? + (this.keys.action && !(this.stamina.current <= 0)) ? this.anims.play("run_n") : this.anims.play("walk_n"); } else if (this.keys.y == 1) { // Down - (this.keys.action) ? + (this.keys.action && !(this.stamina.current <= 0)) ? this.anims.play("run_s") : this.anims.play("walk_s"); } else { // Idle this.anims.stop(); } + // Lose stamina + if (this.keys.action) { + if (!(this.stamina.current <= 0)) { + this.stamina.current -= dt; + } else { + this.stamina.current = 0; + } + } else { + if (!(this.stamina.current >= this.stamina.max)) { + this.stamina.current += dt; + } else { + this.stamina.current = this.stamina.max; + } + } + // Speed - const xo = this.keys.x * dt * (600 * (1 - (this.keys.action) ? - this.rate.running : this.rate.walking )); - const yo = this.keys.y * dt * (600 * (1 - (this.keys.action) ? - this.rate.running : this.rate.walking )); + const xo = this.keys.x * ((this.keys.action && !(this.stamina.current <= 0)) ? + this.speed.running : this.speed.walking) * dt; + const yo = this.keys.y * ((this.keys.action && !(this.stamina.current <= 0)) ? + this.speed.running : this.speed.walking) * dt; // Move const r = wallslide.wallslide(this, this.level, xo, yo); diff --git a/src/game.js b/src/game.js index 9c6c107..ca0d4d1 100644 --- a/src/game.js +++ b/src/game.js @@ -1,6 +1,7 @@ const { ipcRenderer, remote } = require("electron"); var asdf = require("asdf-games"); +// eslint-disable-next-line no-unused-vars const { Game, KeyControls, MouseControls, Camera, Lighting } = asdf; const window = { w: 640, h: 320 }; @@ -16,21 +17,28 @@ var Level = require("./src/levels/level.js"); const mouseAim = new MouseControls(document.getElementById("board")); const keys = new KeyControls(); -var level = new Level(); -var player = new Player(keys, window, level); -var lightsources = [ - { x: 100, y: 100 }, - { x: 300, y: 100 }, - { x: 500, y: 100 }, - { x: 500, y: 300 } -]; -var lighting = new Lighting(level.x, level.y, level.w, level.h, lightsources); +// var lightsources = [ +// { x: 100, y: 50 }, +// { x: 100, y: 300 }, +// { x: 300, y: 50 }, +// { x: 300, y: 300 }, +// { x: 100, y: 500 }, +// { x: 500, y: 100 } +// ]; +// var lighting = new Lighting(level.x, level.y, level.w, level.h, lightsources); + + +var player = new Player(keys, window); +var level = new Level(player); +player.pos = level.startPos; +player.level = level; + const camera = new Camera(player, window, { w: level.w * 2, h: level.h * 2 }); scene.add(camera); camera.add(level); camera.add(player); -camera.add(lighting); +// camera.add(lighting); game.run(() => { if (mouseAim.isDown) { diff --git a/src/levels/level.js b/src/levels/level.js index 167d2e7..7a21b7f 100644 --- a/src/levels/level.js +++ b/src/levels/level.js @@ -1,28 +1,30 @@ var asdf = require("asdf-games"); -const { Texture, TileMap } = asdf; +// eslint-disable-next-line no-unused-vars +const { Texture, TileMap, entity } = asdf; const texture = new Texture("./res/tilemap.png"); const tiles = require("../../res/tilemap.min.js"); - const tileSize = 32; +const Mage = require("../entities/mage.js"); + const levelSize = { w: 960, h: 480 }; var levelData = [ - 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 5, - 3, 20, 21, 22, 20, 21, 22, 20, 21, 22, 20, 21, 22, 20, 21, 22, 20, 21, 22, 20, 21, 22, 20, 21, 22, 20, 21, 22, 20, 6, - 3, 16, 16, 16, 16, 20, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 6, - 3, 16, 16, 16, 16, 20, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 6, - 3, 16, 16, 16, 16, 20, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 6, - 3, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 6, - 3, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 6, - 3, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 6, - 3, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 6, - 3, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 6, - 3, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 6, - 3, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 6, - 3, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 6, - 3, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 6, - 13, 14, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 9, 8 + 1, 2, 2, 2, 2, 6, 0, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 5, 6, + 4, 21, 22, 23, 21, 7, 0, 4, 22, 23, 21, 22, 23, 21, 22, 23, 21, 22, 23, 21, 22, 23, 21, 22, 23, 21, 22, 23, 21, 7, + 4, 17, 17, 17, 17, 7, 0, 4, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 7, + 4, 17, 17, 17, 17, 7, 0, 4, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 7, + 4, 17, 17, 17, 17, 8, 2, 3, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 7, + 4, 17, 17, 17, 17, 22, 22, 22, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 7, + 4, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 7, + 4, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 7, + 4, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 7, + 4, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 7, + 4, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 7, + 4, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 7, + 4, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 7, + 4, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 7, + 14, 15, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 10, 9 ]; var levelTiles = levelData.map(function(e) { @@ -30,12 +32,39 @@ var levelTiles = levelData.map(function(e) { }); class Level extends TileMap { - constructor () { + constructor (player) { super(levelTiles, levelSize.w / tileSize, levelSize.h / tileSize, tileSize, tileSize, texture); this.pos = { x: 0, y: 0 }; + this.startPos = { x: 48, y: 64 }; this.scale = { x: 1, y: 1 }; this.w = levelSize.w; this.h = levelSize.h; + + this.player = player; + + this.mages = [ + new Mage({ x: 8 * tileSize, y: 2 * tileSize }, this.player, this), + new Mage({ x: 1 * tileSize, y: 8 * tileSize }, this.player, this) + ]; + + for (let index = 0; index < this.mages.length; index++) { + this.children.push(this.mages[index]); + } + + } + + update(dt) { + super.update(dt); + if (this.player) { + for (let index = 0; index < this.mages.length; index++) { + const mage = this.mages[index]; + if (entity.distance(this.player, mage) < 100) { + mage.state = 1; + } else { + mage.state = 0; + } + } + } } }