/**
 * Воксельный олень (безгласная фауна v1, воксельная версия): тихая
 * серо-бурая живность у прудов. Модель строится по мировому центру (cx, cz)
 * мордой вдоль +X; шаг (step) поднимает диагональные пары ног — грубый, но
 * живой walk-цикл. Направление (dir) — поворот на четверти оборота вокруг Y,
 * олень смотрит туда, куда идёт.
 */
import { GROUND_Y } from './areas';

/** Воксель позы: позиция в мире + цвет-строка (как у VoxelCloud). */
export interface DeerVoxel {
    pos: [number, number, number];
    color: string;
}

const BODY = '#6e6156'; // серо-бурый бок
const DARK = '#54493f'; // копыта, нос, тень брюха
const LIGHT = '#7d7264'; // спина, хвост
const ANTLER = '#8a7a66'; // рога (сухое дерево)

/**
 * Поворот смещения на dir×90° вокруг Y: dir 0 — морда +X,
 * 1 — +Z, 2 — −X, 3 — −Z (модель симметрична по бокам, зеркала не нужно).
 */
export function rotXZ(dx: number, dz: number, dir: number): [number, number] {
    for (let i = 0; i < (dir & 3); i++) {
        const t = dx;
        dx = -dz;
        dz = t;
    }
    return [dx, dz];
}

/**
 * Олень в мировых координатах: ноги на земле (GROUND_Y), высота ~9 вокселей
 * (герой — 11). step — фаза шага (0/1), поднимает диагональные пары ног;
 * dir — направление взгляда (см. rotXZ).
 */
export function deerVoxels(cx: number, cz: number, step: boolean, dir = 0): DeerVoxel[] {
    const out: DeerVoxel[] = [];
    const put = (dx: number, dy: number, dz: number, color: string) => {
        const [rx, rz] = rotXZ(dx, dz, dir);
        out.push({ pos: [cx + rx, dy, cz + rz], color });
    };
    // Ноги: диагональные пары (перед-лево + зад-право) поднимаются на шаге.
    const lift = step ? 1 : 0;
    for (const [lx, lz] of [[-3, -1], [3, 1], [-3, 1], [3, -1]] as const) {
        const up = (lx === -3) === (lz === -1) ? lift : 0; // диагональ шагает
        for (let y = 0; y < 3; y++) put(lx, GROUND_Y + y + up, lz, DARK);
    }
    // Туловище: 7×2×3, спина светлее.
    for (let dx = -3; dx <= 3; dx++)
        for (let dz = -1; dz <= 1; dz++) {
            put(dx, GROUND_Y + 3, dz, dx % 2 === 0 ? BODY : DARK);
            put(dx, GROUND_Y + 4, dz, LIGHT);
        }
    // Шея и голова: вперед-вверх, нос темный, уши-рожки.
    put(4, GROUND_Y + 4, 0, BODY);
    put(4, GROUND_Y + 5, 0, BODY);
    put(5, GROUND_Y + 6, 0, BODY);
    put(6, GROUND_Y + 6, 0, DARK); // нос
    put(5, GROUND_Y + 7, 0, LIGHT);
    put(5, GROUND_Y + 7, -1, ANTLER);
    put(5, GROUND_Y + 7, 1, ANTLER);
    // Хвост.
    put(-4, GROUND_Y + 4, 0, LIGHT);
    return out;
}