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 runner from './assets/characters/runner.jpg';
|
||||||
|
|
||||||
import boss from './assets/enemies/boss.jpg';
|
import boss from './assets/enemies/boss.jpg';
|
||||||
|
import crow from './assets/enemies/crow.jpg';
|
||||||
import dog from './assets/enemies/dog.jpg';
|
import dog from './assets/enemies/dog.jpg';
|
||||||
import spider from './assets/enemies/spider.jpg';
|
import spider from './assets/enemies/spider.jpg';
|
||||||
import zombie from './assets/enemies/zombie.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 knife from './assets/weapons/knife.jpg';
|
||||||
import pistol from './assets/weapons/pistol.jpg';
|
import pistol from './assets/weapons/pistol.jpg';
|
||||||
import rocketLauncher from './assets/weapons/rocket_launcher.jpg';
|
import rocketLauncher from './assets/weapons/rocket_launcher.jpg';
|
||||||
|
import slingshot from './assets/weapons/slingshot.jpg';
|
||||||
import shotgun from './assets/weapons/shotgun.jpg';
|
import shotgun from './assets/weapons/shotgun.jpg';
|
||||||
|
|
||||||
export const ItemType = {
|
export const ItemType = {
|
||||||
|
|
@ -31,6 +33,7 @@ export const ItemType = {
|
||||||
CHAR_RUNNER: runner,
|
CHAR_RUNNER: runner,
|
||||||
|
|
||||||
ENEMY_BOSS: boss,
|
ENEMY_BOSS: boss,
|
||||||
|
ENEMY_CROW: crow,
|
||||||
ENEMY_DOG: dog,
|
ENEMY_DOG: dog,
|
||||||
ENEMY_SPIDER: spider,
|
ENEMY_SPIDER: spider,
|
||||||
ENEMY_ZOMBIE: zombie,
|
ENEMY_ZOMBIE: zombie,
|
||||||
|
|
@ -47,6 +50,7 @@ export const ItemType = {
|
||||||
WEAPON_KNIFE: knife,
|
WEAPON_KNIFE: knife,
|
||||||
WEAPON_PISTOL: pistol,
|
WEAPON_PISTOL: pistol,
|
||||||
WEAPON_ROCKET_LAUNCHER: rocketLauncher,
|
WEAPON_ROCKET_LAUNCHER: rocketLauncher,
|
||||||
|
WEAPON_SLINGSHOT: slingshot,
|
||||||
WEAPON_SHOTGUN: shotgun,
|
WEAPON_SHOTGUN: shotgun,
|
||||||
} as const;
|
} as const;
|
||||||
|
|
||||||
|
|
@ -65,12 +69,17 @@ export default class Item {
|
||||||
get isEnemy() {
|
get isEnemy() {
|
||||||
return [
|
return [
|
||||||
ItemType.ENEMY_BOSS,
|
ItemType.ENEMY_BOSS,
|
||||||
|
ItemType.ENEMY_CROW,
|
||||||
ItemType.ENEMY_DOG,
|
ItemType.ENEMY_DOG,
|
||||||
ItemType.ENEMY_SPIDER,
|
ItemType.ENEMY_SPIDER,
|
||||||
ItemType.ENEMY_ZOMBIE,
|
ItemType.ENEMY_ZOMBIE,
|
||||||
].includes(this.type);
|
].includes(this.type);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
get isFlyingEnemy() {
|
||||||
|
return this.type === ItemType.ENEMY_CROW;
|
||||||
|
}
|
||||||
|
|
||||||
get isItem() {
|
get isItem() {
|
||||||
return [
|
return [
|
||||||
ItemType.ITEM_FUEL,
|
ItemType.ITEM_FUEL,
|
||||||
|
|
@ -81,7 +90,7 @@ export default class Item {
|
||||||
}
|
}
|
||||||
|
|
||||||
get isWeapon() {
|
get isWeapon() {
|
||||||
return this.isMeleeWeapon || this.isShootingWeapon || [
|
return this.isMeleeWeapon || this.isRangedWeapon || [
|
||||||
ItemType.WEAPON_GRENADE,
|
ItemType.WEAPON_GRENADE,
|
||||||
ItemType.WEAPON_ROCKET_LAUNCHER,
|
ItemType.WEAPON_ROCKET_LAUNCHER,
|
||||||
].includes(this.type);
|
].includes(this.type);
|
||||||
|
|
@ -91,18 +100,27 @@ export default class Item {
|
||||||
return [
|
return [
|
||||||
ItemType.WEAPON_AXE,
|
ItemType.WEAPON_AXE,
|
||||||
ItemType.WEAPON_KNIFE,
|
ItemType.WEAPON_KNIFE,
|
||||||
|
ItemType.ITEM_PLANKS,
|
||||||
].includes(this.type);
|
].includes(this.type);
|
||||||
}
|
}
|
||||||
|
|
||||||
get isShootingWeapon() {
|
get isRangedWeapon() {
|
||||||
return [
|
return [
|
||||||
ItemType.WEAPON_ASSAULT_RIFLE,
|
ItemType.WEAPON_ASSAULT_RIFLE,
|
||||||
ItemType.WEAPON_CROSSBOW,
|
ItemType.WEAPON_CROSSBOW,
|
||||||
ItemType.WEAPON_PISTOL,
|
ItemType.WEAPON_PISTOL,
|
||||||
|
ItemType.WEAPON_SLINGSHOT,
|
||||||
ItemType.WEAPON_SHOTGUN,
|
ItemType.WEAPON_SHOTGUN,
|
||||||
].includes(this.type);
|
].includes(this.type);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
get isSpendingWeapon() {
|
||||||
|
return (
|
||||||
|
this.type === ItemType.ITEM_PLANKS ||
|
||||||
|
(this.type !== ItemType.WEAPON_SLINGSHOT && this.isRangedWeapon)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
get isBoss() {
|
get isBoss() {
|
||||||
return this.type === ItemType.ENEMY_BOSS;
|
return this.type === ItemType.ENEMY_BOSS;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -45,8 +45,8 @@ export default class Player extends Character {
|
||||||
return this.inventory.find(i => i.isMeleeWeapon);
|
return this.inventory.find(i => i.isMeleeWeapon);
|
||||||
}
|
}
|
||||||
|
|
||||||
get gun() {
|
get rangedWeapon() {
|
||||||
return this.inventory.find(i => i.isShootingWeapon);
|
return this.inventory.find(i => i.isRangedWeapon);
|
||||||
}
|
}
|
||||||
|
|
||||||
get grenade() {
|
get grenade() {
|
||||||
|
|
@ -83,6 +83,10 @@ export default class Player extends Character {
|
||||||
return this.inventory[i];
|
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 {
|
public removeItem(item: Item | null | undefined): boolean {
|
||||||
if (!item) {
|
if (!item) {
|
||||||
return false;
|
return false;
|
||||||
|
|
@ -130,6 +134,8 @@ export default class Player extends Character {
|
||||||
|
|
||||||
/** @returns true, if action was performed */
|
/** @returns true, if action was performed */
|
||||||
public handleSpin(action: SpinnerAction): boolean {
|
public handleSpin(action: SpinnerAction): boolean {
|
||||||
|
const enemy = this.tile.enemy;
|
||||||
|
|
||||||
switch (action) {
|
switch (action) {
|
||||||
case SpinnerAction.RUN:
|
case SpinnerAction.RUN:
|
||||||
return true;
|
return true;
|
||||||
|
|
@ -139,10 +145,17 @@ export default class Player extends Character {
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
case SpinnerAction.MELEE:
|
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:
|
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)) {
|
for (const _ in range(amount)) {
|
||||||
const Constructor = [
|
const Constructor = [
|
||||||
ItemType.ENEMY_BOSS,
|
ItemType.ENEMY_BOSS,
|
||||||
|
ItemType.ENEMY_CROW,
|
||||||
ItemType.ENEMY_DOG,
|
ItemType.ENEMY_DOG,
|
||||||
ItemType.ENEMY_SPIDER,
|
ItemType.ENEMY_SPIDER,
|
||||||
ItemType.ENEMY_ZOMBIE,
|
ItemType.ENEMY_ZOMBIE,
|
||||||
|
|
@ -383,7 +384,6 @@ export default class TileMap extends Entity {
|
||||||
private nextPlayer() {
|
private nextPlayer() {
|
||||||
this.spinner.stop();
|
this.spinner.stop();
|
||||||
let overflow = false;
|
let overflow = false;
|
||||||
let startIndex = this.currentPlayerIdx;
|
|
||||||
do {
|
do {
|
||||||
let nextIdx = this.currentPlayerIdx + 1;
|
let nextIdx = this.currentPlayerIdx + 1;
|
||||||
if (nextIdx >= this.players.length) {
|
if (nextIdx >= this.players.length) {
|
||||||
|
|
@ -399,6 +399,10 @@ export default class TileMap extends Entity {
|
||||||
this.currentPlayerIdx = nextIdx;
|
this.currentPlayerIdx = nextIdx;
|
||||||
} while (!this.player.active);
|
} while (!this.player.active);
|
||||||
|
|
||||||
|
const numFoundPlayers = this.foundPlayers.size;
|
||||||
|
const enemiesActive = numFoundPlayers === Object.keys(Players).length
|
||||||
|
|| this.players.length < numFoundPlayers;
|
||||||
|
|
||||||
if (this.win) {
|
if (this.win) {
|
||||||
const endTile = this.tiles.findLast(t => t.type === TileType.END);
|
const endTile = this.tiles.findLast(t => t.type === TileType.END);
|
||||||
if (endTile) {
|
if (endTile) {
|
||||||
|
|
@ -408,7 +412,7 @@ export default class TileMap extends Entity {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
setTimeout(alert, 2000, "🎉🎉🎉 ПОБЕДА! 🚗 🎉🎉🎉");
|
setTimeout(alert, 2000, "🎉🎉🎉 ПОБЕДА! 🚗 🎉🎉🎉");
|
||||||
} else if (overflow && this.players.length < this.foundPlayers.size) { // if someone is dead
|
} else if (overflow && enemiesActive) {
|
||||||
const enemies = this.enemies;
|
const enemies = this.enemies;
|
||||||
|
|
||||||
loop:
|
loop:
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue