# Граф ресурсов — тиковая симуляция (Vite + React + TypeScript) ## Запуск ```bash npm install npm run dev ``` Откроется адрес вида `http://localhost:5173`. ## Сборка ```bash npm run build # tsc -b && vite build -> dist/ npm run preview # локальный просмотр собранного dist/ ``` ## Структура - `src/engine.ts` — ядро симуляции: типы (`SimNode`, `SimEdge`, `Behavior`, `Topology`, `Buffers`), функция `tick()` (один детерминированный тик) и `resetBuffers()`. Модуль не зависит от React/DOM — логика переносима на другой стек (Rust/C#/GDScript) по этой же спецификации. - `src/storage.ts` — чтение/запись localStorage (`incsim.topology.v1`, `incsim.buffers.v1`, `incsim.tickcount.v1`). - `src/App.tsx` — состояние приложения (topology/buffers/tickCount/selected), все обработчики мутаций, эффекты персистентности. - `src/components/` — `Topbar`, `WorldCanvas` (холст с узлами и SVG-связями), `NodeCard` (перетаскиваемая карточка узла), `EdgeLines` (SVG-стрелки), `Sidebar`, `NodeEditor`, `EdgeEditor`, `RecipeEditor`. ## Модель - **Storage** — пассивный буфер с ёмкостью. - **Converter** — единственный активный узел: раз в `period` тиков атомарно списывает `inputs` и начисляет `outputs` в собственном буфере. `source`/`consumer` — его частные случаи с пустым списком входов/выходов. - **Edge** — перенос ресурса между буферами узлов; конкуренция при fan-in/fan-out разрешается по `priority` (выше — раньше), порядок обработки узлов/рёбер фиксирован — тик полностью детерминирован. Reset обнуляет буферы и таймеры конвертеров, настройки узлов/связей не трогает.