1
0
Fork 0

Add new mob & item

This commit is contained in:
Pabloader 2025-07-03 14:26:25 +00:00
parent bad3d62449
commit 0977914f20
5 changed files with 44 additions and 9 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

View File

@ -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;
} }

View File

@ -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);
} }
} }
} }

View File

@ -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: