Phase 0: Project setup for agent-driven development
- Phaser 3 + bitECS 0.4 + TypeScript + Vite stack - BootScene with title screen - 6 cursor rules (project context, agent workflow, ECS, chemistry, Phaser, data) - Vitest configured with happy-dom - GDD, engine analysis, implementation plan, progress tracking Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
30
.cursor/rules/agent-workflow.mdc
Normal file
30
.cursor/rules/agent-workflow.mdc
Normal file
@@ -0,0 +1,30 @@
|
||||
---
|
||||
description: Agent development workflow — visual feedback, testing, progress tracking
|
||||
alwaysApply: true
|
||||
---
|
||||
|
||||
# Agent Workflow
|
||||
|
||||
## Visual Verification
|
||||
After ANY visual change, verify via Playwright browser tools:
|
||||
1. Ensure dev server is running (`npm run dev`)
|
||||
2. Navigate to `http://localhost:5173`
|
||||
3. Take screenshot to see result
|
||||
4. Check browser console for errors
|
||||
5. Fix issues before moving on
|
||||
|
||||
## Testing Strategy
|
||||
- **Chemistry, ecology, math** — write vitest tests FIRST, then implement
|
||||
- **Visual/rendering** — verify via Playwright screenshots
|
||||
- Run `npm run test:run` after logic changes
|
||||
|
||||
## After Completing a Task
|
||||
1. Verify it works (test or screenshot)
|
||||
2. Update `PROGRESS.md` — mark task complete, add date
|
||||
3. Check `IMPLEMENTATION-PLAN.md` for what's next
|
||||
|
||||
## Code Standards
|
||||
- TypeScript strict mode — no `any`, no unsafe `as` casts
|
||||
- Pure functions for ECS systems
|
||||
- Descriptive variable names (not `x`, `tmp`, `data`)
|
||||
- Comments explain WHY, not WHAT
|
||||
40
.cursor/rules/chemistry-engine.mdc
Normal file
40
.cursor/rules/chemistry-engine.mdc
Normal file
@@ -0,0 +1,40 @@
|
||||
---
|
||||
description: Chemistry engine — real science constraints and data patterns
|
||||
globs: src/chemistry/**/*.ts
|
||||
alwaysApply: false
|
||||
---
|
||||
|
||||
# Chemistry Engine Rules
|
||||
|
||||
## Scientific Accuracy
|
||||
All chemical data must be **real** (simplified, never fabricated):
|
||||
- Element properties: atomic number, mass, electronegativity, group, period
|
||||
- Reactions: real products, real conditions (temperature, catalyst)
|
||||
- Failed reactions return a **reason**: "Requires catalyst", "Insufficient energy"
|
||||
|
||||
## Element Interface
|
||||
```typescript
|
||||
interface Element {
|
||||
symbol: string; // "Na"
|
||||
name: string; // "Sodium"
|
||||
atomicNumber: number; // 11
|
||||
atomicMass: number; // 22.99
|
||||
electronegativity: number;
|
||||
category: ElementCategory;
|
||||
state: MatterState; // at room temperature
|
||||
color: string; // hex for rendering
|
||||
}
|
||||
```
|
||||
|
||||
## Reaction Lookup
|
||||
Reactions indexed by **sorted reactant key** for O(1) lookup:
|
||||
```typescript
|
||||
// "Cl+Na" → { products: [{ symbol: "NaCl", ... }], ... }
|
||||
function reactionKey(symbols: string[]): string {
|
||||
return [...symbols].sort().join('+');
|
||||
}
|
||||
```
|
||||
|
||||
## Every Reaction Includes
|
||||
- `description`: human-readable explanation of the science
|
||||
- `failureReason`: if conditions not met, explain WHY (this is the teaching mechanism)
|
||||
36
.cursor/rules/data-files.mdc
Normal file
36
.cursor/rules/data-files.mdc
Normal file
@@ -0,0 +1,36 @@
|
||||
---
|
||||
description: Game data JSON schema and validation conventions
|
||||
globs: src/data/**/*.json
|
||||
alwaysApply: false
|
||||
---
|
||||
|
||||
# Data File Conventions
|
||||
|
||||
## General Rules
|
||||
- Every entity has a unique `id` field (string)
|
||||
- Cross-references use `id` strings, never array indices
|
||||
- Every entry has a `description` field (feeds the in-game Codex)
|
||||
- Data must be valid JSON — no comments, no trailing commas
|
||||
|
||||
## elements.json
|
||||
Array of Element objects. Keyed by `symbol`. All values from real periodic table.
|
||||
```json
|
||||
{
|
||||
"symbol": "Na",
|
||||
"name": "Sodium",
|
||||
"nameRu": "Натрий",
|
||||
"atomicNumber": 11,
|
||||
"atomicMass": 22.99,
|
||||
"electronegativity": 0.93,
|
||||
"category": "alkali-metal",
|
||||
"state": "solid",
|
||||
"color": "#c8c8c8",
|
||||
"description": "Мягкий щелочной металл. Бурно реагирует с водой."
|
||||
}
|
||||
```
|
||||
|
||||
## reactions.json
|
||||
Array of Reaction objects. Include science explanation and failure reasons.
|
||||
|
||||
## Validation
|
||||
All JSON is loaded and type-checked at boot. Schema mismatches crash with clear errors — never silently ignore bad data.
|
||||
65
.cursor/rules/ecs-patterns.mdc
Normal file
65
.cursor/rules/ecs-patterns.mdc
Normal file
@@ -0,0 +1,65 @@
|
||||
---
|
||||
description: bitECS 0.4 component and system conventions
|
||||
globs: src/ecs/**/*.ts
|
||||
alwaysApply: false
|
||||
---
|
||||
|
||||
# ECS Patterns (bitECS 0.4)
|
||||
|
||||
## Components — Plain Objects with Arrays
|
||||
```typescript
|
||||
// ✅ GOOD: plain object with number arrays
|
||||
export const Position = { x: [] as number[], y: [] as number[] };
|
||||
export const Health = { current: [] as number[], max: [] as number[] };
|
||||
|
||||
// ❌ BAD: old API (defineComponent, Types) — removed in 0.4
|
||||
```
|
||||
|
||||
## Entity Lifecycle
|
||||
```typescript
|
||||
import { createWorld, addEntity, addComponent, removeEntity } from 'bitecs';
|
||||
|
||||
const world = createWorld();
|
||||
const eid = addEntity(world);
|
||||
addComponent(world, eid, Position);
|
||||
Position.x[eid] = 100;
|
||||
Position.y[eid] = 200;
|
||||
```
|
||||
|
||||
## Queries — Direct Function Calls
|
||||
```typescript
|
||||
import { query, Not } from 'bitecs';
|
||||
|
||||
// ✅ 0.4 API: query(world, components)
|
||||
const entities = query(world, [Position, Velocity]);
|
||||
for (const eid of entities) {
|
||||
Position.x[eid] += Velocity.x[eid] * delta;
|
||||
}
|
||||
|
||||
// Operators: Not, And, Or, Any, None
|
||||
const stationary = query(world, [Position, Not(Velocity)]);
|
||||
```
|
||||
|
||||
## Observers (replace enterQuery/exitQuery)
|
||||
```typescript
|
||||
import { observe, onAdd, onRemove } from 'bitecs';
|
||||
|
||||
observe(world, onAdd(Position), (eid) => { /* entity gained Position */ });
|
||||
observe(world, onRemove(Position), (eid) => { /* entity lost Position */ });
|
||||
```
|
||||
|
||||
## Systems — Pure Functions
|
||||
```typescript
|
||||
export const movementSystem = (world: World, delta: number) => {
|
||||
for (const eid of query(world, [Position, Velocity])) {
|
||||
Position.x[eid] += Velocity.x[eid] * delta;
|
||||
Position.y[eid] += Velocity.y[eid] * delta;
|
||||
}
|
||||
};
|
||||
```
|
||||
|
||||
## Rules
|
||||
- Components = plain objects with `[] as number[]` fields
|
||||
- Never store strings in components — use numeric IDs, look up in registry
|
||||
- Systems must not create Phaser objects — only the sync bridge does that
|
||||
- Parameter order: `addComponent(world, eid, component)` (world first, then eid)
|
||||
44
.cursor/rules/phaser-scenes.mdc
Normal file
44
.cursor/rules/phaser-scenes.mdc
Normal file
@@ -0,0 +1,44 @@
|
||||
---
|
||||
description: Phaser scene lifecycle and conventions
|
||||
globs: src/scenes/**/*.ts
|
||||
alwaysApply: false
|
||||
---
|
||||
|
||||
# Phaser Scene Conventions
|
||||
|
||||
## Lifecycle
|
||||
```
|
||||
constructor → init(data) → preload() → create() → update(time, delta)
|
||||
```
|
||||
- `init`: receive data from scene transitions
|
||||
- `preload`: load assets (prefer doing this only in BootScene)
|
||||
- `create`: set up game objects, physics, input, cameras
|
||||
- `update`: run ECS systems, sync bridge
|
||||
|
||||
## Scene Structure
|
||||
```typescript
|
||||
export class GameScene extends Phaser.Scene {
|
||||
constructor() {
|
||||
super({ key: 'GameScene' });
|
||||
}
|
||||
|
||||
create(): void {
|
||||
// 1. Initialize ECS world
|
||||
// 2. Create tilemap
|
||||
// 3. Spawn entities
|
||||
// 4. Set up camera
|
||||
// 5. Launch UI overlay
|
||||
this.scene.launch('UIScene');
|
||||
}
|
||||
|
||||
update(time: number, delta: number): void {
|
||||
// Run ECS systems in defined order
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Rules
|
||||
- Full transition: `this.scene.start('Name', { data })`
|
||||
- Overlay: `this.scene.launch('Name')` (for HUD, menus)
|
||||
- Never put game logic in scenes — delegate to ECS systems
|
||||
- Scenes manage Phaser objects; ECS manages game state
|
||||
28
.cursor/rules/project-context.mdc
Normal file
28
.cursor/rules/project-context.mdc
Normal file
@@ -0,0 +1,28 @@
|
||||
---
|
||||
description: Core project context for Synthesis — scientific roguelike
|
||||
alwaysApply: true
|
||||
---
|
||||
|
||||
# Synthesis — Project Context
|
||||
|
||||
## What Is This
|
||||
2D scientific roguelike (TypeScript + Phaser 3 + bitECS + Vite). Real science replaces magic. Player combines real chemical elements, builds mechanisms using physics, tames creatures through biology, manipulates NPCs via cognitive biases.
|
||||
|
||||
## Architecture
|
||||
- **Phaser 3** — rendering, physics, input, audio, scenes
|
||||
- **bitECS** — entity-component-system for game logic (TypedArrays, systems = pure functions)
|
||||
- **Vite** — build + HMR
|
||||
- Phaser handles rendering; bitECS handles logic. They sync via a bridge layer.
|
||||
|
||||
## Key Files
|
||||
- `synthesis-gdd.md` — Game Design Document (source of truth for ALL design decisions)
|
||||
- `engine-analysis.md` — Technical stack rationale
|
||||
- `IMPLEMENTATION-PLAN.md` — Phased development roadmap
|
||||
- `PROGRESS.md` — Current status (**update after completing tasks**)
|
||||
|
||||
## Design Principles
|
||||
1. All science must be **real** (simplified, never wrong)
|
||||
2. Every failed experiment teaches WHY it failed
|
||||
3. Death is a feature, not punishment — it's a cycle phase
|
||||
4. Cycles everywhere: gameplay, visuals, audio, narrative
|
||||
5. Data-driven: game data in `src/data/*.json`, logic in TypeScript
|
||||
5
.gitignore
vendored
Normal file
5
.gitignore
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
node_modules/
|
||||
dist/
|
||||
.vite/
|
||||
*.local
|
||||
.DS_Store
|
||||
248
IMPLEMENTATION-PLAN.md
Normal file
248
IMPLEMENTATION-PLAN.md
Normal file
@@ -0,0 +1,248 @@
|
||||
# Synthesis — Implementation Plan
|
||||
|
||||
## Overview
|
||||
|
||||
**Target:** Vertical Slice — один полный ран через один биом (Каталитические Пустоши)
|
||||
**Approach:** Каждая фаза даёт тестируемый, играбельный инкремент
|
||||
**Method:** Полностью агентная разработка (AI пишет код, проверяет через Playwright и vitest)
|
||||
|
||||
---
|
||||
|
||||
## Phase 0: Project Setup ✅
|
||||
|
||||
**Цель:** Собираемый, запускаемый проект с dev-инструментарием
|
||||
|
||||
| # | Задача | Статус |
|
||||
|---|--------|--------|
|
||||
| 0.1 | Инициализация npm + зависимости (Phaser, bitECS, Vite, Vitest) | ✅ |
|
||||
| 0.2 | TypeScript strict конфигурация | ✅ |
|
||||
| 0.3 | Vite конфигурация (HMR, chunk splitting) | ✅ |
|
||||
| 0.4 | Phaser game config (1280x720, pixel-art, arcade physics) | ✅ |
|
||||
| 0.5 | BootScene с титульным экраном | ✅ |
|
||||
| 0.6 | Cursor rules (6 правил под предметную область) | ✅ |
|
||||
| 0.7 | Implementation plan + progress tracking | ✅ |
|
||||
|
||||
**Критерий готовности:**
|
||||
- `npm run dev` запускает dev-сервер
|
||||
- Титульный экран виден на localhost:5173
|
||||
- TypeScript компилируется без ошибок
|
||||
|
||||
---
|
||||
|
||||
## Phase 1: Chemistry Engine
|
||||
|
||||
**Цель:** Ядро химической системы — элементы, реакции, соединения
|
||||
**Зависимости:** Phase 0
|
||||
**Это чистая логика — идеальна для TDD (vitest)**
|
||||
|
||||
| # | Задача | Описание |
|
||||
|---|--------|----------|
|
||||
| 1.1 | Типы и интерфейсы | `Element`, `Reaction`, `Compound`, `ReactionResult`, `ElementCategory`, `MatterState` |
|
||||
| 1.2 | Данные: 20 элементов | H, He, C, N, O, Na, Mg, Al, Si, P, S, Cl, K, Ca, Fe, Cu, Zn, Sn, Hg, Au — из реальной таблицы Менделеева |
|
||||
| 1.3 | Реестр элементов | Загрузка из JSON, lookup по symbol/atomicNumber, валидация |
|
||||
| 1.4 | Движок реакций | Ввод: элементы + условия → вывод: продукт ИЛИ причина неудачи. Lookup по отсортированному ключу реагентов (O(1)) |
|
||||
| 1.5 | Данные: 50 реакций | Базовые: горение, окисление, кислотно-щелочные, синтез солей, органика. Каждая с описанием науки |
|
||||
| 1.6 | Соединения | Свойства: формула, название, игровой эффект, состояние, масса. Реестр с lookup |
|
||||
| 1.7 | Тесты | Загрузка элементов, lookup, все 50 реакций (корректные продукты), невалидные реакции (корректные причины отказа) |
|
||||
|
||||
**Критерий готовности:**
|
||||
- `npm run test:run` — все тесты химии проходят
|
||||
- Na + Cl → NaCl, H + H + O → H₂O, и т.д.
|
||||
- Невалидная реакция возвращает человекочитаемую причину
|
||||
- Все данные элементов соответствуют реальной таблице Менделеева
|
||||
|
||||
---
|
||||
|
||||
## Phase 2: ECS Foundation
|
||||
|
||||
**Цель:** Работающая ECS с мостом к Phaser-рендерингу
|
||||
**Зависимости:** Phase 0
|
||||
|
||||
| # | Задача | Описание |
|
||||
|---|--------|----------|
|
||||
| 2.1 | World setup | bitECS world + контейнер времени (delta, elapsed, tick) |
|
||||
| 2.2 | Core components | `Position`, `Velocity`, `SpriteRef`, `Health`, `ChemicalComposition` |
|
||||
| 2.3 | Movement system | Обновляет Position по Velocity * delta |
|
||||
| 2.4 | Phaser ↔ bitECS bridge | Синхронизация: ECS Position → Phaser sprite.x/y. Создание/удаление спрайтов по enterQuery/exitQuery |
|
||||
| 2.5 | Entity factory | `createEntity(world, components)` → eid. Фабрика для типовых сущностей |
|
||||
| 2.6 | Health system | Урон, лечение, смерть при health ≤ 0 |
|
||||
| 2.7 | Визуальный тест | 10-20 цветных кругов двигаются по экрану — проверить скриншотом |
|
||||
|
||||
**Критерий готовности:**
|
||||
- Сущности рендерятся как спрайты/графика
|
||||
- Движение работает (видно на скриншоте)
|
||||
- Удаление сущности убирает спрайт с экрана
|
||||
|
||||
---
|
||||
|
||||
## Phase 3: World Generation
|
||||
|
||||
**Цель:** Процедурный тайлмап для Каталитических Пустошей
|
||||
**Зависимости:** Phase 2
|
||||
|
||||
| # | Задача | Описание |
|
||||
|---|--------|----------|
|
||||
| 3.1 | Tilemap система | Phaser Tilemap из data-driven определений тайлов |
|
||||
| 3.2 | Biome data | `biomes.json` — Каталитические Пустоши: типы тайлов, распределение, цвета |
|
||||
| 3.3 | Noise генерация | simplex-noise для terrain. Высота → тип тайла. Seed-based для воспроизводимости |
|
||||
| 3.4 | Типы тайлов | Выжженная земля, кислотные озёра, кристаллические формации, гейзеры, минеральные жилы |
|
||||
| 3.5 | Размещение ресурсов | Руды/минералы на основе параметров биома и noise-карты |
|
||||
| 3.6 | Камера | Следование за игроком, zoom (колесо мыши), clamp по границам карты |
|
||||
| 3.7 | Миникарта | Упрощённая мини-карта в углу (цветные пиксели по тайлам) |
|
||||
|
||||
**Критерий готовности:**
|
||||
- Карта генерируется с разнообразным рельефом
|
||||
- Разные тайлы визуально отличимы
|
||||
- Камера плавно следует за «игроком»
|
||||
- Каждый запуск даёт уникальную карту
|
||||
|
||||
---
|
||||
|
||||
## Phase 4: Player Systems
|
||||
|
||||
**Цель:** Играбельный персонаж: движение, сбор, крафт, бросок
|
||||
**Зависимости:** Phase 2, Phase 1, Phase 3
|
||||
|
||||
| # | Задача | Описание |
|
||||
|---|--------|----------|
|
||||
| 4.1 | Player entity + контроллер | WASD движение, мышь — направление/взаимодействие |
|
||||
| 4.2 | Инвентарь | Весовой (атомные массы!), слоты, stack одинаковых элементов |
|
||||
| 4.3 | Сбор элементов | Взаимодействие с объектами мира (руда, озеро, растение) → элемент в инвентарь |
|
||||
| 4.4 | Крафтинг | Выбрать элементы → химический движок → результат/ошибка → в инвентарь |
|
||||
| 4.5 | Система броска | ПКМ — запуск элемента/соединения как снаряда. Arcade physics для полёта |
|
||||
| 4.6 | Quick slots | Клавиши 1-2-3-4 для быстрого переключения подготовленных предметов |
|
||||
| 4.7 | HUD | UIScene поверх GameScene: кольцо здоровья, полоска инвентаря, инфо об элементе при наведении |
|
||||
|
||||
**Критерий готовности:**
|
||||
- Игрок ходит по карте WASD
|
||||
- Подбирает элементы с земли
|
||||
- Комбинирует на верстаке — видит результат или причину неудачи
|
||||
- Бросает натрий в воду — экзотермическая реакция
|
||||
- HUD показывает здоровье, инвентарь, quick slots
|
||||
|
||||
---
|
||||
|
||||
## Phase 5: Creatures & Ecology
|
||||
|
||||
**Цель:** Живая экосистема в Каталитических Пустошах
|
||||
**Зависимости:** Phase 2, Phase 3
|
||||
|
||||
| # | Задача | Описание |
|
||||
|---|--------|----------|
|
||||
| 5.1 | Данные существ | 3 типа: Кристаллиды (медленные, прочные), Ацидофилы (кислотные), Реагенты (парные, взрывоопасные) |
|
||||
| 5.2 | AI поведение | FSM: idle → wander → feed → flee → attack. Переходы по условиям (голод, угроза, территория) |
|
||||
| 5.3 | Метаболизм | Что ест, что выделяет. Ацидофилы едят минералы → выделяют кислоту |
|
||||
| 5.4 | Популяционная динамика | Упрощённые Лотка-Вольтерра: рождаемость, смертность, хищничество |
|
||||
| 5.5 | Жизненный цикл | Яйцо → юность → зрелость → старение → смерть → разложение (→ нутриенты) |
|
||||
| 5.6 | Взаимодействие | Наблюдение (кодекс), атака, базовое приручение |
|
||||
| 5.7 | Тест экосистемы | Запустить без игрока: популяции должны колебаться, не вымирать полностью |
|
||||
|
||||
**Критерий готовности:**
|
||||
- Существа спавнятся, двигаются, едят, размножаются, умирают
|
||||
- Популяция без вмешательства достигает динамического равновесия
|
||||
- Истребление хищников → перенаселение травоядных → коллапс (эмерджентно!)
|
||||
- Существа реагируют на игрока
|
||||
|
||||
---
|
||||
|
||||
## Phase 6: Run Cycle
|
||||
|
||||
**Цель:** Полный рогалик-цикл: рождение → смерть → перерождение
|
||||
**Зависимости:** Phase 3, Phase 4, Phase 1
|
||||
|
||||
| # | Задача | Описание |
|
||||
|---|--------|----------|
|
||||
| 6.1 | Споровая Колыбель | Сцена пробуждения: выбор школы (Алхимик для начала) |
|
||||
| 6.2 | Триггер смерти | Health ≤ 0 → запуск death sequence |
|
||||
| 6.3 | Анимация смерти | Тело Адепта распадается на элементы (реальный состав: 65% O, 18% C, 10% H...) |
|
||||
| 6.4 | «Момент между» | WebGL fractal shader — психоделическая визуализация перерождения |
|
||||
| 6.5 | Мета-прогрессия | Кодекс (открытые элементы/реакции), споры (валюта), persistence (IndexedDB) |
|
||||
| 6.6 | Фазы рана | Пробуждение → Исследование → Эскалация → Кризис → Развязка. Таймер/прогрессия |
|
||||
| 6.7 | Эскалация | Нарастающая энтропия: нестабильные реакции, агрессивные существа |
|
||||
| 6.8 | Кризис: Химическая Чума | Цепная реакция отравляет атмосферу. Нужна химия для нейтрализации |
|
||||
| 6.9 | Школа: Алхимик | Стартовый набор (H, O, C, Na, S, Fe), принцип (химическое равновесие) |
|
||||
|
||||
**Критерий готовности:**
|
||||
- Полный цикл: spawn → explore → gather → craft → die → fractal → respawn
|
||||
- Кодекс сохраняется между ранами
|
||||
- Споры начисляются за открытия
|
||||
- Эскалация ощутимо меняет поведение мира
|
||||
- Кризис запускается и решается через химию
|
||||
- Fractal shader работает (даже простой вариант)
|
||||
|
||||
---
|
||||
|
||||
## Phase 7: Mycelium
|
||||
|
||||
**Цель:** Подземная сеть, связывающая раны
|
||||
**Зависимости:** Phase 6
|
||||
|
||||
| # | Задача | Описание |
|
||||
|---|--------|----------|
|
||||
| 7.1 | Граф Мицелия | Структура данных (ngraph): узлы, рёбра, метаданные |
|
||||
| 7.2 | Грибные узлы | Точки на карте, где Мицелий выходит на поверхность. Визуально — светящиеся споты |
|
||||
| 7.3 | Запись знаний | Депозит открытий в Мицелий для будущих ранов |
|
||||
| 7.4 | Извлечение знаний | «Вспышки» — фрагменты воспоминаний из прошлых ранов |
|
||||
| 7.5 | Микоз | Визуальное искажение при долгом контакте с узлом. Открывает скрытую информацию |
|
||||
| 7.6 | Интеграция с Колыбелью | Стартовые бонусы за споры |
|
||||
|
||||
**Критерий готовности:**
|
||||
- Узлы видны на карте
|
||||
- Взаимодействие с узлом показывает память прошлого рана
|
||||
- Знание из рана N появляется как подсказка в ране N+1
|
||||
- Микоз-эффект визуально работает
|
||||
- Споры тратятся на бонусы при старте рана
|
||||
|
||||
---
|
||||
|
||||
## Phase 8: First Archont — Ouroboros
|
||||
|
||||
**Цель:** Первый босс-бой (головоломка, не рефлексы)
|
||||
**Зависимости:** Phase 5, Phase 6
|
||||
|
||||
| # | Задача | Описание |
|
||||
|---|--------|----------|
|
||||
| 8.1 | Уроборос entity | Змей, поедающий хвост. Циклические фазы атаки |
|
||||
| 8.2 | Паттерн-механика | Бой = петля с нарастающей сложностью. Игрок определяет паттерн и ломает его в нужный момент |
|
||||
| 8.3 | Арена | Специальная генерируемая комната на подступах к Сердцу Синтеза |
|
||||
| 8.4 | Множественные решения | Химическое, физическое, наблюдательное — минимум 3 пути к победе |
|
||||
| 8.5 | Награда | Архонтова Память — лор-фрагмент в Кодексе, спорная щедрая награда |
|
||||
|
||||
**Критерий готовности:**
|
||||
- Бой имеет узнаваемый повторяющийся паттерн
|
||||
- Паттерн усложняется с каждым циклом
|
||||
- Минимум 2 валидных стратегии победы работают
|
||||
- Победа добавляет лор в Кодекс
|
||||
|
||||
---
|
||||
|
||||
## Vertical Slice = Phase 0–8
|
||||
|
||||
После Phase 8 игра содержит:
|
||||
- ✅ Один полный биом (Каталитические Пустоши)
|
||||
- ✅ Работающая химия (~20 элементов, ~50 реакций)
|
||||
- ✅ Живая экосистема (3 вида существ с динамикой популяций)
|
||||
- ✅ Полный цикл рана (рождение → смерть → перерождение)
|
||||
- ✅ Мета-прогрессия между ранами (Кодекс, споры)
|
||||
- ✅ Мицелий (память между ранами)
|
||||
- ✅ Один босс (Уроборос)
|
||||
- ✅ Фрактальная сцена смерти
|
||||
- ✅ Одна школа (Алхимик)
|
||||
- ✅ Один тип кризиса (Химическая Чума)
|
||||
|
||||
Это — вертикальный срез, описанный в GDD Section X.
|
||||
|
||||
---
|
||||
|
||||
## Beyond Vertical Slice (Post-MVP)
|
||||
|
||||
| Фаза | Содержание |
|
||||
|-------|-----------|
|
||||
| Phase 9 | +2 биома (Кинетические Горы, Вердантовые Леса), +20 элементов, +100 реакций |
|
||||
| Phase 10 | +3 школы (Механик, Натуралист, Навигатор), принципы физики и биологии |
|
||||
| Phase 11 | Великий цикл (7 ранов): следы между ранами, Великое Обновление |
|
||||
| Phase 12 | +3 Архонта (Спора Прайма, Энтропа, Когнитон) |
|
||||
| Phase 13 | Оставшиеся биомы + школы + существа |
|
||||
| Phase 14 | Сердце Синтеза (финальный регион), нарратив |
|
||||
| Phase 15 | Аудио: лупы, эмбиент, циклические саундскейпы |
|
||||
| Phase 16 | Полировка: шейдеры, частицы, UI/UX, accessibility |
|
||||
52
PROGRESS.md
Normal file
52
PROGRESS.md
Normal file
@@ -0,0 +1,52 @@
|
||||
# Synthesis — Development Progress
|
||||
|
||||
> **Last updated:** 2026-02-12
|
||||
> **Current phase:** Phase 0 ✅ → Ready for Phase 1
|
||||
|
||||
---
|
||||
|
||||
## Completed
|
||||
|
||||
### Phase 0: Project Setup ✅
|
||||
- [x] Game Design Document (`synthesis-gdd.md`)
|
||||
- [x] Engine analysis and tech stack selection (`engine-analysis.md`)
|
||||
- [x] npm project + dependencies (Phaser 3, bitECS, TypeScript, Vite, Vitest)
|
||||
- [x] TypeScript strict config
|
||||
- [x] Vite config (HMR, chunk splitting)
|
||||
- [x] Phaser config (1280x720, pixel-art, arcade physics, top-down)
|
||||
- [x] BootScene with title screen
|
||||
- [x] Cursor rules (6 rules: project context, agent workflow, ECS, chemistry, Phaser, data)
|
||||
- [x] Implementation plan (`IMPLEMENTATION-PLAN.md`)
|
||||
- [x] Progress tracking (this file)
|
||||
|
||||
---
|
||||
|
||||
## In Progress
|
||||
|
||||
_None — ready to begin Phase 1_
|
||||
|
||||
---
|
||||
|
||||
## Up Next: Phase 1 — Chemistry Engine
|
||||
|
||||
- [ ] 1.1 Types and interfaces (`Element`, `Reaction`, `Compound`)
|
||||
- [ ] 1.2 Element data — 20 real elements (JSON)
|
||||
- [ ] 1.3 Element registry with lookup
|
||||
- [ ] 1.4 Reaction engine core
|
||||
- [ ] 1.5 Reaction data — 50 real reactions (JSON)
|
||||
- [ ] 1.6 Compound properties
|
||||
- [ ] 1.7 Unit tests (vitest)
|
||||
|
||||
---
|
||||
|
||||
## Blockers
|
||||
|
||||
None
|
||||
|
||||
---
|
||||
|
||||
## Session Log
|
||||
|
||||
| # | Date | Phase | Summary |
|
||||
|---|------|-------|---------|
|
||||
| 1 | 2026-02-12 | Phase 0 | Project setup complete: GDD, engine analysis, npm init, Phaser config, BootScene, cursor rules, implementation plan |
|
||||
328
engine-analysis.md
Normal file
328
engine-analysis.md
Normal file
@@ -0,0 +1,328 @@
|
||||
# Выбор движка для агентной разработки в Cursor
|
||||
|
||||
## Критерии оценки
|
||||
|
||||
Для **полностью агентной** разработки (AI-агент в Cursor пишет весь код) критически важны:
|
||||
|
||||
| Критерий | Почему |
|
||||
|----------|--------|
|
||||
| Качество генерации кода | AI должен хорошо знать язык и фреймворк |
|
||||
| Всё-в-коде | Никаких визуальных редакторов — агент работает только с текстовыми файлами |
|
||||
| Сборка/запуск из терминала | Агент запускает через Shell tool |
|
||||
| Визуальная проверка | Агент может УВИДЕТЬ результат (критично для отладки графики) |
|
||||
| Скорость итерации | Hot-reload, быстрый цикл «изменил → увидел» |
|
||||
| Экосистема библиотек | Для химии, математики, процедурной генерации |
|
||||
| Возможности 2D-движка | Тайлмапы, физика, частицы, шейдеры, камера |
|
||||
|
||||
---
|
||||
|
||||
## Кандидаты
|
||||
|
||||
### 1. TypeScript + Phaser 3 + bitECS + Vite
|
||||
|
||||
**Язык:** TypeScript — один из лучших для AI-генерации. Строгая типизация ловит ошибки до рантайма. Огромный объём обучающих данных у моделей.
|
||||
|
||||
**Всё-в-коде:** Полностью. Ни один файл не требует визуального редактора. Конфиги, сцены, уровни — всё на TypeScript/JSON.
|
||||
|
||||
**Сборка/запуск:** `npm run dev` → Vite поднимает сервер с HMR за <1 секунду.
|
||||
|
||||
**Визуальная проверка:** **Killer feature** — Cursor имеет встроенные Playwright browser tools. Агент может:
|
||||
- Открыть `localhost:5173` в браузере
|
||||
- Сделать скриншот игры
|
||||
- Прочитать console.log ошибки
|
||||
- Кликнуть по элементам UI
|
||||
- Проверить результат визуально
|
||||
|
||||
Ни один другой стек не даёт агенту такой обратной связи.
|
||||
|
||||
**Скорость итерации:** Vite HMR — изменения видны мгновенно, без перезапуска. Для игры это означает: поменял логику врага → сразу видишь в браузере.
|
||||
|
||||
**Экосистема:**
|
||||
- `bitecs` — высокопроизводительная ECS (~5kb, TypedArrays, SoA-layout, до десятков тысяч сущностей)
|
||||
- `simplex-noise` — шум для процедурной генерации
|
||||
- Любые npm-библиотеки для математики, графов, pathfinding
|
||||
|
||||
**2D-возможности Phaser 3:**
|
||||
- Спрайты, атласы, тайлмапы
|
||||
- Arcade/Matter.js физика
|
||||
- Система частиц
|
||||
- Камеры, зум, следование
|
||||
- Tweens и анимации
|
||||
- WebGL-шейдеры (пайплайны)
|
||||
- Ввод: клавиатура, мышь, тач, геймпад
|
||||
- Аудио
|
||||
- Scene-менеджер
|
||||
|
||||
**Производительность:** WebGL-рендер, батчинг до ~2000 спрайтов/batch. bitECS для логики — Structure of Arrays, итерация по компонентам на скорости, близкой к нативной. Web Workers для тяжёлой симуляции (экология, химия) в отдельном потоке.
|
||||
|
||||
```
|
||||
Агентопригодность: ██████████ 10/10
|
||||
Визуальная отладка: ██████████ 10/10
|
||||
Язык для AI: ██████████ 10/10
|
||||
Скорость итерации: ██████████ 10/10
|
||||
2D-возможности: ████████░░ 8/10
|
||||
Производительность: ███████░░░ 7/10
|
||||
Экосистема: █████████░ 9/10
|
||||
─────────────────────────────────────
|
||||
ИТОГО: 64/70
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 2. Godot 4 + GDScript
|
||||
|
||||
**Язык:** GDScript — Python-подобный, AI знает его удовлетворительно, но значительно хуже TypeScript/Python. Меньше обучающих данных. Ошибки чаще.
|
||||
|
||||
**Всё-в-коде:** Почти. `.tscn` и `.tres` файлы текстовые и генерируемые. Формат специфичен, но [godot-mcp](https://github.com/Coding-Solo/godot-mcp) (MCP-сервер для Godot, 1.8k stars) снимает эту проблему: создание сцен, добавление нод, загрузка спрайтов — через MCP API без ручного конструирования `.tscn`.
|
||||
|
||||
**Сборка/запуск:** `godot --headless --path . --script test.gd` — работает. С godot-mcp — запуск/остановка проекта и захват debug output через MCP-инструменты. Логическая отладка решена.
|
||||
|
||||
**Визуальная проверка:** Остаётся слабым местом. godot-mcp не поддерживает скриншоты viewport — агент видит только console output. Альтернатива — HTML5-экспорт + Playwright, но цикл итерации длинный: сохранение → экспорт (секунды) → перезагрузка браузера → скриншот (~15-30 сек vs. ~1-2 сек у Phaser + Vite HMR). Для логики — достаточно. Для визуала (шейдеры, фракталы, анимации) — сильно уступает Phaser.
|
||||
|
||||
> **Watch list:** если godot-mcp добавит viewport capture (Godot технически умеет сохранять viewport в изображение через `get_viewport().get_texture().get_image().save_png()`), разрыв с Phaser сократится радикально. Следить за развитием проекта.
|
||||
|
||||
**Скорость итерации:** Средняя. GDScript не компилируется, но перезапуск сцены — не мгновенный. С веб-экспортом цикл ещё длиннее.
|
||||
|
||||
**2D-возможности:** Лучшие в классе. Встроенные тайлмапы, физика, анимация, частицы, шейдеры, сигналы, scene tree.
|
||||
|
||||
**Производительность:** Отличная для 2D. GDNative/C# для критических участков.
|
||||
|
||||
```
|
||||
Агентопригодность: ███████░░░ 7/10 (↑ благодаря godot-mcp)
|
||||
Визуальная отладка: ████░░░░░░ 4/10 (HTML5-экспорт; viewport capture пока нет)
|
||||
Язык для AI: ██████░░░░ 6/10
|
||||
Скорость итерации: ██████░░░░ 6/10
|
||||
2D-возможности: ██████████ 10/10
|
||||
Производительность: █████████░ 9/10
|
||||
Экосистема: ██████░░░░ 6/10 (↑ godot-mcp как часть экосистемы)
|
||||
─────────────────────────────────────
|
||||
ИТОГО: 48/70
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 3. Godot 4 + C#
|
||||
|
||||
Тот же Godot, но на C#.
|
||||
|
||||
**Преимущество:** C# AI знает отлично. Строгая типизация. NuGet-пакеты.
|
||||
|
||||
**Недостаток:** Компиляция медленнее GDScript. Требует .NET SDK. Визуальная проверка — через HTML5-экспорт (те же ограничения). godot-mcp работает и с C#-проектами.
|
||||
|
||||
```
|
||||
Агентопригодность: ███████░░░ 7/10 (↑ благодаря godot-mcp)
|
||||
Визуальная отладка: ████░░░░░░ 4/10 (HTML5-экспорт; viewport capture пока нет)
|
||||
Язык для AI: ████████░░ 8/10
|
||||
Скорость итерации: █████░░░░░ 5/10
|
||||
2D-возможности: ██████████ 10/10
|
||||
Производительность: █████████░ 9/10
|
||||
Экосистема: ███████░░░ 7/10
|
||||
─────────────────────────────────────
|
||||
ИТОГО: 50/70
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 4. Python + Pygame-CE
|
||||
|
||||
**Язык:** Python — абсолютный лидер для AI-генерации кода. Максимальное качество.
|
||||
|
||||
**Всё-в-коде:** Полностью.
|
||||
|
||||
**Визуальная проверка:** Нет. Pygame рисует в собственном окне, которое Playwright не видит.
|
||||
|
||||
**2D-возможности:** Минимальные. Спрайты и рект — есть. Тайлмапы, физику, частицы, камеру — писать с нуля.
|
||||
|
||||
**Экосистема:** Лучшая для научных вычислений (numpy, scipy). Химическая симуляция на numpy будет быстрой.
|
||||
|
||||
**Производительность:** Потолок. Для тысяч сущностей без оптимизаций будет тормозить. Numpy помогает, но рендер — бутылочное горлышко.
|
||||
|
||||
```
|
||||
Агентопригодность: ████████░░ 8/10
|
||||
Визуальная отладка: ██░░░░░░░░ 2/10
|
||||
Язык для AI: ██████████ 10/10
|
||||
Скорость итерации: ████████░░ 8/10
|
||||
2D-возможности: ████░░░░░░ 4/10
|
||||
Производительность: █████░░░░░ 5/10
|
||||
Экосистема: ██████████ 10/10
|
||||
─────────────────────────────────────
|
||||
ИТОГО: 47/70
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Вердикт
|
||||
|
||||
### Победитель: TypeScript + Phaser 3 + bitECS + Vite
|
||||
|
||||
Решающий фактор — **визуальная обратная связь через Playwright**. Агент в Cursor может:
|
||||
|
||||
1. Написать код
|
||||
2. HMR мгновенно применит изменения
|
||||
3. Агент делает скриншот в браузере
|
||||
4. Видит результат
|
||||
5. Корректирует
|
||||
|
||||
Это замыкает цикл разработки полностью внутри агента. Ни один другой стек не даёт такой обратной связи для 2D-игры.
|
||||
|
||||
### Архитектура проекта
|
||||
|
||||
```
|
||||
synthesis/
|
||||
├── package.json
|
||||
├── tsconfig.json
|
||||
├── vite.config.ts
|
||||
├── index.html
|
||||
├── src/
|
||||
│ ├── main.ts # Точка входа, инициализация Phaser
|
||||
│ ├── config.ts # Конфигурация Phaser
|
||||
│ │
|
||||
│ ├── ecs/ # Entity Component System (bitECS)
|
||||
│ │ ├── world.ts # Мир ECS
|
||||
│ │ ├── components/ # Компоненты
|
||||
│ │ │ ├── position.ts
|
||||
│ │ │ ├── health.ts
|
||||
│ │ │ ├── chemistry.ts # Элементный состав сущности
|
||||
│ │ │ ├── metabolism.ts # Метаболизм
|
||||
│ │ │ ├── behavior.ts # Поведенческие параметры
|
||||
│ │ │ └── lifecycle.ts # Фаза жизненного цикла
|
||||
│ │ └── systems/ # Системы
|
||||
│ │ ├── movement.ts
|
||||
│ │ ├── ecology.ts # Популяционная динамика
|
||||
│ │ ├── chemistry.ts # Химические реакции
|
||||
│ │ ├── lifecycle.ts # Рождение → старение → смерть → разложение
|
||||
│ │ └── ai.ts # Поведение существ
|
||||
│ │
|
||||
│ ├── chemistry/ # Химический движок
|
||||
│ │ ├── elements.ts # Таблица элементов
|
||||
│ │ ├── reactions.ts # База реакций
|
||||
│ │ ├── engine.ts # Движок комбинаций
|
||||
│ │ └── compounds.ts # Справочник соединений
|
||||
│ │
|
||||
│ ├── world/ # Генерация мира
|
||||
│ │ ├── generator.ts # Процедурная генерация
|
||||
│ │ ├── biomes.ts # Определения биомов
|
||||
│ │ ├── tilemap.ts # Тайлмап-система
|
||||
│ │ └── mycelium.ts # Система Мицелия
|
||||
│ │
|
||||
│ ├── scenes/ # Phaser-сцены
|
||||
│ │ ├── BootScene.ts
|
||||
│ │ ├── GameScene.ts
|
||||
│ │ ├── DeathScene.ts # «Момент между» — фракталы
|
||||
│ │ ├── CodexScene.ts # Энциклопедия
|
||||
│ │ └── UIScene.ts # HUD поверх игры
|
||||
│ │
|
||||
│ ├── player/ # Всё про игрока
|
||||
│ │ ├── controller.ts
|
||||
│ │ ├── inventory.ts
|
||||
│ │ ├── abilities.ts
|
||||
│ │ └── schools.ts # Стартовые школы
|
||||
│ │
|
||||
│ ├── meta/ # Мета-прогрессия (между ранами)
|
||||
│ │ ├── codex.ts # Кодекс знаний
|
||||
│ │ ├── spores.ts # Споры (валюта)
|
||||
│ │ ├── persistence.ts # Сохранение в localStorage/IndexedDB
|
||||
│ │ └── cycles.ts # Трекер малых/великих циклов
|
||||
│ │
|
||||
│ ├── rendering/ # Визуальные эффекты
|
||||
│ │ ├── shaders/ # WebGL-шейдеры
|
||||
│ │ │ ├── fractal.glsl # Фрактальный шейдер для «Момента между»
|
||||
│ │ │ ├── mycelium.glsl # Визуал Мицелия
|
||||
│ │ │ └── distortion.glsl # Искажения при Микозе
|
||||
│ │ └── particles/ # Конфиги частиц
|
||||
│ │
|
||||
│ ├── audio/ # Звук
|
||||
│ │ ├── loops.ts # Музыкальные лупы
|
||||
│ │ └── ambient.ts # Эмбиент-система
|
||||
│ │
|
||||
│ └── data/ # Статические данные
|
||||
│ ├── elements.json # Периодическая таблица
|
||||
│ ├── reactions.json # База химических реакций
|
||||
│ ├── creatures.json # Определения существ
|
||||
│ ├── biomes.json # Параметры биомов
|
||||
│ └── lore/ # Тексты лора
|
||||
│ ├── diary.json # Дневник Последнего Синтетика
|
||||
│ └── codex-entries.json
|
||||
│
|
||||
├── assets/ # Графика, звук
|
||||
│ ├── sprites/
|
||||
│ ├── tilesets/
|
||||
│ ├── ui/
|
||||
│ └── audio/
|
||||
│
|
||||
├── tests/ # Тесты
|
||||
│ ├── chemistry.test.ts # Тесты химического движка
|
||||
│ ├── ecology.test.ts # Тесты экосимуляции
|
||||
│ └── generation.test.ts # Тесты генерации мира
|
||||
│
|
||||
└── docs/
|
||||
├── synthesis-gdd.md # Game Design Document
|
||||
└── engine-analysis.md # Этот файл
|
||||
```
|
||||
|
||||
### Ключевые зависимости
|
||||
|
||||
```json
|
||||
{
|
||||
"dependencies": {
|
||||
"phaser": "^3.80.0",
|
||||
"bitecs": "^0.4.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"typescript": "^5.4.0",
|
||||
"vite": "^5.4.0",
|
||||
"vitest": "^2.0.0"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**Дополнительные зависимости** (подключаются по мере необходимости):
|
||||
|
||||
```json
|
||||
{
|
||||
"simplex-noise": "^4.0.0", // Процедурная генерация ландшафта
|
||||
"ngraph.graph": "^20.0.0", // Граф Мицелия
|
||||
"ngraph.path": "^1.4.0", // Pathfinding (A*, NBA*)
|
||||
"rbush": "^4.0.0" // Spatial index (R-tree) для коллизий и culling
|
||||
}
|
||||
```
|
||||
|
||||
Минималистичный стек. Никаких лишних абстракций. Всё, что нужно для «Синтеза»:
|
||||
- Phaser = рендер, физика, ввод, камера, сцены
|
||||
- bitECS = высокопроизводительная симуляция сущностей
|
||||
- Vite = мгновенная сборка
|
||||
- Vitest = тесты для химического движка и экосимуляции
|
||||
- ngraph = граф Мицелия + pathfinding
|
||||
- rbush = пространственная индексация для производительности при тысячах сущностей
|
||||
|
||||
### Почему не Godot?
|
||||
|
||||
Godot — объективно лучший **2D-движок**. [godot-mcp](https://github.com/Coding-Solo/godot-mcp) существенно улучшил его агентопригодность: управление сценами, запуск проекта, захват debug output — всё через MCP. Но для «Синтеза» Godot проигрывает по двум параметрам:
|
||||
|
||||
1. **Визуальная обратная связь.** godot-mcp не поддерживает скриншоты viewport. Агент видит console output, но не экран игры. Для проекта с фрактальными шейдерами, психоделическими визуалами и сложным UI — это блокирующий минус. Альтернатива (HTML5-экспорт + Playwright) даёт цикл итерации ~15-30 сек vs. ~1-2 сек у Phaser + Vite HMR. На тысячах итераций — дни потерянного времени.
|
||||
|
||||
2. **Качество генерации кода.** GDScript агент знает хуже TypeScript. C# — хорошо, но компиляция добавляет задержку. godot-mcp снимает проблему `.tscn`-файлов, но не GDScript'а.
|
||||
|
||||
**Точка пересмотра:** если godot-mcp добавит viewport capture (технически реализуемо через `Viewport.get_texture().get_image()`), разрыв сократится до одного фактора — скорости итерации (HMR vs. перезапуск). На этом этапе Godot + C# (50/70) приблизится к Phaser (64/70) настолько, что выбор станет неоднозначным.
|
||||
|
||||
Сегодня — TypeScript + Phaser + browser tools = единственный стек с мгновенным замыканием цикла агентной разработки.
|
||||
|
||||
### Почему не Pixi.js + bitECS?
|
||||
|
||||
Pixi.js — более производительный 2D-рендерер, чем Phaser, с меньшим оверхедом. Раз ECS внешний (bitECS), встроенные системы Phaser частично избыточны. Однако:
|
||||
|
||||
- Phaser даёт **из коробки:** физику (Arcade + Matter.js), камеру с зумом и следованием, систему ввода (клавиатура + мышь + геймпад), Scene Manager, загрузчик ассетов, аудио, tweens, систему частиц. С Pixi.js каждую из этих систем — реализовывать вручную или подбирать отдельную библиотеку.
|
||||
- Для **агентной разработки** это критично: каждая дополнительная самописная система — источник багов, которые агент будет долго отлаживать.
|
||||
- Производительность Phaser достаточна для вертикального среза и alpha. Если на этапе beta рендер станет бутылочным горлышком — миграция рендерера на Pixi.js возможна без переписывания ECS-логики (они уже разделены).
|
||||
|
||||
**Вердикт:** Phaser = скорость разработки. Pixi.js = запасной вариант для оптимизации рендера.
|
||||
|
||||
### Риски и план действий
|
||||
|
||||
| Риск | Вероятность | Влияние | Митигация |
|
||||
|------|-------------|---------|-----------|
|
||||
| **Потолок производительности браузера** — тысячи сущностей с экосимуляцией + фрактальные шейдеры перегружают WebGL/JS | Средняя | Высокое | Web Workers для симуляции. Spatial partitioning. Culling невидимых сущностей. Если не хватит — вынос тяжёлой логики в WASM (Rust → wasm-pack) |
|
||||
| **Phaser 3 — проект одного разработчика** (bus factor) | Низкая | Среднее | Phaser 3 стабилен и feature-complete. При необходимости — миграция рендера на Pixi.js, ECS-логика не затронута |
|
||||
| **Веб-стек не годится для консолей** | Средняя | Среднее | Electron/Tauri для десктопа. Для Switch — потребуется порт (возможно, на этом этапе Godot с импортом логики) |
|
||||
| **Масштаб химической системы** (2000 реакций) нагружает runtime | Низкая | Среднее | Реакции — табличный lookup (O(1)), не симуляция. База в JSON, индексация по реагентам. Узкое место — UI поиска, не вычисления |
|
||||
| **IndexedDB/localStorage — потолок для мета-прогрессии** | Низкая | Низкое | IndexedDB вмещает сотни MB. Для «Синтеза» достаточно. При необходимости — экспорт в файл |
|
||||
22
index.html
Normal file
22
index.html
Normal file
@@ -0,0 +1,22 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="ru">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Синтез</title>
|
||||
<style>
|
||||
* { margin: 0; padding: 0; box-sizing: border-box; }
|
||||
body {
|
||||
background: #0a0a0a;
|
||||
overflow: hidden;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
min-height: 100vh;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<script type="module" src="/src/main.ts"></script>
|
||||
</body>
|
||||
</html>
|
||||
1560
package-lock.json
generated
Normal file
1560
package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load Diff
23
package.json
Normal file
23
package.json
Normal file
@@ -0,0 +1,23 @@
|
||||
{
|
||||
"name": "synthesis",
|
||||
"version": "0.1.0",
|
||||
"description": "Scientific roguelike where real science replaces magic",
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
"dev": "vite",
|
||||
"build": "tsc && vite build",
|
||||
"preview": "vite preview",
|
||||
"test": "vitest",
|
||||
"test:run": "vitest run"
|
||||
},
|
||||
"dependencies": {
|
||||
"bitecs": "^0.4.0",
|
||||
"phaser": "^3.80.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"happy-dom": "^20.6.1",
|
||||
"typescript": "^5.4.0",
|
||||
"vite": "^5.4.0",
|
||||
"vitest": "^2.0.0"
|
||||
}
|
||||
}
|
||||
29
src/config.ts
Normal file
29
src/config.ts
Normal file
@@ -0,0 +1,29 @@
|
||||
import Phaser from 'phaser';
|
||||
import { BootScene } from './scenes/BootScene';
|
||||
|
||||
export const GAME_WIDTH = 1280;
|
||||
export const GAME_HEIGHT = 720;
|
||||
|
||||
export const gameConfig: Phaser.Types.Core.GameConfig = {
|
||||
type: Phaser.AUTO,
|
||||
width: GAME_WIDTH,
|
||||
height: GAME_HEIGHT,
|
||||
backgroundColor: '#0a0a0a',
|
||||
parent: document.body,
|
||||
scene: [BootScene],
|
||||
physics: {
|
||||
default: 'arcade',
|
||||
arcade: {
|
||||
gravity: { x: 0, y: 0 },
|
||||
debug: false,
|
||||
},
|
||||
},
|
||||
scale: {
|
||||
mode: Phaser.Scale.FIT,
|
||||
autoCenter: Phaser.Scale.CENTER_BOTH,
|
||||
},
|
||||
render: {
|
||||
pixelArt: true,
|
||||
antialias: false,
|
||||
},
|
||||
};
|
||||
4
src/main.ts
Normal file
4
src/main.ts
Normal file
@@ -0,0 +1,4 @@
|
||||
import Phaser from 'phaser';
|
||||
import { gameConfig } from './config';
|
||||
|
||||
new Phaser.Game(gameConfig);
|
||||
58
src/scenes/BootScene.ts
Normal file
58
src/scenes/BootScene.ts
Normal file
@@ -0,0 +1,58 @@
|
||||
import Phaser from 'phaser';
|
||||
|
||||
export class BootScene extends Phaser.Scene {
|
||||
constructor() {
|
||||
super({ key: 'BootScene' });
|
||||
}
|
||||
|
||||
create(): void {
|
||||
const cx = this.cameras.main.centerX;
|
||||
const cy = this.cameras.main.centerY;
|
||||
|
||||
// Title
|
||||
this.add
|
||||
.text(cx, cy - 40, 'СИНТЕЗ', {
|
||||
fontSize: '64px',
|
||||
color: '#00ff88',
|
||||
fontFamily: 'monospace',
|
||||
fontStyle: 'bold',
|
||||
})
|
||||
.setOrigin(0.5);
|
||||
|
||||
// Subtitle
|
||||
this.add
|
||||
.text(cx, cy + 30, 'Наука — это магия, которая работает', {
|
||||
fontSize: '16px',
|
||||
color: '#557755',
|
||||
fontFamily: 'monospace',
|
||||
})
|
||||
.setOrigin(0.5);
|
||||
|
||||
// Version
|
||||
this.add
|
||||
.text(cx, cy + 80, 'v0.1.0 — Phase 0: Project Setup', {
|
||||
fontSize: '12px',
|
||||
color: '#333333',
|
||||
fontFamily: 'monospace',
|
||||
})
|
||||
.setOrigin(0.5);
|
||||
|
||||
// Pulsing indicator
|
||||
const dot = this.add
|
||||
.text(cx, cy + 120, '◉', {
|
||||
fontSize: '24px',
|
||||
color: '#00ff88',
|
||||
fontFamily: 'monospace',
|
||||
})
|
||||
.setOrigin(0.5);
|
||||
|
||||
this.tweens.add({
|
||||
targets: dot,
|
||||
alpha: 0.2,
|
||||
duration: 1500,
|
||||
yoyo: true,
|
||||
repeat: -1,
|
||||
ease: 'Sine.easeInOut',
|
||||
});
|
||||
}
|
||||
}
|
||||
606
synthesis-gdd.md
Normal file
606
synthesis-gdd.md
Normal file
@@ -0,0 +1,606 @@
|
||||
# «СИНТЕЗ» — Game Design Document
|
||||
|
||||
---
|
||||
|
||||
## 0. ПАСПОРТ ПРОЕКТА
|
||||
|
||||
| Параметр | Значение |
|
||||
|----------|----------|
|
||||
| **Рабочее название** | Синтез / Synthesis |
|
||||
| **Жанр** | Scientific roguelike + open-world exploration sandbox |
|
||||
| **Перспектива** | 2D top-down; side-view для вертикальных зон и подземелий |
|
||||
| **Платформа** | PC (Steam) — основная; Nintendo Switch — целевой порт |
|
||||
| **Режим** | Singleplayer |
|
||||
| **Аудитория** | 14+, любители roguelike и sandbox-игр, любознательные игроки без страха перед наукой |
|
||||
| **Длительность одного рана** | 45–90 минут |
|
||||
| **Путь до финала нарратива** | ~49 ранов (~50–80 часов) |
|
||||
| **Эндгейм** | Бесконечный (мета-циклы с новым контентом) |
|
||||
| **Референсы** | Noita (физика как оружие), Outer Wilds (цикличный нарратив), Caves of Qud (глубина мира), Rain World (живая экосистема), Opus Magnum (химия как головоломка) |
|
||||
|
||||
### Elevator Pitch
|
||||
|
||||
Roguelike, в котором настоящая наука заменяет магию. Смешивай реальные химические элементы, строй механизмы по законам физики, приручай существ через биологию, манипулируй NPC через когнитивные искажения. Умирай, перерождайся, и с каждым циклом понимай мир — и игровой, и настоящий — глубже.
|
||||
|
||||
---
|
||||
|
||||
## I. ФИЛОСОФСКОЕ ЯДРО: ВЕЛИКИЙ ЦИКЛ
|
||||
|
||||
### Центральная метафора
|
||||
|
||||
Всё во вселенной игры — цикл. Атом колеблется. Сердце бьётся. Существо рождается, живёт, умирает, становится почвой для нового. Звезда коллапсирует и из её праха собирается новая. Цивилизация возникает, познаёт мир, гибнет, и через тысячелетия другая цивилизация находит её руины и начинает сначала.
|
||||
|
||||
Игрок проживает это **буквально**. Каждый ран — малый цикл. Каждые 7 ранов — великий цикл. А за гранью великих циклов — нечто, что можно только почувствовать в моменты «прозрения».
|
||||
|
||||
Ощущение — как мухоморный трип: ты застрял в петле, но каждый виток чуть другой. Ты умираешь и рождаешься, умираешь и рождаешься. Постепенно приходит осознание: ты не застрял В цикле — ты И ЕСТЬ цикл. И единственный выход — не сломать его, а понять.
|
||||
|
||||
### Три закона Арканы
|
||||
|
||||
1. **Закон Возвращения** — всё, что было, будет снова, но никогда в точности так же
|
||||
2. **Закон Следа** — ничто не исчезает бесследно; каждый цикл оставляет отпечаток в следующем
|
||||
3. **Закон Синтеза** — когда все фрагменты знания соединяются, цикл не ломается — он трансцендирует
|
||||
|
||||
---
|
||||
|
||||
## II. КОСМОЛОГИЯ: ЦИКЛЫ ВНУТРИ ЦИКЛОВ
|
||||
|
||||
### Масштабы циклов (фрактальная структура)
|
||||
|
||||
Одни и те же паттерны повторяются на каждом уровне масштаба. Это не декорация — это работающая механика.
|
||||
|
||||
```
|
||||
НАНОЦИКЛ Атом колеблется ←→ Химическая реакция
|
||||
МИКРОЦИКЛ Клетка делится → живёт → умирает → питает другие клетки
|
||||
БИОЦИКЛ Существо: рождение → рост → размножение → смерть → разложение
|
||||
ЭКОЦИКЛ Экосистема: зарождение → расцвет → кризис → коллапс → перерождение
|
||||
ЦИВОЦИКЛ Цивилизация: открытие → расцвет → гордыня → падение → тёмный век → новое открытие
|
||||
КОСМОЦИКЛ Звезда: туманность → протозвезда → горение → коллапс → сверхновая → туманность
|
||||
МЕТАЦИКЛ Сама Аркана: Создание → Познание → Синтез → Катастрофа → Забвение → Создание
|
||||
```
|
||||
|
||||
**Ключевой дизайн-принцип:** игрок может наблюдать все эти циклы в реальном времени. Увидеть, как делится клетка под самодельным микроскопом — и узнать тот же паттерн в расколе империи на карте мира.
|
||||
|
||||
### Лор: Что произошло
|
||||
|
||||
Древние Синтетики — не первая цивилизация и не последняя. Они лишь одна итерация. Копаясь в руинах, игрок находит доказательства цивилизаций ДО Синтетиков. А в глубочайших подземельях — намёки на то, что и сам игрок уже проходил через это бесконечное число раз.
|
||||
|
||||
Катастрофа, уничтожившая Синтетиков, не была случайностью. Это **фаза цикла**. Как суперновая — не смерть звезды, а обязательный этап перед рождением новых. Синтетики достигли полноты знания, и это знание стало слишком концентрированным. Реальность не выдержала. Но осколки знания засеяли мир, как споры — почву.
|
||||
|
||||
---
|
||||
|
||||
## III. МИЦЕЛИЙ: СВЯЗУЮЩАЯ ТКАНЬ ВСЕХ ЦИКЛОВ
|
||||
|
||||
### Концепция
|
||||
|
||||
Под поверхностью всего мира Арканы тянется **Мицелий** — грибная сеть невообразимого масштаба и древности. Мицелий — не просто растение. Это **память мира**. Каждый цикл, каждая смерть, каждое открытие — всё записано в его нитях.
|
||||
|
||||
Мицелий — это:
|
||||
- Механизм сохранения знаний между ранами (лор-объяснение мета-прогрессии)
|
||||
- Подземная «интернет-сеть» мира — NPC-грибники подключаются к ней для связи
|
||||
- Буквальный организм, с которым можно взаимодействовать
|
||||
- Метафора коллективного бессознательного
|
||||
|
||||
### Мицелий в геймплее
|
||||
|
||||
**Грибные узлы** — точки на карте, где Мицелий выходит на поверхность. Здесь можно:
|
||||
- Получить «вспышки» — фрагменты воспоминаний прошлых циклов (кат-сцены из предыдущих ранов, но искажённые, как сон)
|
||||
- Передать знание — записать в Мицелий открытие, чтобы в будущих ранах оно проявилось как «интуиция»
|
||||
- Общаться с Мицелием — он «говорит» паттернами: показывает циклические последовательности, которые игрок должен расшифровать (учит распознавание паттернов, основы теории информации)
|
||||
|
||||
**Споры** — валюта мета-прогрессии. Каждый ран заканчивается тем, что знания Адепта впитываются Мицелием. Чем больше открыл — тем больше спор. Споры тратятся на стартовые бонусы и разблокировку новых дисциплин.
|
||||
|
||||
**Микоз** — состояние, когда Адепт слишком глубоко погружается в Мицелий. Экран искажается, время петляет, реальность становится фрактальной. Это опасно, но в этом состоянии можно увидеть вещи, невидимые иначе: скрытые проходы, истинную природу сущностей, связи между циклами. Визуально — **прямая отсылка к психоделическому опыту**: фрактальные паттерны, зацикленные анимации, ощущение déjà vu.
|
||||
|
||||
---
|
||||
|
||||
## IV. СТРУКТУРА РАНОВ: МАЛЫЙ И ВЕЛИКИЙ ЦИКЛЫ
|
||||
|
||||
### Малый цикл (один ран)
|
||||
|
||||
```
|
||||
ПРОБУЖДЕНИЕ → ИССЛЕДОВАНИЕ → ЭСКАЛАЦИЯ → КРИЗИС → РАЗВЯЗКА
|
||||
↑ |
|
||||
└────────────────── СМЕРТЬ/ПЕРЕРОЖДЕНИЕ ─────────────┘
|
||||
```
|
||||
|
||||
**1. Пробуждение**
|
||||
Адепт «просыпается» в Споровой Колыбели — полости внутри гигантского гриба. Не помнит ничего, кроме смутного ощущения «я уже был здесь». Выбирает школу (или получает случайную при разблокированном режиме хаоса).
|
||||
|
||||
**2. Исследование**
|
||||
Открытый мир. Свободный порядок регионов. Собираешь элементы, открываешь соединения, встречаешь сущности. Мир находится в фазе «расцвета» — относительно мирный, богатый ресурсами.
|
||||
|
||||
**3. Эскалация**
|
||||
Энтропия растёт. Это проявляется физически: температура колеблется сильнее, химические реакции становятся нестабильнее, существа агрессивнее, NPC — параноидальнее. Мир входит в фазу «кризиса» своего цикла.
|
||||
|
||||
**4. Кризис**
|
||||
Конкретная катастрофа, уникальная для этого рана:
|
||||
- **Химическая чума** — цепная реакция отравляет атмосферу (нужна химия для нейтрализации)
|
||||
- **Механический коллапс** — древние машины активируются и крушат всё (нужна инженерия)
|
||||
- **Экологический каскад** — вымирание ключевого вида рушит всю пищевую цепь (нужна биология)
|
||||
- **Социальный распад** — фракции начинают войну (нужна психология/дипломатия)
|
||||
- **Энтропийный шторм** — сама физика начинает сбоить (нужна физика/математика)
|
||||
- **Мицелиевое безумие** — Мицелий «вспоминает» слишком много и мир наполняется эхом прошлых циклов
|
||||
|
||||
**5. Развязка**
|
||||
Попытка достичь Сердца Синтеза и либо остановить катастрофу, либо... понять, что она — необходимая фаза цикла, и направить её во что-то продуктивное (как контролируемый пожар в лесоводстве).
|
||||
|
||||
**Смерть** — не «game over», а фаза. Адепт растворяется в Мицелии. Короткая сцена: фрактальный тоннель, мелькают образы из прошедшего рана, из прошлых ранов, из ранов которых не было... Потом — тишина. Потом — пробуждение.
|
||||
|
||||
### Великий цикл (каждые 7 ранов)
|
||||
|
||||
После 7-го рана (и затем каждого 7-го) мир переживает **Великое Обновление**:
|
||||
- Фундаментально меняется генерация (новые типы биомов, другие пропорции)
|
||||
- Разблокируется новый «слой» лора
|
||||
- Появляется новый тип сущностей — **Архонты** — существа, пережившие несколько великих циклов
|
||||
- Мицелий «созревает» — открывает новые способности
|
||||
- Предыдущие 7 ранов оставляют конкретные следы: руины твоих лагерей, последствия твоих решений, мутировавшие потомки существ, которых ты разводил
|
||||
|
||||
**Великие циклы формируют нарратив:**
|
||||
- Цикл 1 (раны 1-7): **Пробуждение** — узнаёшь мир, базовые механики
|
||||
- Цикл 2 (раны 8-14): **Сомнение** — находишь следы прошлых Адептов (это были ты?)
|
||||
- Цикл 3 (раны 15-21): **Осознание** — понимаешь природу циклов
|
||||
- Цикл 4 (раны 22-28): **Попытка** — первые попытки трансцендировать цикл
|
||||
- Цикл 5 (раны 29-35): **Принятие** — понимание, что цикл — не тюрьма, а форма бытия
|
||||
- Цикл 6 (раны 36-42): **Синтез** — объединение всех знаний
|
||||
- Цикл 7 (раны 43-49): **Трансценденция** — ???
|
||||
|
||||
После Цикла 7... игра не заканчивается. Начинается **Мета-Цикл**. Великие циклы начинают повторяться, но на новом уровне понимания. Новый контент, новые слои, бесконечно.
|
||||
|
||||
### Секунда-к-секунде: основной цикл геймплея
|
||||
|
||||
Макро-структура рана описана выше. Вот что происходит на микроуровне — это то, что игрок делает каждую минуту:
|
||||
|
||||
```
|
||||
НАБЛЮДАЙ → СОБИРАЙ → ЭКСПЕРИМЕНТИРУЙ → ПРИМЕНЯЙ → ЗАПИСЫВАЙ
|
||||
↑ |
|
||||
└────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
1. **Наблюдай** — мир наполнен подсказками: цвет минерала, поведение существа, следы на руинах. Активное наблюдение — главный навык. Курсор при наведении показывает базовые свойства объектов (у продвинутых игроков — расширенные).
|
||||
2. **Собирай** — элементы, образцы, данные. Инвентарь ограничен весом (реалистичные атомные массы!), поэтому выбор, что нести с собой, — постоянное стратегическое решение.
|
||||
3. **Экспериментируй** — на переносном верстаке (3 слота, базовые реакции) или в стационарной лаборатории (полный доступ). Соединяй элементы, проверяй гипотезы. Неудача ≠ потеря: система объясняет, ПОЧЕМУ реакция не пошла (недостаточно энергии, нет катализатора, неправильная пропорция).
|
||||
4. **Применяй** — новое знание немедленно полезно: оружие, инструмент, лекарство, ключ к головоломке, торговый товар.
|
||||
5. **Записывай** — Кодекс обновляется автоматически при открытии; Мицелий фиксирует знание для будущих ранов.
|
||||
|
||||
**Управление:** клавиатура + мышь (геймпад как альтернатива). ЛКМ — взаимодействие/использование, ПКМ — бросок/применение активного элемента. Быстрый доступ к 4 «подготовленным» элементам/соединениям (1-2-3-4). Колесо мыши или Q/E — переключение.
|
||||
|
||||
**Камера:** 2D top-down, плавное следование за Адептом с зуммированием при входе в здания/пещеры. Переключение в side-view для Кинетических Гор и подземных секций.
|
||||
|
||||
---
|
||||
|
||||
## V. СИСТЕМА СПОСОБНОСТЕЙ: БЕСКОНЕЧНЫЕ КОМБИНАЦИИ
|
||||
|
||||
### Уровень 1 — Элементы (Первоматерия)
|
||||
|
||||
Базовые строительные блоки. Соответствуют реальной таблице Менделеева. В начале рана доступны 5-8 (зависит от школы), всего в игре ~70 (наиболее значимые реальные элементы).
|
||||
|
||||
Каждый элемент — физический предмет в инвентаре. Его можно:
|
||||
- Бросить (некоторые токсичны, горючи, взрывоопасны)
|
||||
- Съесть (с последствиями — железо полезно в малых дозах, ртуть — нет)
|
||||
- Соединить с другим элементом (если знаешь реакцию или экспериментируешь)
|
||||
- Использовать как инструмент (медь проводит ток, кремний — полупроводник)
|
||||
|
||||
**Как элементы учат:** игрок запоминает свойства реальных элементов через практику. Ртуть — жидкий металл, токсичный, но нужен для определённых соединений. Калий бурно реагирует с водой. Углерод — основа всей органики. Это не зубрёжка — это survival tool.
|
||||
|
||||
### Уровень 2 — Соединения (Материя)
|
||||
|
||||
Комбинация элементов по реальным (упрощённым) химическим правилам.
|
||||
|
||||
**Примеры ключевых соединений:**
|
||||
|
||||
| Формула | Название | Игровой эффект | Реальная наука |
|
||||
|---------|----------|----------------|----------------|
|
||||
| NaCl | Соль | Консервация, защита от слизней, торговля | Ионные связи, осмос |
|
||||
| H₂O | Вода | Растворитель, охлаждение, гидравлика | Полярность молекул |
|
||||
| C₂H₅OH | Этанол | Дезинфекция, горючее, опьянение NPC | Органическая химия |
|
||||
| NaHCO₃ | Сода | Нейтрализация кислот, выпечка, огнетушитель | Кислотно-щелочной баланс |
|
||||
| Fe₂O₃ | Ржавчина | Термит (с Al), индикатор старения металлов | Окисление |
|
||||
| KNO₃ + S + C | Порох | Взрывчатка, ракеты, сигнальные ракеты | Горение, окислители |
|
||||
| CaCO₃ | Известняк | Строительство, нейтрализация кислой почвы | Геология, агрохимия |
|
||||
| C₆H₁₂O₆ | Глюкоза | Быстрая энергия, корм для микроорганизмов | Биохимия, метаболизм |
|
||||
| CH₃COOH | Уксус | Растворитель, приманка, консервант | Ферментация |
|
||||
| Ca(OH)₂ | Гашёная известь | Строительный раствор, дезинфекция | Стройматерилы |
|
||||
|
||||
**Экспериментирование:** игрок может соединить ЛЮБЫЕ два элемента. Если реакция невозможна — система объясняет ПОЧЕМУ (энергия связи, электроотрицательность, условия). Это превращает каждую неудачу в микроурок.
|
||||
|
||||
### Уровень 3 — Принципы (Законы)
|
||||
|
||||
Физические, математические и биологические законы, применяемые к материи.
|
||||
|
||||
**Физика:**
|
||||
- **Рычаг/Момент силы** — усиление физических атак, создание простых механизмов
|
||||
- **Давление** (P=F/S) — гидравлические прессы, подводные конструкции, вакуумные ловушки
|
||||
- **Электричество** — цепи, двигатели, электролиз, освещение
|
||||
- **Оптика** — линзы, зеркала, лазеры (концентрация света), волоконная связь
|
||||
- **Термодинамика** — двигатели, холодильники, понимание энтропии (привязано к лору о циклах!)
|
||||
- **Волны** — звуковые атаки, резонанс (разрушение конструкций), сонар
|
||||
|
||||
**Биология:**
|
||||
- **Генетика** — селекция растений/существ, понимание наследственности
|
||||
- **Симбиоз** — создание взаимовыгодных связей с существами
|
||||
- **Иммунология** — создание вакцин, борьба с болезнями
|
||||
- **Нейробиология** — понимание поведения существ, создание приманок/репеллентов
|
||||
|
||||
**Математика/Логика:**
|
||||
- **Вероятность** — оценка рисков, оптимальные стратегии, азартные мини-игры
|
||||
- **Геометрия** — проектирование конструкций, расчёт траекторий
|
||||
- **Логика** — решение головоломок древних, программирование автоматонов
|
||||
- **Теория графов** — оптимизация маршрутов, сетевой анализ (торговые пути, Мицелий)
|
||||
|
||||
**Психология:**
|
||||
- **Когнитивные искажения** — манипуляция NPC (эффект привязки в торговле, ошибка невозвратных затрат)
|
||||
- **Иерархия Маслоу** — предсказание поведения NPC (голодный не будет рассуждать о философии)
|
||||
- **Теория игр** — дипломатия, дилемма заключённого с фракциями
|
||||
- **Мнемотехники** — реальные техники запоминания, которые помогают и в игре, и в жизни
|
||||
|
||||
### Уровень 4 — Техники (Синтез)
|
||||
|
||||
Уникальные применения, возникающие на пересечении дисциплин.
|
||||
|
||||
**Примеры кросс-дисциплинарных техник:**
|
||||
|
||||
- **Электрохимия:** гальваника (покрытие предметов металлом), электролиз (разложение воды на H₂ + O₂ для взрывчатки или дыхания)
|
||||
- **Биофизика:** ультразвуковая эхолокация, биолюминесцентное освещение, пьезоэлектрические кристаллы из костей
|
||||
- **Нейрохимия:** создание нейротрансмиттеров для усиления/ослабления существ, антидоты к ядам
|
||||
- **Материаловедение:** композитные материалы (углеволокно = прочнее стали, легче алюминия), полупроводники для электроники
|
||||
- **Агроэкология:** пермакультурные фермы, которые работают автономно и кормят между ранами
|
||||
- **Судебная химия:** анализ следов, чтобы понять что произошло в руинах — хроматография, спектральный анализ
|
||||
|
||||
---
|
||||
|
||||
## VI. ОТКРЫТЫЙ МИР: СЕМЬ РЕГИОНОВ
|
||||
|
||||
### 1. Каталитические Пустоши (Химия)
|
||||
|
||||
**Ландшафт:** выжженная равнина с кислотными озёрами, кристаллическими формациями, гейзерами. Почва богата минералами — тут добываются большинство редких элементов.
|
||||
|
||||
**Цикл региона:** Пустоши проходят через химический цикл: зарождение реакций → каскад → насыщение → стагнация → новый катализатор. Игрок может ускорять/замедлять этот цикл.
|
||||
|
||||
**Уникальные существа:**
|
||||
- **Кристаллиды** — кремниевая жизнь, формирующая геометрически правильные тела. Растут медленно, но несокрушимы
|
||||
- **Ацидофилы** — слизнеобразные существа, живущие в кислотных озёрах. Их тела — готовые кислоты/щёлочи
|
||||
- **Реагенты** — парные существа, безопасные по отдельности, взрывоопасные при контакте
|
||||
|
||||
**Что учит:** свойства элементов, типы реакций, pH, катализ, техника безопасности при работе с химикатами.
|
||||
|
||||
### 2. Кинетические Горы (Физика/Механика)
|
||||
|
||||
**Ландшафт:** вертикальный мир. Гигантские шестерни и маятники Синтетиков встроены в скалы. Гравитация аномальна в некоторых зонах. Лавины, оползни, тектоническая активность.
|
||||
|
||||
**Цикл региона:** Механический: завод → работа → износ → поломка → ремонт/замена. Древние машины включаются и выключаются циклически — игрок учится предсказывать фазы.
|
||||
|
||||
**Уникальные существа:**
|
||||
- **Маятники** — летающие существа, чьё движение идеально периодично. Используй как часы или платформы
|
||||
- **Механоиды** — полуживые автоматоны. Можно чинить, перепрограммировать, использовать запчасти
|
||||
- **Резонаторы** — существа, вибрирующие на определённых частотах. Опасны, если частота совпадает с твоим снаряжением
|
||||
|
||||
**Что учит:** механика, простые машины, энергия, волны, термодинамика, основы инженерии.
|
||||
|
||||
### 3. Вердантовые Леса (Биология/Экология)
|
||||
|
||||
**Ландшафт:** многослойный лес с пологом на разных высотах. Подземный уровень — царство грибов и корней (ближайший контакт с Мицелием). Невероятное биоразнообразие.
|
||||
|
||||
**Цикл региона:** Экологический: сукцессия → климакс → катастрофа (пожар/болезнь) → первичная сукцессия. Игрок наблюдает за несколько игровых дней то, что в реальности занимает столетия.
|
||||
|
||||
**Уникальные существа:**
|
||||
- **Симбионты** — всегда парами. Один без другого погибает. Разлучить — жестоко, но иногда полезно
|
||||
- **Мимикры** — маскируются под растения, предметы, даже NPC. Учат наблюдательности
|
||||
- **Споровики** — грибные существа, аватары Мицелия. Мирные, но если обидишь — весь лес ополчится
|
||||
|
||||
**Что учит:** экология, ботаника, зоология, грибоводство, пищевые цепи, эволюция, первая помощь (лекарственные растения).
|
||||
|
||||
### 4. Ноосферный Город (Психология/Социология)
|
||||
|
||||
**Ландшафт:** полуразрушенный мегаполис Синтетиков. Уцелевшие районы населены фракциями. Архитектура спроектирована по принципам нейроморфизма — город буквально выглядит как мозг.
|
||||
|
||||
**Цикл региона:** Социальный: объединение → расцвет → расслоение → конфликт → распад → объединение. Фракции постоянно проходят через этот цикл. Игрок может вмешиваться.
|
||||
|
||||
**Уникальные существа/NPC:**
|
||||
- **Когниты** — ментальные паразиты, воплощающие когнитивные искажения. Когнит Подтверждения заставляет игнорировать контраргументы. Когнит Невозвратных Затрат — продолжать провальное дело
|
||||
- **Эмпаты** — существа, отражающие эмоциональное состояние игрока. Агрессия порождает агрессию
|
||||
- **Архетипы** — юнгианские архетипы как буквальные персонажи: Тень, Анима/Анимус, Мудрый Старец
|
||||
|
||||
**Что учит:** психология, коммуникация, переговоры, когнитивные искажения, манипуляции (и защита от них), основы экономики, теория игр.
|
||||
|
||||
### 5. Архипелаг Меркатор (Навигация/География/Астрономия)
|
||||
|
||||
**Ландшафт:** цепь островов в бесконечном (процедурно генерируемом) океане. Карта не даётся — надо составлять самому. Ночное небо — настоящая карта звёзд.
|
||||
|
||||
**Цикл региона:** Навигационный: отлив → прилив → шторм → штиль. Приливы открывают/закрывают проходы между островами. Штормы перестраивают маршруты.
|
||||
|
||||
**Уникальные существа:**
|
||||
- **Стеллариды** — летающие существа, повторяющие паттерны созвездий. По ним можно ориентироваться
|
||||
- **Глубинные** — океанские левиафаны, чьё поведение привязано к лунным циклам
|
||||
- **Картографы** — NPC-отшельники на изолированных островах, каждый знает фрагмент навигации
|
||||
|
||||
**Что учит:** ориентирование, картография, астрономия, метеорология, океанология, геодезия.
|
||||
|
||||
### 6. Руины Логоса (Математика/Логика)
|
||||
|
||||
**Ландшафт:** невозможная геометрия. Эшеровские лестницы, фрактальные здания, пространства с неевклидовой топологией. Всё — гигантская головоломка.
|
||||
|
||||
**Цикл региона:** Логический: тезис → антитезис → синтез → новый тезис. Головоломки эволюционируют: решённая задача порождает более сложную версию.
|
||||
|
||||
**Уникальные существа:**
|
||||
- **Аксиомы** — неуничтожимые сущности, задающие правила локации. Изменить правила — надо «опровергнуть» аксиому
|
||||
- **Парадоксы** — существа, нарушающие внутреннюю логику мира. Опасны, непредсказуемы, но из их останков — ценные ресурсы
|
||||
- **Итераторы** — самокопирующиеся существа. Один превращается в два, два в четыре... Если не остановить рост — экспоненциальная катастрофа
|
||||
|
||||
**Что учит:** логика, комбинаторика, теория чисел, вероятность, основы программирования, криптография.
|
||||
|
||||
### 7. Сердце Синтеза (Все дисциплины)
|
||||
|
||||
**Ландшафт:** центр мира. Гигантская спираль, закручивающаяся внутрь — и чем глубже, тем больше дисциплин требуется одновременно. Визуально: все стили предыдущих регионов наслаиваются, переплетаются, создавая **психоделическую фрактальную мешанину**.
|
||||
|
||||
**Цикл региона:** Мета-цикл. Само Сердце пульсирует, и с каждым «ударом» реальность внутри перестраивается. Одна фаза — физика доминирует, другая — биология, третья — все законы работают одновременно.
|
||||
|
||||
**Финальное испытание:** не босс-файт. Нужно **синтезировать** решение, требующее знаний из ВСЕХ дисциплин. Каждый ран — новая задача. Нет единственного решения — есть класс решений.
|
||||
|
||||
---
|
||||
|
||||
## VII. СУЩНОСТИ И ЭКОЛОГИЯ
|
||||
|
||||
### Экосистемная модель
|
||||
|
||||
Каждое существо в мире имеет:
|
||||
- **Метаболизм** — что ест, что выделяет (реальная биохимия)
|
||||
- **Популяционная динамика** — размножение, смертность, хищничество (уравнения Лотки-Вольтерры, упрощённые)
|
||||
- **Поведенческая модель** — реакция на стимулы, обучение, память
|
||||
- **Роль в цикле** — какую фазу экоцикла поддерживает
|
||||
|
||||
Если игрок истребит хищников — травоядные размножатся → съедят всю растительность → массовый голод → коллапс экосистемы. Это не скриптовое событие — это эмерджентная симуляция.
|
||||
|
||||
### Цикл жизни и смерти (в каждом существе)
|
||||
|
||||
Существа проходят через стадии:
|
||||
```
|
||||
Яйцо/Семя → Личинка/Росток → Юность → Зрелость → Старение → Смерть → Разложение → Нутриенты → Яйцо/Семя
|
||||
```
|
||||
|
||||
Игрок может вмешиваться на любой стадии. Ускорить рост (удобрения, гормоны). Замедлить старение (антиоксиданты, теломераза — да, настоящая наука). Приручить на стадии юности. Получить редкие материалы только от старых особей.
|
||||
|
||||
### Боссы — Архонты
|
||||
|
||||
Архонты — существа, пережившие множество великих циклов. Они **помнят**. Каждый Архонт — воплощение определённой фазы цикла:
|
||||
|
||||
1. **Уроборос** — змей, поедающий свой хвост. Воплощение бесконечного повторения. Бой с ним — петля: одни и те же фазы, но с нарастающей сложностью. Победить = понять паттерн и разорвать его в правильный момент
|
||||
2. **Спора Прайма** — древнейший гриб, ядро Мицелия. Не враждебна, но подавляющая. Контакт = погружение в видения ВСЕХ прошлых циклов одновременно. Испытание рассудка и способности найти порядок в хаосе
|
||||
3. **Энтропа** — воплощение второго закона термодинамики. Всё вокруг неё распадается. Нельзя победить силой (энергия рассеивается). Нужно создать термодинамически замкнутую систему
|
||||
4. **Когнитон** — коллективный разум, составленный из всех когнитов. Бой — психологический: он использует против игрока его собственные когнитивные искажения, выявленные за все раны
|
||||
5. **Фрактал** — существо, состоящее из уменьшенных копий себя. Убей одного — две копии. Убей копии — четыре. Нужен нестандартный подход: изменить масштаб атаки, нарушить самоподобие
|
||||
6. **Нулевой Адепт** — ты из предыдущего мета-цикла. Имеет все способности, которые ты использовал в прошлых ранах. Зеркальный бой — победа = использование того, чего ты НИКОГДА не пробовал
|
||||
|
||||
---
|
||||
|
||||
## VIII. РОГАЛИК-МЕХАНИКИ
|
||||
|
||||
### Смерть как механика
|
||||
|
||||
Смерть в «Синтезе» — не наказание, а **фаза цикла**. Визуально:
|
||||
|
||||
1. Мир замедляется, звуки стихают
|
||||
2. Тело Адепта распадается на элементы (показывает реальный элементный состав тела: 65% O, 18% C, 10% H...)
|
||||
3. Элементы впитываются в почву → по ускоренным нитям бегут к Мицелию
|
||||
4. **Момент между** — 10-30 секунд чистого фрактального визуала. Мириады циклов мелькают перед глазами. Зацикленные петли рождений и смертей, бесконечно вложенные друг в друга. Тихий фоновый гул, складывающийся в паттерн. Игрок может различить в этом хаосе фрагменты — каждый раз разные — из будущих ранов, из лора, из знаний, которые ещё не открыл
|
||||
5. Пробуждение в Споровой Колыбели
|
||||
|
||||
**Цель дизайна «Момента между»:** это не наказание за смерть и не скипаемый экран. Это **награда**. Чем больше знаний накопил — тем больше разглядишь в хаосе. Опытный игрок видит подсказки для следующего рана. Новичок — красивый калейдоскоп.
|
||||
|
||||
### Мета-прогрессия
|
||||
|
||||
**Сохраняется навсегда:**
|
||||
- Кодекс (энциклопедия)
|
||||
- Разблокированные школы/дисциплины
|
||||
- Споры (валюта)
|
||||
- Архонтова Память (побеждённые боссы добавляют лор-фрагменты)
|
||||
- Статистика всех ранов
|
||||
|
||||
**Сохраняется до конца великого цикла (7 ранов):**
|
||||
- Следы в мире (руины лагерей, последствия решений)
|
||||
- Прирученные существа (их потомки)
|
||||
- Взаимоотношения с фракциями NPC (общая репутация)
|
||||
|
||||
**Не сохраняется (обнуляется каждый ран):**
|
||||
- Инвентарь
|
||||
- Уровень здоровья
|
||||
- Собранные элементы и соединения
|
||||
- Позиция на карте
|
||||
- Текущие квесты
|
||||
|
||||
### Школы (стартовые классы)
|
||||
|
||||
| Школа | Стартовые элементы | Стартовый принцип | Стиль игры |
|
||||
|-------|--------------------|--------------------|------------|
|
||||
| **Алхимик** | H, O, C, Na, S, Fe | Химическое равновесие | Зельеварение, взрывчатка, яды |
|
||||
| **Механик** | Fe, Cu, Sn, Si, C | Рычаг и момент силы | Крафт механизмов, ловушки, автоматоны |
|
||||
| **Натуралист** | C, N, O, P, K | Фотосинтез | Приручение, выращивание, экосистемный контроль |
|
||||
| **Навигатор** | Si, Fe, C, H, O | Угловое измерение | Картография, разведка, мобильность |
|
||||
| **Оратор** | (мало элементов) | Когнитивные искажения | Дипломатия, торговля, манипуляция |
|
||||
| **Логик** | (мало элементов) | Булева алгебра | Головоломки, программирование, вероятность |
|
||||
| **Лекарь** | O, C, H, N, Ca, Fe | Анатомия | Лечение, хирургия, нейрохимия |
|
||||
| **Пустой** | (ничего) | (ничего) | Хардкор-режим. Всё с нуля. Открывается после 1-го великого цикла |
|
||||
|
||||
> **Заметка по балансу:** Оратор и Логик компенсируют дефицит элементов мощными стартовыми Принципами (социальная манипуляция и автоматизация соответственно). Точный стартовый набор этих школ (2–3 элемента) — зона балансного тестирования на этапе alpha. Пустой — осознанный хардкор; его жизнеспособность зависит от объёма мета-прогрессии, накопленной игроком.
|
||||
|
||||
### Боевая система
|
||||
|
||||
Бой в «Синтезе» — не про рефлексы, а про подготовку и знание. Основной вопрос не «как быстро нажимаешь кнопки», а «что ты знаешь и что успел синтезировать».
|
||||
|
||||
**Реактивный бой (real-time, неспешный темп):**
|
||||
|
||||
- **Бросок элементов/соединений** — основная атака. Натрий во влажного врага = экзотермический взрыв. Кислота на известняковую броню = растворение. Эффекты следуют реальной химии — игрок учится предсказывать результат.
|
||||
- **Устройства** — ловушки, электрические цепи, газовые облака, автоматоны-турели. Создаются заранее на верстаке или импровизируются на ходу из подручных элементов.
|
||||
- **Среда** — заманить врага в кислотное озеро, обрушить нестабильную конструкцию резонансной частотой, поджечь горючий газ. Каждый биом даёт уникальные средовые тактики.
|
||||
- **Существа-компаньоны** — прирученные существа действуют по поведенческим паттернам (агрессия / защита / поддержка), которые игрок настраивает через понимание нейробиологии.
|
||||
|
||||
**Против Архонтов:**
|
||||
|
||||
- Каждый Архонт — научная головоломка, замаскированная под босс-файт
|
||||
- Грубая сила неэффективна или контрпродуктивна (Фрактал размножается, Энтропа рассеивает энергию)
|
||||
- Нужно определить научный принцип, лежащий в основе Архонта, и применить контрпринцип
|
||||
- Всегда есть несколько валидных решений (химическое, физическое, биологическое, социальное) — реиграбельность
|
||||
|
||||
**Шкала угрозы (почему бой не доминирует):**
|
||||
|
||||
Большинство существ не агрессивны по умолчанию. Агрессия — результат экосистемного давления (голод, территориальность, фаза Эскалации). Игрок, понимающий биологию, может избежать 70% боёв через знание поведенческих триггеров. Это осознанный дизайн: игра про знание, не про убийство.
|
||||
|
||||
### Онбординг и адаптация сложности
|
||||
|
||||
**Первый ран — обучающий, но не tutorial:**
|
||||
|
||||
- Мир генерирует «мягкий» набор: меньше агрессивных существ, больше очевидных реакций, NPC-Споровик сопровождает первый час как ненавязчивый наставник
|
||||
- Игрок не знает, что ран «облегчённый» — ощущение идентично обычному
|
||||
- Смерть в первом ране наступает неизбежно (заложено дизайном) — чтобы нормализовать умирание и показать «Момент между»
|
||||
|
||||
**Динамическая сложность (невидимая для игрока):**
|
||||
|
||||
- 3+ смерти подряд на фазе «Исследование» → мир подбрасывает больше подсказок, безопасных зон, «удачных» находок
|
||||
- Прохождение «Кризиса» без потерь → следующий ран усиливает вызов
|
||||
- Система не ощущается как «помощь» — воспринимается как естественная вариативность мира
|
||||
|
||||
### Система сохранения
|
||||
|
||||
- **Авто-сохранение** при входе/выходе из регионов и при взаимодействии с грибными узлами Мицелия
|
||||
- **Roguelike integrity:** нельзя «переиграть» момент — только продолжить с последнего автосейва или начать новый ран
|
||||
- **Между ранами:** мета-прогрессия сохраняется автоматически и немедленно
|
||||
- **Выход из игры:** текущее состояние рана сохраняется, можно вернуться в ту же точку
|
||||
|
||||
---
|
||||
|
||||
## IX. ЦИКЛЫ РОЖДЕНИЯ И СМЕРТИ: ГЛУБОКАЯ ИНТЕГРАЦИЯ
|
||||
|
||||
### Циклы в визуальном дизайне
|
||||
|
||||
Всё в мире визуально зациклено:
|
||||
- **Анимации** существ — плавные петли без начала и конца
|
||||
- **Архитектура** — спирали, кольца, уроборосы, вложенные окружности
|
||||
- **UI** — таблица Менделеева расположена по спирали; полоска жизни — не линейная, а кольцевая (когда «здоровье» кончается, кольцо заполняется заново, но другим цветом — «вторая жизнь», «третья жизнь», каждая короче)
|
||||
- **Карта мира** — спиральная, закручивающаяся к Сердцу Синтеза
|
||||
- **Шрифты и руны** Синтетиков — основаны на циклических символах
|
||||
|
||||
### Циклы в звуковом дизайне
|
||||
|
||||
- **Музыка** строится на лупах, которые медленно эволюционируют — каждый повтор чуть-чуть другой
|
||||
- **Эмбиент** — природные циклические звуки: дыхание мира, пульс Мицелия, ритмичный стук древних машин
|
||||
- **Звук смерти** — не тишина и не драматический удар, а замедление всех звуков до тех пор, пока не останется только одна нота — которая становится первой нотой музыки нового рана
|
||||
|
||||
### Циклы в нарративе
|
||||
|
||||
**Дневник Последнего Синтетика** — фрагменты текста, разбросанные по миру. Ключевые фразы:
|
||||
|
||||
> «Я записываю это в сто сорок седьмой раз. Или в первый. Разница стирается.»
|
||||
|
||||
> «Мицелий помнит то, что я забыл. А может, он помнит то, чего не было. Или то, что будет. Для грибов это одно и то же.»
|
||||
|
||||
> «Цикл — не тюрьма. Тюрьма — это когда ты не знаешь, что ты в цикле. Когда знаешь — это спираль. А спираль ведёт куда-то.»
|
||||
|
||||
> «Мы не сломали цикл. Мы стали его новым витком. И это не поражение.»
|
||||
|
||||
> «Всякий раз, когда я умираю, вижу одно и то же: бесконечную вложенность. Я внутри существа, которое внутри мира, который внутри мысли, которая внутри меня. Это пугало, пока я не понял: так выглядит истина, если смотреть прямо.»
|
||||
|
||||
### Циклы в геймплее: механика Déjà Vu
|
||||
|
||||
Иногда (с нарастающей частотой) игра подбрасывает ситуации, **идентичные** прошлым ранам:
|
||||
- Тот же NPC с тем же предложением в том же месте
|
||||
- Та же ловушка, тот же расклад
|
||||
- Игрок может «узнать» ситуацию и получить бонус за правильное решение
|
||||
|
||||
Но иногда — **ложное** déjà vu. Ситуация ВЫГЛЯДИТ так же, но ключевая деталь изменена. Реагировать по шаблону = попасть в ловушку. Учит критическому мышлению: не доверяй паттернам слепо.
|
||||
|
||||
### Циклы в обучении игрока
|
||||
|
||||
Каждая научная концепция в игре преподаётся циклически:
|
||||
|
||||
```
|
||||
ПЕРВЫЙ КОНТАКТ Игрок случайно обнаруживает явление (натрий + вода = БУМ)
|
||||
↓
|
||||
ЭКСПЕРИМЕНТ Пробует повторить, варьируя условия (сколько натрия? температура воды?)
|
||||
↓
|
||||
ПОНИМАНИЕ Кодекс записывает формулу и объяснение
|
||||
↓
|
||||
ПРИМЕНЕНИЕ Использует в бою/крафте/выживании
|
||||
↓
|
||||
УГЛУБЛЁННОЕ ОТКРЫТИЕ Находит неочевидное применение (электролиз NaOH для получения чистого натрия)
|
||||
↓
|
||||
ОБУЧЕНИЕ ДРУГИХ Может «научить» NPC, получая учеников и репутацию
|
||||
↓
|
||||
ПЕРЕОСМЫСЛЕНИЕ В следующем ране знакомое явление работает в новом контексте
|
||||
↓
|
||||
ПЕРВЫЙ КОНТАКТ (Нового уровня) — цикл повторяется на более глубоком уровне
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## X. ТЕХНИЧЕСКИЕ ЗАМЕТКИ ПО РЕАЛИЗАЦИИ
|
||||
|
||||
### Стек (рекомендации для 2D)
|
||||
|
||||
- **Движок:** Godot 4 (открытый, отлично для 2D, GDScript/C#)
|
||||
- **Генерация мира:** Wave Function Collapse + правила реальной геологии/экологии
|
||||
- **Химическая система:** база данных реальных реакций (~2000 самых значимых), движок проверки валидности по упрощённым правилам
|
||||
- **Экосимуляция:** агентная модель, уравнения Лотки-Вольтерры для популяций, конечные автоматы для поведения
|
||||
- **Мицелий:** граф, обновляемый между ранами, хранящий «память» мира
|
||||
- **Визуал:** пиксель-арт с шейдерными эффектами для «мицелиевых» искажений, фрактальная генерация для момента между циклами
|
||||
|
||||
### Приоритеты прототипирования
|
||||
|
||||
1. Химическая система комбинаций (ядро)
|
||||
2. Один биом с рабочей экосистемой
|
||||
3. Цикл рана (рождение → смерть → мета-прогрессия)
|
||||
4. «Момент между» (визуал смерти/перерождения)
|
||||
5. Мицелий как хранилище мета-данных
|
||||
|
||||
### Управление скоупом: дорожная карта
|
||||
|
||||
Проект амбициозен. Ниже — реалистичная разбивка по этапам, позволяющая выпускать играбельные билды на каждом шаге.
|
||||
|
||||
**Вертикальный срез (6–9 месяцев):**
|
||||
- 1 полный биом (Каталитические Пустоши) с рабочей экосистемой
|
||||
- ~20 элементов, ~50 реакций
|
||||
- Полный цикл одного рана (Пробуждение → Кризис → Смерть → Перерождение)
|
||||
- Мицелий: базовая мета-прогрессия (споры, кодекс)
|
||||
- «Момент между» (визуал смерти)
|
||||
- 1 Архонт (Уроборос)
|
||||
- 2 школы (Алхимик, Натуралист)
|
||||
|
||||
**Alpha (12–18 месяцев):**
|
||||
- 3 биома (+ Кинетические Горы, Вердантовые Леса)
|
||||
- ~40 элементов, ~200 реакций
|
||||
- Базовые Принципы (физика + химия + биология)
|
||||
- Великий цикл (7 ранов) с работающими следами между ранами
|
||||
- 4 школы
|
||||
|
||||
**Beta (18–24 месяца):**
|
||||
- Все 7 биомов
|
||||
- Полная химическая система (~70 элементов, ~2000 реакций)
|
||||
- Все Принципы и Техники
|
||||
- Все 6 Архонтов
|
||||
- Все 8 школ
|
||||
- Полный нарративный путь (49 ранов)
|
||||
|
||||
### Доступность
|
||||
|
||||
- **Цветовая слепота:** элементы и реакции идентифицируются не только цветом, но уникальной формой значка и символом
|
||||
- **Масштабируемый UI и текст** — особенно критично для химических формул и мелких обозначений
|
||||
- **Настраиваемая скорость игры** (0.5x — 1.5x) — не влияет на баланс, но позволяет замедлить бой
|
||||
- **Субтитры** для всех аудио-подсказок (пульс Мицелия, предупреждающие звуки существ)
|
||||
- **Переназначение клавиш** — полное
|
||||
|
||||
---
|
||||
|
||||
## XI. МОНЕТИЗАЦИЯ (этика)
|
||||
|
||||
- **Premium:** единоразовая покупка. Никаких microtransactions
|
||||
- **DLC:** новые дисциплины (Музыка/Акустика, Кулинария как отдельный глубокий модуль, Астрофизика)
|
||||
- **Никогда:** pay-to-win, ускорение прогресса за деньги, продажа спор, лутбоксы
|
||||
|
||||
Знание — единственная валюта, которую нельзя купить. Это и есть месседж игры.
|
||||
|
||||
---
|
||||
|
||||
## XII. ЕДИНОЕ ВИДЕНИЕ
|
||||
|
||||
> Игрок запускает «Синтез» ради геймплея. Умирает раз за разом, учится, пробует, ошибается. Через 10 ранов понимает, что запомнил таблицу валентностей. Через 30 — объясняет знакомому, почему небо голубое. Через 100 — разбирается в когнитивных искажениях лучше, чем после курса психологии.
|
||||
>
|
||||
> А в игре — продолжает умирать. И каждая смерть красива. Каждое перерождение — новая возможность. Цикл не кончается. Спираль раскручивается.
|
||||
>
|
||||
> Это и есть Синтез.
|
||||
38
tests/setup.test.ts
Normal file
38
tests/setup.test.ts
Normal file
@@ -0,0 +1,38 @@
|
||||
import { describe, it, expect } from 'vitest';
|
||||
|
||||
describe('Project Setup', () => {
|
||||
it('should have working test infrastructure', () => {
|
||||
expect(1 + 1).toBe(2);
|
||||
});
|
||||
|
||||
// Phaser requires Canvas API — verified in browser via Playwright, not in unit tests
|
||||
it.skip('should import Phaser types (browser-only)', async () => {
|
||||
const Phaser = await import('phaser');
|
||||
expect(Phaser).toBeDefined();
|
||||
});
|
||||
|
||||
it('should import bitECS 0.4 API', async () => {
|
||||
const { createWorld, addEntity, addComponent, query } = await import('bitecs');
|
||||
expect(createWorld).toBeTypeOf('function');
|
||||
expect(addEntity).toBeTypeOf('function');
|
||||
expect(addComponent).toBeTypeOf('function');
|
||||
expect(query).toBeTypeOf('function');
|
||||
});
|
||||
|
||||
it('should create ECS world and entities', async () => {
|
||||
const { createWorld, addEntity, addComponent, query } = await import('bitecs');
|
||||
|
||||
const Position = { x: [] as number[], y: [] as number[] };
|
||||
const world = createWorld();
|
||||
const eid = addEntity(world);
|
||||
|
||||
addComponent(world, eid, Position);
|
||||
Position.x[eid] = 10;
|
||||
Position.y[eid] = 20;
|
||||
|
||||
const entities = query(world, [Position]);
|
||||
expect(entities).toContain(eid);
|
||||
expect(Position.x[eid]).toBe(10);
|
||||
expect(Position.y[eid]).toBe(20);
|
||||
});
|
||||
});
|
||||
17
tsconfig.json
Normal file
17
tsconfig.json
Normal file
@@ -0,0 +1,17 @@
|
||||
{
|
||||
"compilerOptions": {
|
||||
"target": "ESNext",
|
||||
"module": "ESNext",
|
||||
"moduleResolution": "bundler",
|
||||
"strict": true,
|
||||
"esModuleInterop": true,
|
||||
"skipLibCheck": true,
|
||||
"forceConsistentCasingInFileNames": true,
|
||||
"resolveJsonModule": true,
|
||||
"isolatedModules": true,
|
||||
"noEmit": true,
|
||||
"lib": ["ESNext", "DOM", "DOM.Iterable"]
|
||||
},
|
||||
"include": ["src/**/*.ts"],
|
||||
"exclude": ["node_modules"]
|
||||
}
|
||||
23
vite.config.ts
Normal file
23
vite.config.ts
Normal file
@@ -0,0 +1,23 @@
|
||||
/// <reference types="vitest" />
|
||||
import { defineConfig } from 'vite';
|
||||
|
||||
export default defineConfig({
|
||||
base: './',
|
||||
build: {
|
||||
target: 'esnext',
|
||||
rollupOptions: {
|
||||
output: {
|
||||
manualChunks: {
|
||||
phaser: ['phaser'],
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
server: {
|
||||
port: 5173,
|
||||
open: false,
|
||||
},
|
||||
test: {
|
||||
environment: 'happy-dom',
|
||||
},
|
||||
});
|
||||
Reference in New Issue
Block a user