From f6c338e1b06270a32ff7164b2b643e0258598a30 Mon Sep 17 00:00:00 2001 From: Ku6epXBOCTuK Date: Sat, 5 Sep 2026 16:37:45 +0500 Subject: [PATCH] feat: add server and frontend initial - wood chopping --- .env.example | 22 ++ README.md | 20 +- docs/PLAN.md | 10 +- packages/overlay/src/App.svelte | 27 +- packages/overlay/src/net.ts | 10 +- packages/render/src/avatar.ts | 177 ++++++++++-- packages/render/src/index.ts | 1 + packages/render/src/tree.ts | 45 ++++ packages/render/src/world.ts | 191 +++++++++++-- packages/server/package.json | 3 + packages/server/scripts/dev-cmd.mjs | 15 ++ packages/server/smoke.mjs | 68 +++-- packages/server/src/config.ts | 79 ++++++ packages/server/src/index.ts | 205 ++++++++++++-- packages/server/src/net/camera.ts | 46 ++++ packages/server/src/net/ws.ts | 20 +- packages/server/src/persist/db.ts | 56 ++++ packages/server/src/sim/stub.ts | 43 --- packages/server/src/sim/world.ts | 369 ++++++++++++++++++++++++++ packages/server/src/twitch/fake.ts | 85 ++++++ packages/server/src/twitch/source.ts | 14 + packages/server/src/twitch/twurple.ts | 72 +++++ packages/shared/src/content.ts | 65 +++++ packages/shared/src/index.ts | 1 + packages/shared/src/protocol.ts | 104 +++++++- packages/web/src/App.svelte | 116 ++++++-- packages/web/src/net.ts | 10 +- pnpm-lock.yaml | 178 +++++++++++++ 28 files changed, 1857 insertions(+), 195 deletions(-) create mode 100644 .env.example create mode 100644 packages/render/src/tree.ts create mode 100644 packages/server/scripts/dev-cmd.mjs create mode 100644 packages/server/src/config.ts create mode 100644 packages/server/src/net/camera.ts create mode 100644 packages/server/src/persist/db.ts delete mode 100644 packages/server/src/sim/stub.ts create mode 100644 packages/server/src/sim/world.ts create mode 100644 packages/server/src/twitch/fake.ts create mode 100644 packages/server/src/twitch/source.ts create mode 100644 packages/server/src/twitch/twurple.ts create mode 100644 packages/shared/src/content.ts diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..8eb845a --- /dev/null +++ b/.env.example @@ -0,0 +1,22 @@ +# Скопировать в .env и настроить под себя. .env в git не попадает. + +# --- разработка без живого чата --- +# фейковые зрители, генерируют !рубить/!стоп +FAKE_VIEWERS=5 +# dev-эндпоинты: POST /dev/command {"name":"Ник","text":"!рубить"}, GET /dev/state +DEV_HTTP=1 + +# --- Twitch (см. docs/twitch-setup.md) --- +# TWITCH_CLIENT_ID= +# TWITCH_CLIENT_SECRET= +# TWITCH_CHANNEL= +# TWITCH_BOT_TOKEN= +# TWITCH_BOT_REFRESH= + +# объявлять левелапы в чат (троттлинг 60 сек) +# CHAT_ANNOUNCE_LEVELUP=1 + +# --- прочее --- +# PORT=3000 +# TICK_MS=1000 +# SQLITE_PATH=data/idle-xboct.db diff --git a/README.md b/README.md index b752d93..89191c6 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ Idle-игра для Twitch-чата: аватары зрителей живут на экране стрима, команды чата управляют ими. План и все решения — в [docs/PLAN.md](docs/PLAN.md). -## Запуск (M0 — каркас) +## Запуск (M1 — вертикальный срез) ```bash pnpm install @@ -12,9 +12,23 @@ pnpm dev - сервер: http://localhost:3000 — WS на `/ws`, здоровье на `/healthz` - overlay (browser source для OBS): http://localhost:5173 -- web-мир: http://localhost:5174 +- web-мир: http://localhost:5174 — топ зрителей и лента событий Сборка клиентов (`pnpm build`) — сервер начнёт раздавать их сам: `/overlay/` и `/web/` на порту 3000 (это режим для OBS, без vite dev-сервера). -Twitch-подключение — с M1, чек-лист получения токенов: [docs/twitch-setup.md](docs/twitch-setup.md). +### Разработка без живого стрима + +Скопируй `.env.example` в `.env` и включи `FAKE_VIEWERS=5` — фейковые зрители начнут +писать `!рубить`/`!стоп`. С `DEV_HTTP=1` можно дёргать вручную: + +```bash +curl -X POST http://localhost:3000/dev/command -H "content-type: application/json" \ + -d '{"name":"Тестер","text":"!рубить"}' +``` + +Живой чат: заполни `TWITCH_*` по чек-листу [docs/twitch-setup.md](docs/twitch-setup.md) — +бот подхватит их при старте автоматически. + +Дымовой тест: сервер с `DEV_HTTP=1 SQLITE_PATH=:memory:`, затем `pnpm --filter @idle/server smoke`. + diff --git a/docs/PLAN.md b/docs/PLAN.md index 4aa87ba..59976f0 100644 --- a/docs/PLAN.md +++ b/docs/PLAN.md @@ -15,12 +15,17 @@ | Клиенты | Svelte 5 + PixiJS 8 (8.x) + bitecs 0.4 | | Сервер | Node.js, `node:http` + `ws` + `sirv` (без фреймворка), симуляция на bitecs | | Twitch | `@twurple/easy-bot` (чтение команд + ответы в чат), `@twurple/eventsub-ws` (Channel Points) | -| БД | SQLite (`better-sqlite3`) через тонкий слой репозиториев | +| БД | SQLite через тонкий слой persist. M1: встроенный `node:sqlite` (Node ≥24, без нативных сборок и install-скриптов); замена на `better-sqlite3`/др. — при необходимости, не трогая остальной код | Решения по ECS: **bitecs, новый API 0.4** (в 0.4 API переписан; старый доступен как `bitecs/legacy`). Запасной вариант — koota (pmndrs), если новый API окажется слишком зубодробительным. miniplex отклонён (объектный оверхед + не развивается с 2023). +**Уточнение по факту M1:** вертикальный срез сделан на plain TS за узким интерфейсом +`SimWorld` (сущностей — десятки, выгод от ECS ноль, а 0.4 требует чтения исходников). +Решение по ECS — в M2 по факту роста: bitecs 0.4, koota или остаться на plain TS, +если масштабы не потребуют. + ## Архитектура ```txt @@ -195,6 +200,9 @@ Twitch не используем. На старте все зрители с о 3. **Решено: идём полностью на бесплатном.** База — Kenney (CC0); OpenGameArt — с проверкой лицензии каждого ассета. Платные паки (LimeZu ≈ $5) — опция на потом, если захочется единого стиля +4. **M1 — процедурные спрайты в коде** (человечек, топор, деревья рисуются Pixi-графикой): + ноль лицензионных рисков и мгновенные правки; паки подключаем с M2, заменив + `AvatarView`/`TreeView` в `render` ## Идеи на потом diff --git a/packages/overlay/src/App.svelte b/packages/overlay/src/App.svelte index 59d1c93..164002c 100644 --- a/packages/overlay/src/App.svelte +++ b/packages/overlay/src/App.svelte @@ -1,7 +1,7 @@