# Конфигурация
:muscle:
---
Конфиги -
* хранят данные игры
* создаются разработчиками
* меняются геймдизайнерами
* используются и сервером, и клиентом
---
### Это база данных <br> игровых механик
# :card_file_box:
---
## а еще это текстовые файлы,
и поэтому
---

---
* легко иметь несколько версий
* легко скопировать и сделать новую запись
* легко искать текст
* легко смотреть историю
* легко видеть авторство
* легко отменить ошибочные изменения
* не нужны бекапы
---
а еще они в формате XML, для которого есть большое количество инструментов
---

---
но есть и темная сторона

---
* неоднородность форматов (xml, json)
* неоднородность содержимого
* нет информации о полях в файлах
* не посчитать баланс
* можно сделать неправильные записи и узнать об этом уже на проде
* некоторые конфиги очень большие
---
а еще
git - это непросто
---
Но все-таки git - это удобно, не нужно от него отказываться
---

---
## Создание, заполнение
### и
## проверка
---
# Создание
---
### Файлы
Лучше придерживаться одного формата
:handshake: XML
---
### Файлы
Большие файлы можно разделить на маленькие, а потом собрать как было. Это удобнее при работе с git
```
battle_pass.xml
```
```
battle_pass/
battle_pass_1.xml
battle_pass_2.xml
battle_pass_3.xml
```
---
# Заполнение
:writing_hand:
---
## Гугл-документы
:heart:
но скрипты импорта и экспорта лучше хранить у нас
---
Смелый эксперимент - приложение для десктопа (Electron)
---
# Проверка
:sleuth_or_spy:
---
Конфиги - это база данных, и для нее можно использовать инструменты, которые есть в базах данных
---
# XML Schema
формат `xsd`
---
#### XML Schema
* Стандарт
* Не зависит от языка и платформы
* Есть готовые инструменты
---
#### Типы данных
```xml
<xs:complexType name="ResourceType">
<xs:choice maxOccurs="unbounded">
<xs:element name="type" type="xs:string"/>
<xs:element name="count" type="xs:integer"/>
<xs:element name="itemId" type="xs:integer"/>
</xs:choice>
</xs:complexType>
```
---
#### Типы данных
* Числа
* Строки
* Даты
* Сложные типы
* Ограничения на типы
---
#### Проверка уникальности
```xml
<xs:unique name="UniqueBankOfferId">
<xs:selector xpath="offer"/>
<xs:field xpath="@id"/>
</xs:unique>
<xs:unique name="UniquePackageId">
<xs:selector xpath="offer"/>
<xs:field xpath="packageId"/>
</xs:unique>
```
---
#### Описание и документация
<!-- Объекты, типы, отдельные поля -->
```xml
<xs:annotation>
<xs:documentation>
Что-то, что можно положить в инвентарь.
</xs:documentation>
</xs:annotation>
```
---
#### Внешние ссылки
```sql
ALTER TABLE crafts.xml
ADD FOREIGN KEY (itemId)
REFERENCES items.xml (id)
```
---
#### Внешние ссылки
Увы, проверки внешних ссылок нет в стандарте XML Schema
---
Проверки можно запускать через Gitlab Pipeline

---
Смелый эксперимент - генерация кода из схемы
---
## Конфигурация -
### отдельный компонент
---
* Свой релизный цикл
* Свои ответственные
* Свои правила
---
:house:
## Свой репозиторий
* Нет конфликтов с серверным кодом
* Проще делать merge
---
## В итоге
* Отдельный репозиторий, git для хранения
* XML Schema для описания и проверки
* 2 смелых эксперимента
Спасибо!
{"metaMigratedAt":"2023-06-15T12:38:17.225Z","metaMigratedFrom":"YAML","title":"Конфигурация","breaks":true,"contributors":"[{\"id\":\"4e26b559-162b-4f85-ad1a-424e3bb43fb6\",\"add\":5704,\"del\":2132}]"}