Add new mob & item
This commit is contained in:
parent
bad3d62449
commit
0977914f20
Binary file not shown.
|
After Width: | Height: | Size: 22 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 15 KiB |
|
|
@ -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];
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
Loading…
Reference in New Issue