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

View File

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

View File

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