var asdf = require("asdf-games"); // eslint-disable-next-line no-unused-vars const { Texture, TileSprite, AnimManager, wallslide, entity } = asdf; const texture = new Texture("../res/images/mage.png"); const Bullet = require("./bullet.js"); const states = { idle: 0, attack: 1, move: 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.15); this.anims.add("attack_n", [{ x: 4, y: 0 }], 0.1); // East this.anims.add("move_e", [0, 1, 2, 3].map(x => ({ x, y: 1 })), 0.15); this.anims.add("attack_e", [{ x: 0, y: 1 }], 0.1); // South this.anims.add("move_s", [0, 1, 2, 3].map(x => ({ x, y: 0 })), 0.15); this.anims.add("attack_s", [{ x: 0, y: 0 }], 0.1); // West this.anims.add("move_w", [4, 5, 6, 7].map(x => ({ x, y: 1 })), 0.15); this.anims.add("attack_w", [{ x: 4, y: 1 }], 0.1); // Inactive this.anims.add("idle", [{ x: 0, y: 2 }], 0.1); this.anims.play("idle"); this.state = states.idle; this.bullet = false; this.shootrate = { current: 0.5, max: 2 }; this.level = level; this.player = player; this.hitBox = { x: 4, y: 1, w: 8, h: 14 }; } update(dt) { super.update(dt); const angle = entity.angle(this.player, this); if (entity.distance(this.player, this) <= 200) { if (entity.distance(this.player, this) <= 100) { this.state = states.attack; } else { this.state = states.move; } } else { this.state = states.idle; } const xo = Math.cos(angle) * 75 * dt; const yo = Math.sin(angle) * 75 * dt; const r = wallslide.wallslide(this, this.level, xo, yo); if (this.state == states.move && !this.bullet) { if (this.player.items.repellant) { this.pos.x -= r.x; this.pos.y -= r.y; } else { 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 if (this.state == states.attack) { if (this.shootrate.current <= 0 && !this.bullet) { this.shoot(angle); this.shootrate.current = this.shootrate.max; } else { this.shootrate.current -= dt; } if (Math.abs(r.x) > Math.abs(r.y)) { // Animation x axis if (r.x >= 0) { this.anims.play("attack_e"); } else { this.anims.play("attack_w"); } } else { // Animation y axis if (r.y >= 0) { this.anims.play("attack_s"); } else { this.anims.play("attack_n"); } } } else { this.anims.play("idle"); } } shoot(angle) { this.bullet = true; var pos = { x: this.pos.x + 8, y: this.pos.y + 8 }; var bullet = new Bullet(pos, angle, this, this.player, this.level); this.level.entities.add(bullet); } } module.exports = Mage;