refactor: рабочая база на three.js + меню/правила уровней + доки
Полный рефакторинг проекта в стабильную расширяемую базу рогалика. Почему: после разнесения 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>
This commit is contained in:
@@ -1,35 +1,22 @@
|
||||
import { build } from "bun";
|
||||
/**
|
||||
* Продакшн-сборка: минифицированный бандл 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",
|
||||
entrypoints: ['./src/main.ts'],
|
||||
outdir: './dist',
|
||||
target: 'browser',
|
||||
minify: true,
|
||||
sourcemap: "external",
|
||||
sourcemap: 'external',
|
||||
});
|
||||
|
||||
if (!result.success) {
|
||||
console.error("Build failed", result.logs);
|
||||
console.error('Сборка упала:');
|
||||
for (const log of result.logs) console.error(log);
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
// Copy HTML template with correct script reference
|
||||
const html = `<!DOCTYPE html>
|
||||
<html lang="ru">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>Dungeon Crawl — Ranged / Melee</title>
|
||||
<style>
|
||||
*{margin:0;padding:0;box-sizing:border-box}
|
||||
body{background:#0a0a0a;display:flex;justify-content:center;align-items:center;height:100vh;font-family:monospace;overflow:hidden;user-select:none}
|
||||
canvas{display:block;border:1px solid #222;border-radius:2px;cursor:none}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<canvas id="game" width="880" height="660"></canvas>
|
||||
<script src="main.js"></script>
|
||||
</body>
|
||||
</html>`;
|
||||
|
||||
Bun.write("./dist/index.html", html);
|
||||
console.log("Build complete → dist/");
|
||||
await Bun.write('./dist/index.html', await Bun.file('./index.html').text());
|
||||
console.log('Сборка готова → dist/ (открой dist/index.html)');
|
||||
|
||||
Reference in New Issue
Block a user