Полный рефакторинг проекта в стабильную расширяемую базу рогалика. Почему: после разнесения single-file на модули потерялся вызов генерации карты (RoomMap не генерировал комнаты) → игра падала на старте; баг скрывался тем, что Bun-бандлер не проверяет типы. Архитектура: - Логика игры (src/core/) полностью отделена от рендера: без three.js и DOM, тестируется без браузера. - Рендер мира на three.js с ортокамерой (2D-вид); HUD/миникарта — 2D-канвас поверх. - Фиксированный игровой цикл 60 Гц + интерполяция (раньше скорость зависела от частоты кадров). - Seeded-RNG, ввод через абстрактные «намерения» (InputState). Возможности: - Стартовое меню с выбором уровня (Esc → меню). - Конфигуратор уровней: LevelRules + 5 пресетов (размер карты, плотность/сила врагов, HP, фиксированный seed). - Тема внешнего вида (render/theme.ts) — задел под кастомные ассеты. Качество: - 27 юнит-тестов ядра (генерация, симметрия дверей, коллизии, спавн, правила). - Два круга adversarial-ревью; исправлено 6 реальных багов (кнокбэк сквозь стены → софт-лок; незакрываемая сокровищница; фикс-сид после рестарта; перенос ввода между забегами; нет source maps; неточности в доках). - Документация: README, docs/ARCHITECTURE.md, CLAUDE.md, docs/HOWTO.md. - dist/ исключён из гита; bun.lock зафиксирован. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
23 lines
667 B
TypeScript
23 lines
667 B
TypeScript
/**
|
|
* Продакшн-сборка: минифицированный бандл src/main.ts → dist/main.js
|
|
* плюс копия index.html. Открывай dist/index.html.
|
|
*/
|
|
import { build } from 'bun';
|
|
|
|
const result = await build({
|
|
entrypoints: ['./src/main.ts'],
|
|
outdir: './dist',
|
|
target: 'browser',
|
|
minify: true,
|
|
sourcemap: 'external',
|
|
});
|
|
|
|
if (!result.success) {
|
|
console.error('Сборка упала:');
|
|
for (const log of result.logs) console.error(log);
|
|
process.exit(1);
|
|
}
|
|
|
|
await Bun.write('./dist/index.html', await Bun.file('./index.html').text());
|
|
console.log('Сборка готова → dist/ (открой dist/index.html)');
|