diff --git a/src/games/zombies/assets/enemies/crow.jpg b/src/games/zombies/assets/enemies/crow.jpg new file mode 100644 index 0000000..0171541 Binary files /dev/null and b/src/games/zombies/assets/enemies/crow.jpg differ diff --git a/src/games/zombies/assets/weapons/slingshot.jpg b/src/games/zombies/assets/weapons/slingshot.jpg new file mode 100644 index 0000000..2524d70 Binary files /dev/null and b/src/games/zombies/assets/weapons/slingshot.jpg differ diff --git a/src/games/zombies/item.ts b/src/games/zombies/item.ts index 6ba8c5c..f9955b7 100644 --- a/src/games/zombies/item.ts +++ b/src/games/zombies/item.ts @@ -5,6 +5,7 @@ import police from './assets/characters/police.jpg'; import runner from './assets/characters/runner.jpg'; import boss from './assets/enemies/boss.jpg'; +import crow from './assets/enemies/crow.jpg'; import dog from './assets/enemies/dog.jpg'; import spider from './assets/enemies/spider.jpg'; import zombie from './assets/enemies/zombie.jpg'; @@ -21,6 +22,7 @@ import grenade from './assets/weapons/grenade.jpg'; import knife from './assets/weapons/knife.jpg'; import pistol from './assets/weapons/pistol.jpg'; import rocketLauncher from './assets/weapons/rocket_launcher.jpg'; +import slingshot from './assets/weapons/slingshot.jpg'; import shotgun from './assets/weapons/shotgun.jpg'; export const ItemType = { @@ -31,6 +33,7 @@ export const ItemType = { CHAR_RUNNER: runner, ENEMY_BOSS: boss, + ENEMY_CROW: crow, ENEMY_DOG: dog, ENEMY_SPIDER: spider, ENEMY_ZOMBIE: zombie, @@ -47,6 +50,7 @@ export const ItemType = { WEAPON_KNIFE: knife, WEAPON_PISTOL: pistol, WEAPON_ROCKET_LAUNCHER: rocketLauncher, + WEAPON_SLINGSHOT: slingshot, WEAPON_SHOTGUN: shotgun, } as const; @@ -65,12 +69,17 @@ export default class Item { get isEnemy() { return [ ItemType.ENEMY_BOSS, + ItemType.ENEMY_CROW, ItemType.ENEMY_DOG, ItemType.ENEMY_SPIDER, ItemType.ENEMY_ZOMBIE, ].includes(this.type); } + get isFlyingEnemy() { + return this.type === ItemType.ENEMY_CROW; + } + get isItem() { return [ ItemType.ITEM_FUEL, @@ -81,7 +90,7 @@ export default class Item { } get isWeapon() { - return this.isMeleeWeapon || this.isShootingWeapon || [ + return this.isMeleeWeapon || this.isRangedWeapon || [ ItemType.WEAPON_GRENADE, ItemType.WEAPON_ROCKET_LAUNCHER, ].includes(this.type); @@ -91,18 +100,27 @@ export default class Item { return [ ItemType.WEAPON_AXE, ItemType.WEAPON_KNIFE, + ItemType.ITEM_PLANKS, ].includes(this.type); } - get isShootingWeapon() { + get isRangedWeapon() { return [ ItemType.WEAPON_ASSAULT_RIFLE, ItemType.WEAPON_CROSSBOW, ItemType.WEAPON_PISTOL, + ItemType.WEAPON_SLINGSHOT, ItemType.WEAPON_SHOTGUN, ].includes(this.type); } + get isSpendingWeapon() { + return ( + this.type === ItemType.ITEM_PLANKS || + (this.type !== ItemType.WEAPON_SLINGSHOT && this.isRangedWeapon) + ); + } + get isBoss() { return this.type === ItemType.ENEMY_BOSS; } @@ -113,7 +131,7 @@ export default class Item { ItemType.WEAPON_GRENADE, ].includes(this.type); } - + toString() { return Object.entries(ItemType).find(t => t[1] === this.type)?.[0]; } diff --git a/src/games/zombies/player.ts b/src/games/zombies/player.ts index 4097286..f1226a1 100644 --- a/src/games/zombies/player.ts +++ b/src/games/zombies/player.ts @@ -45,8 +45,8 @@ export default class Player extends Character { return this.inventory.find(i => i.isMeleeWeapon); } - get gun() { - return this.inventory.find(i => i.isShootingWeapon); + get rangedWeapon() { + return this.inventory.find(i => i.isRangedWeapon); } get grenade() { @@ -83,6 +83,10 @@ export default class Player extends Character { return this.inventory[i]; } + public spendItem(item: Item | null | undefined): boolean { + return Boolean(item?.isSpendingWeapon) && this.removeItem(item); + } + public removeItem(item: Item | null | undefined): boolean { if (!item) { return false; @@ -130,6 +134,8 @@ export default class Player extends Character { /** @returns true, if action was performed */ public handleSpin(action: SpinnerAction): boolean { + const enemy = this.tile.enemy; + switch (action) { case SpinnerAction.RUN: return true; @@ -139,10 +145,17 @@ export default class Player extends Character { return true; case SpinnerAction.MELEE: - return !this.tile.enemy?.isBoss && this.meleeWeapon != null; + if (!enemy) return false; + if (enemy.isBoss) return false; + if (enemy.isFlyingEnemy) return false; + + return this.spendItem(this.meleeWeapon); case SpinnerAction.SHOOT: - return !this.tile.enemy?.isBoss && this.removeItem(this.gun); + if (!enemy) return false; + if (enemy.isBoss) return false; + + return this.spendItem(this.rangedWeapon); } } } diff --git a/src/games/zombies/tilemap.ts b/src/games/zombies/tilemap.ts index 9886304..682b7e2 100644 --- a/src/games/zombies/tilemap.ts +++ b/src/games/zombies/tilemap.ts @@ -174,6 +174,7 @@ export default class TileMap extends Entity { for (const _ in range(amount)) { const Constructor = [ ItemType.ENEMY_BOSS, + ItemType.ENEMY_CROW, ItemType.ENEMY_DOG, ItemType.ENEMY_SPIDER, ItemType.ENEMY_ZOMBIE, @@ -383,7 +384,6 @@ export default class TileMap extends Entity { private nextPlayer() { this.spinner.stop(); let overflow = false; - let startIndex = this.currentPlayerIdx; do { let nextIdx = this.currentPlayerIdx + 1; if (nextIdx >= this.players.length) { @@ -399,6 +399,10 @@ export default class TileMap extends Entity { this.currentPlayerIdx = nextIdx; } while (!this.player.active); + const numFoundPlayers = this.foundPlayers.size; + const enemiesActive = numFoundPlayers === Object.keys(Players).length + || this.players.length < numFoundPlayers; + if (this.win) { const endTile = this.tiles.findLast(t => t.type === TileType.END); if (endTile) { @@ -408,7 +412,7 @@ export default class TileMap extends Entity { } } setTimeout(alert, 2000, "🎉🎉🎉 ПОБЕДА! 🚗 🎉🎉🎉"); - } else if (overflow && this.players.length < this.foundPlayers.size) { // if someone is dead + } else if (overflow && enemiesActive) { const enemies = this.enemies; loop: