Skip to content
GitLab
Projects Groups Snippets
  • /
  • Help
    • Help
    • Support
    • Community forum
    • Submit feedback
  • Sign in / Register
  • Vector Survivors Vector Survivors
  • Project information
    • Project information
    • Activity
    • Labels
    • Members
  • Repository
    • Repository
    • Files
    • Commits
    • Branches
    • Tags
    • Contributors
    • Graph
    • Compare
  • Issues 0
    • Issues 0
    • List
    • Boards
    • Service Desk
    • Milestones
  • Merge requests 0
    • Merge requests 0
  • CI/CD
    • CI/CD
    • Pipelines
    • Jobs
    • Schedules
  • Deployments
    • Deployments
    • Environments
    • Releases
  • Packages and registries
    • Packages and registries
    • Package Registry
    • Infrastructure Registry
  • Monitor
    • Monitor
    • Metrics
    • Incidents
  • Analytics
    • Analytics
    • Value stream
    • CI/CD
    • Repository
  • Wiki
    • Wiki
  • Snippets
    • Snippets
  • Activity
  • Graph
  • Create a new issue
  • Jobs
  • Commits
  • Issue Boards
Collapse sidebar
  • Bronuh
  • Vector SurvivorsVector Survivors
  • Wiki
  • Система определений

Система определений · Changes

Page history
Update Система определений authored May 17, 2024 by Bronuh's avatar Bronuh
Hide whitespace changes
Inline Side-by-side
Система-определений.md 0 → 100644
View page @ 1e3777d9
Игра пытается в *data-oriented* дезигн, для чего была нагорожена куча сомнительных типов, но в римке работает, значит и тут будет.
## Основные типы
Система состоит из трех основных типов:
- **Def (определение)** - определение, из которого потом будут создаваться сущности
- **Thing (штука/сущность)** - непосредственно сущность, чьи свойства описываются определением (Def)
- **ThingFactory (фабрика)** - тип, определяющий логику создания сущностей из описания.
## Вспомогательные типы
Для упрощения работы создано несколько вспомогательных статических классов:
- **DefsRegistry** - статическое хранилище определений и их типов.
- **ThingFactoriesRegistry** - статическое хранилище фабрик.
## Особенности конкретных типов
### Def
Тип **Def** по идее должен предоставлять гибкую систему управления игровым контентом, но как оно на деле будет, мне ещё предстоит выяснить. Тип содержит встроенный примитивный десериализатор, который может автоматически читать и назначать примитивные типы и другие определения.
Для автоматической десериализации свойство должно быть `public` или `protected`, а также быть отмечено атрибутом `[DefProperty]`. Для определения своей логики десериализации можно переопределить метод `InitFromJson`.
#### Коротко о базовых свойствах:
- `DefSource` - содержит название контентпака, добавившего его. Должен назначаться самой игрой.
- `DefType` - Название C# типа определения. Не имеет особого смысла назначать его при генерации определений из кода, но это обязательное поле для внешнего `json5` конфига.
- `DefName` - Название определения, которое будет использовано в качестве ключа для поиска в хранилище определенй.
- `BasedOn` - Название определения, которое будет склонировано и использовано в качестве основы для нового определения.
- `DefLabel` - Читаемое человеком название, либо ключ его локализации.
- `DefDescription` - Читаемое человеком описание, либо ключ его локализации.
### Thing
Представляет собой интерфейс `IThing`, содержащий в себе один единственный геттер - `Def`. Ничего сложного.
### ThingFactory
Фабрика сущностей. Получает на вход описание, возвращает сущность.
Должна реализовывать 2 свойства:
- `ThingType` - тип сущности, которая будет создаваться
- `DefType` - тип описания, из которого будет создана сущность
Ну и сам метод `IThing Create(Def)`, который создает сущность.
Дополнительно у класса имеется статический метод `IThing TryCreate(Def)`, который попытается найти нужную фабрику в хранилище и создать на неё сущность. Чисто для удобства.
### DefsRegistry
Хранилище определений. Хранит в себе известные типы определений и сами определения. Умеет разрешать зависимости между определениями. При инициализации находит все подтипы `Def` в загруженных сборках, регистрируя их, после чего среди найденных типов ищет те, что отмечены атрибутом `[AutoDef]`, генерируя из них определение по умолчанию, без необходимости во внешнем конфиге.
Типы определений всегда регистрируются по `Type.Fullname`, но в случае, если речь идет об определениях, чьи типы лежат в пространстве имен `VectorSurvivors`, то его можно опускать, используя только имя класса.
### ThingFactoriesRegistry
Хранилище фабрик сущностей. Можно регать конкретную фабрику, либо искать активную фабрику по её типу. Ничего сложного.
## Планы
В планах переставить на Def-рельсы весь игровой контент. Возможно, даже UI. Также хотелось бы намутить возможность написания патчей для определений.
\ No newline at end of file
Clone repository
  • Home
  • Локализация (WIP)
  • Система определений
  • Управление ресурсами