- Рендер переведён в псевдо-3D: наклонная PerspectiveCamera, пол лежит плашмя, персонажи/враги — вертикальные спрайты-биллборды, стены с высотой. Починен баг: пол создавался без поворота и стоял вертикально → «вывернутая» перспектива. - Двери видны всегда: закрыты (засов) во время боя, открытый проём после зачистки. - render/assets.ts: процедурные текстуры (спрайты персонажей/врагов, пол, стены, двери, снаряд, тень) + эффекты оружия (вспышка из дула, искры, облачко гибели). - Светлее палитра — исправлено «тёмное на тёмном». - Игра переименована в «Биндим Фигняшку»; полная русификация UI (ДАЛЬНИЙ/БЛИЖНИЙ, ИГРА ОКОНЧЕНА, ПОБЕДА); клавиши-подсказки оставлены латиницей. - Ввод по event.code → WASD/Q/R работают в любой раскладке (вкл. русскую). - theme.ts урезан до реально используемых тинтов (bg/swing/flash). - docs/ASSET_BRIEF.md — бриф и промпт на полную художку; доки синхронизированы. - Ядро (src/core) не тронуто — раунд чисто render/UI. 27 тестов + типы зелёные. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
116 lines
6.9 KiB
Markdown
116 lines
6.9 KiB
Markdown
# Биндим Фигняшку — рогалик в духе The Binding of Isaac
|
||
|
||
Top-down рогалик: процедурный данжен из комнат, два режима боя (дальний/ближний),
|
||
враги, босс. Логика на чистом TypeScript, рендер — на **three.js** в **псевдо-3D**:
|
||
наклонная камера, пол лежит плашмя, персонажи — вертикальные спрайты-биллборды
|
||
(как в Isaac). Сборка — **Bun**.
|
||
|
||
Есть **стартовое меню** с выбором уровня: данжен генерируется процедурно каждый
|
||
забег, но параметризуется набором правил (размер, плотность/сила врагов, HP, seed).
|
||
Двери видны всегда (закрыты в бою, открыты после зачистки). Графика — процедурные
|
||
ассеты в `render/assets.ts`; бриф на полную художку — в `docs/ASSET_BRIEF.md`.
|
||
|
||
> Это рабочая **база для развития**, а не готовая игра. Архитектура специально
|
||
> сделана так, чтобы её было легко расширять — и человеку, и ИИ-агентам.
|
||
> Перед доработкой прочитай [`CLAUDE.md`](./CLAUDE.md) и [`docs/HOWTO.md`](./docs/HOWTO.md).
|
||
|
||
## Быстрый старт
|
||
|
||
```bash
|
||
bun install # поставить зависимости (three, typescript)
|
||
bun run dev # дев-сервер с авто-пересборкой → http://localhost:3000
|
||
```
|
||
|
||
Продакшн-сборка:
|
||
|
||
```bash
|
||
bun run build # минифицированный бандл → dist/ (открой dist/index.html)
|
||
```
|
||
|
||
Проверки (запускай перед любым коммитом):
|
||
|
||
```bash
|
||
bun run typecheck # tsc --noEmit, строгий режим
|
||
bun test # юнит-тесты ядра
|
||
bun run check # и то, и другое разом
|
||
```
|
||
|
||
## Управление
|
||
|
||
| Клавиша | Действие |
|
||
|---|---|
|
||
| WASD | движение |
|
||
| Стрелки | прицельная стрельба/удар в направлении |
|
||
| Пробел | атака по ходу движения |
|
||
| Tab / Q | сменить оружие (Дальний ↔ Ближний) |
|
||
| R | заново (на экране Game Over / Victory) |
|
||
| Esc | вернуться в меню выбора уровня |
|
||
|
||
Клавиши привязаны к **физическим** кнопкам (`event.code`), поэтому WASD/Q/R работают
|
||
в любой раскладке (в т.ч. русской), независимо от языка ввода.
|
||
|
||
Чтобы перейти в соседнюю комнату — зачисти текущую (двери откроются) и встань на
|
||
дверь, нажимая в её сторону.
|
||
|
||
## Режимы боя
|
||
|
||
| Режим | Оружие | Скорость | Урон | Особенность |
|
||
|---|---|---|---|---|
|
||
| Дальний | пистолет | быстро (cd 10) | 1 за выстрел | снаряды летят по прямой |
|
||
| Ближний | нож | медленно (cd 22) | 2 + отбрасывание | широкий взмах |
|
||
|
||
## Типы комнат
|
||
|
||
| Тип | Описание |
|
||
|---|---|
|
||
| spawn | старт, врагов нет |
|
||
| normal | 2–4 врага |
|
||
| treasure | без врагов (комната-награда), сразу открыта |
|
||
| boss | 1 босс; его зачистка = победа |
|
||
|
||
## Стек и устройство
|
||
|
||
- **Bun** — рантайм, бандлер и тест-раннер.
|
||
- **three.js** — WebGL-рендер мира в псевдо-3D (наклонная `PerspectiveCamera`, биллборд-спрайты).
|
||
- **TypeScript (strict)** — весь код.
|
||
- Архитектура: **логика игры полностью отделена от рендера**. Ядро (`src/core/`)
|
||
не знает ни про DOM, ни про three.js, поэтому его легко тестировать и при
|
||
желании можно подменить рендер, не трогая игру.
|
||
|
||
Подробности — в [`docs/ARCHITECTURE.md`](./docs/ARCHITECTURE.md).
|
||
|
||
## Структура проекта
|
||
|
||
```
|
||
src/
|
||
├── config.ts ⭐ КОНСТАНТЫ движка: размеры, геометрия дверей, базовый баланс
|
||
├── main.ts точка входа: меню → игра, «склейка» логики/рендера/ввода
|
||
├── core/ ── ИГРОВАЯ ЛОГИКА (без DOM и three.js) ──
|
||
│ ├── Game.ts «мозг»: состояние + один шаг симуляции step()
|
||
│ ├── rules.ts ⭐ ПРАВИЛА УРОВНЯ (пресеты для меню: размер, враги, HP, seed)
|
||
│ ├── types.ts общие типы (Dir, RoomType, Box, …)
|
||
│ ├── rng.ts ГПСЧ с seed (детерминизм для тестов/отладки)
|
||
│ ├── util.ts мат-утилиты (dist, overlap, clamp, lerp)
|
||
│ ├── entities/ Player, Enemy, Projectile, MeleeSwing
|
||
│ ├── world/ Room, RoomMap (генерация), tiles
|
||
│ └── systems/ collision, spawner (чистые функции)
|
||
├── input/ ── ВВОД ──
|
||
│ ├── InputState.ts абстрактные «намерения» (не сырые клавиши)
|
||
│ └── KeyboardController.ts клавиатура → InputState
|
||
├── render/ ── РЕНДЕР (читает состояние, рисует) ──
|
||
│ ├── Renderer.ts интерфейс рендера
|
||
│ ├── ThreeRenderer.ts мир на three.js (псевдо-3D: наклон + биллборды)
|
||
│ ├── assets.ts ⭐ АССЕТЫ (процедурные спрайты/текстуры → текстуры three.js)
|
||
│ ├── theme.ts цвета/тинты мира (фон, эффекты)
|
||
│ └── HudOverlay.ts HUD и миникарта на 2D-канвасе поверх
|
||
├── ui/
|
||
│ └── StartMenu.ts стартовое меню (DOM) с выбором уровня
|
||
└── engine/
|
||
└── GameLoop.ts игровой цикл с фиксированным шагом (60 Гц)
|
||
|
||
tests/ юнит-тесты ядра (bun test)
|
||
docs/ARCHITECTURE.md архитектура и потоки данных
|
||
CLAUDE.md правила для ИИ-агентов и разработчика
|
||
docs/HOWTO.md рецепты: как добавить врага/оружие/комнату
|
||
```
|