|
|
Игра пытается в *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 |