Newer
Older
rpg / apps / game / src / data / enemies.ts
/**
 * Враги демо-боя: «пепельные сгустки» — оживший пепел, просыпается от гулкого звука.
 * Чистые данные (без Pixi) — используются боевой системой и тестами.
 */

export type EnemyKindId = 'crawler' | 'spitter' | 'heavy';

export interface EnemyKindDef {
    id: EnemyKindId;
    /** Здоровье. */
    hp: number;
    /** Скорость, виртуальных пикселей/сек. */
    speed: number;
    /** Радиус тела для попаданий, пикселей. */
    radius: number;
    /** Дистанция начала атаки, пикселей. */
    attackRange: number;
    /** Урон атаки. */
    attackDamage: number;
    /** Пауза между атаками, сек. */
    attackCooldown: number;
    /** Замах до удара, сек (у ползуна 0 — контактный урон). */
    windup: number;
    /** Восстановление после удара, сек. */
    recover: number;
    /** Плевун держит дистанцию (пикселей) — отходит при сближении. */
    keepDistance?: number;
    /** Дроп «пепельной пыли». */
    motes: number;
    /** Кадры из атласа chars/clumps_sheet.json. */
    frames: [string, string];
}

export const ENEMY_KINDS: Record<EnemyKindId, EnemyKindDef> = {
    crawler: {
        id: 'crawler',
        hp: 3,
        speed: 22,
        radius: 7,
        attackRange: 12,
        attackDamage: 1,
        attackCooldown: 0.8,
        windup: 0,
        recover: 0.3,
        motes: 1,
        frames: ['clump_crawler_1', 'clump_crawler_2']
    },
    spitter: {
        id: 'spitter',
        hp: 2,
        speed: 18,
        radius: 7,
        attackRange: 90,
        attackDamage: 1,
        attackCooldown: 2.2,
        windup: 0.35,
        recover: 0.4,
        keepDistance: 70,
        motes: 1,
        frames: ['clump_spitter_1', 'clump_spitter_2']
    },
    heavy: {
        id: 'heavy',
        hp: 8,
        speed: 14,
        radius: 10,
        attackRange: 26,
        attackDamage: 2,
        attackCooldown: 2,
        windup: 0.6,
        recover: 0.5,
        motes: 3,
        frames: ['clump_heavy_1', 'clump_heavy_2']
    }
};

/** Точки спавна на лугах (тайловые координаты). */
export const ENEMY_SPAWNS_MEADOWS: { kind: EnemyKindId; tile: { x: number; y: number } }[] = [
    { kind: 'crawler', tile: { x: 8, y: 9 } },
    { kind: 'crawler', tile: { x: 10, y: 7 } },
    { kind: 'spitter', tile: { x: 20, y: 8 } },
    { kind: 'crawler', tile: { x: 22, y: 21 } },
    { kind: 'heavy', tile: { x: 6, y: 22 } }
];