Статус: Draft


Актуальная карта сборок проекта. Обновлять при добавлении новых модулей или изменении зависимостей.

Граф пересмотрен в рамках Фазы 1 (см. 10. Архитектура реализации — Фаза 1 §2). Старый набор (Core/Units/Combat/Guild/UI) был временным; здесь — финальная структура «как надо».


Граф зависимостей

Core
 ├─ Data            → Core
 ├─ Combat          → Core, Data
 ├─ Guild           → Core, Data
 ├─ MiniGames       → Core, Data
 ├─ Net             → Core, Combat
 ├─ Presentation    → Core, Data, Combat
 ├─ UI              → Core, Data, Guild
 ├─ DevTools        → Core, Data, Combat, Game
 └─ Game            → Core, Data, Combat, Guild, MiniGames, Net, Presentation, UI

Стрелка означает «зависит от». Всё зависит только вниз. Game — единственный, кто знает всех (composition root). Core ни от чего не зависит.


Текущие сборки

СборкаПутьЗависит отВнешние пакетыНазначение
Guildmaster.CoreScripts/Core/— (по возможности noEngineReferences)IRngService, математика сим, тик-контракты, базовые интерфейсы команд/событий
Guildmaster.DataScripts/Data/CoreOdin, UnityEngineScriptableObject-определения (StatsConfig, RelicData, VesselData, EffectData), StatType, ScalableValue, полиморфные интерфейсы поведения (IEffectComponent)
Guildmaster.CombatScripts/Combat/Core, Data— (чистая логика, без VContainer/UniTask/физики)Детерминированная симуляция: RuntimeUnit, Stats, тик-степпер, системы, пайплайн урона, ICombatContext, spatial hash
Guildmaster.GuildScripts/Guild/Core, DataРостер, RunState, ресурсы (стаб до Фазы 5)
Guildmaster.MiniGamesScripts/MiniGames/Core, DataИзолированные мини-игры за IMiniGame (стаб)
Guildmaster.NetScripts/Net/Core, CombatNGO, Facepunch.SteamworksHost-authoritative реле команд, инициализация транспорта (спайк в Фазе 1)
Guildmaster.PresentationScripts/Presentation/Core, Data, CombatShapes, Feel, LitMotion, MessagePipe, UniTaskWorld-space вид боя: спрайты, HP-бары, damage numbers, debug-draw, фидбэк. Только читает сим
Guildmaster.UIScripts/UI/Core, Data, GuildUI Toolkit, MessagePipeЭкраны меню/HUD/карты, MVVM (стаб до Фазы 7)
Guildmaster.DevToolsScripts/DevTools/Core, Data, Combat, GameQuantum ConsoleDebug-команды gm_*
Guildmaster.GameScripts/Game/все вышеVContainer, MessagePipe, UniTask, NGOComposition root (RootLifetimeScope/CombatLifetimeScope), GameFlow, загрузка сцен, пуск тик-цикла
Guildmaster.Tests.EditModeTests/EditMode/Core, Data, CombatNUnitДетерминизм, урон, статы, spatial hash, снаряды
Guildmaster.Tests.PlayModeTests/PlayMode/Core, Data, Combat, GameNUnitИнтеграция: battle start → loop → end

Все пути — относительно Assets/_Project/Scripts/ (рантайм) и Assets/Tests/ (тесты).


Правила

Куда класть новый скрипт

  1. Базовые контракты и математика сим (IRngService, тик-константы, интерфейсы команд/событий) → Core
  2. Данные-определения (SO: статы, реликвии, сосуды, эффекты; полиморфные интерфейсы поведения) → Data
  3. Логика боя (симуляция, урон, движение, таргетинг, снаряды) → Combat
  4. Гильдия (ростер, RunState, ресурсы) → Guild
  5. Сеть (host-auth реле, транспорт) → Net
  6. World-space презентация боя (спрайты, HP-бары, числа, debug-draw, Feel) → Presentation
  7. Экранный UI (UI Toolkit, меню, HUD, MVVM) → UI
  8. Debug-команды (gm_*, Quantum Console) → DevTools
  9. Composition root, GameFlow, загрузка сцен, тик-пульсGame

Запрещённые зависимости

  • Core не зависит ни от чего в проекте
  • Data зависит только от Core (никакой боевой/сетевой логики)
  • Combat — чистая C#-логика: без VContainer, UniTask, Unity-физики; зависимости приходят через конструкторы, не [Inject]
  • Presentation/UI только читают сим — не мутируют состояние боя
  • Зависеть от Game может только DevTools; сам Game — вершина, его никто (кроме DevTools) не импортирует
  • Циклические зависимости запрещены

Если зависимость тянет вверх (Combat хочет знать о Guild) — вынеси общий интерфейс в Core. Если SO-определение тянет поведение (RelicDataEffectData/IEffectComponent) — оба живут в Data, ниже Combat.

Добавление нового модуля

  1. Создать папку в Assets/_Project/Scripts/<ModuleName>/
  2. Создать .asmdef: Create → Assembly Definition в Unity
  3. Имя сборки: Guildmaster.<ModuleName>
  4. Namespace: Guildmaster.<ModuleName>
  5. Добавить зависимости только те, что реально нужны
  6. Обновить таблицу в этом файле
  7. Обновить .asmdef тестовых сборок, если тесты покрывают новый модуль

Именование

  • Файл .asmdef: Guildmaster.<ModuleName>.asmdef
  • Имя сборки (name): Guildmaster.<ModuleName>
  • Корневой namespace (rootNamespace): Guildmaster.<ModuleName>
  • Папка: PascalCase, совпадает с именем модуля

История изменений

ДатаИзменение
2026-05-28Начальная структура: Core, Units, Combat, Guild, UI
2026-05-30Рефактор графа под Фазу 1 (док 10 §2): UnitsData; добавлены MiniGames, Net, Presentation, DevTools, Game. Тесты переведены на Data