07 · Архитектура
Стек
- Клиент: React 18 + TypeScript + Vite, zustand, socket.io-client. Тёмная фэнтези-тема.
- Сервер: Node.js + TypeScript (CommonJS), Express + Socket.io.
- БД: PostgreSQL (
pg). - Хостинг: VPS + nginx (клиент статикой,
/api/и/socket.io/→ прокси на Node).
Серверная авторитарность
Вся игровая логика (бой, дроп, экономика, прокачка, вылазки, кланы) считается на сервере. Клиент — только интерфейс.
Основные модули сервера
| Модуль | Что делает |
|---|---|
game/data.ts |
расы, классы, мобы, предметы, таланты, локации |
game/stats.ts |
формулы характеристик, пассивки, таланты |
game/combat.ts |
пошаговый бой |
game/expedition.ts |
энергия, вылазки, цвета мобов, дроп |
game/player.ts |
персонаж, прокачка, экипировка, реген, смерть |
game/db.ts |
PostgreSQL (игроки, кланы) |
index.ts |
HTTP + Socket.io, события |
Сохранение
- Персонаж сохраняется в PostgreSQL по
playerId(в localStorage клиента). - Кланы — в отдельной таблице
clans. - Позиции маркеров на карте — в JSON-файле на сервере.
Картинки
- Портреты персонажей — прозрачные PNG (генерируются на зелёном хромакее, фон вырезается автоматически при деплое).
- Карты и иконки рас — JPEG.
Звук
- Фоновая музыка живёт в
game/client/src/music.ts— один модуль на всю игру, сервер её не касается. - Сцен три:
base(создание героя, вкладки, столица),farm(охота, вылазка и бой в ней),arena(пошаговый бой на арене). Сцену выбираетApp.tsxпо состоянию стора. - Файлы сцен —
game/client/public/audio/:menu.mp3(база),farm.mp3иarena.mp3. Отдельные треки для фарма и арены кода не требуют: файл, который не открылся, помечается сломанным, и для его сцены играет базовый трек. - Громкость — одна константа
MUSIC_VOLUME = 0.15(15%: музыка фоновая, перебивать игру она не должна). Переключатель — кнопка 🔊 в верхней панели (components/MusicToggle.tsx): одно нажатие выключает, второе включает; флаг вlocalStorage(game_music_muted). Дублирующий переключатель есть в «Меню → Звук». - Переход между сценами — два голоса с плавной громкостью: старый уходит в ноль, новый нарастает. Свёрнутая вкладка музыку глушит и возвращает с того же места, а не с начала.
- Браузер не разрешает звук до первого действия игрока, поэтому включение пробуется сразу при запуске и повторяется на каждом событии, которое может снять запрет (касание, клавиша, фокус,
pageshow, «пробуждение» мини-аппа в Telegram), плюс две отложенные попытки. Где автоплей разрешён (в Telegram обычно разрешён) — музыка играет с первой секунды без нажатий; после успешного старта слушатели снимаются.
Telegram
- Игра задумана как Telegram Mini App (клиент грузит
telegram-web-app.js). - Авторизация через Telegram
initData— в планах (пока вход поplayerId).