Фреймворки на коде
Как Fabled запускает ваш код
Пройдите путь проекта от исходного кода до игры: что и когда запускается, как работает журнал и что доказывает сценарий.
От исходного кода до игры
Ваш проект проходит пять шагов. Только последний из них это игра. Предыдущие шаги никогда не меняют живого персонажа.
- Написать
Вы правите исходные файлы в редакторе кода. Пока ничего не запускается.
- Проверить
Проверить и показать компилирует ваши текущие правки и запускает каждый сценарий, сохранены они или нет. Ошибки появляются в панели «Проблемы». Ничего не публикуется.
- Сохранить
Сохранить проект записывает исходный код как новую версию вашей игры. Подготовка работает только с сохранённой версией, поэтому сохраните проект до неё.
- Подготовить
Подготовить мою игру строит приватные фреймворки, фреймы и контент из сохранённой версии. Сервер проверяет проект ещё раз, и его вердикт окончательный.
- Играть
Игрок создаёт персонажа из вашего фреймворка. Конструктор его строит, а действия его меняют.
Что и когда запускается
| Часть | Когда запускается | Что делает |
|---|---|---|
| Конструктор | Один раз, когда элемент создаётся из фреймворка. | Превращает входные данные в начальные значения. Он никогда ничего не записывает. |
| Функция журнала | Когда элемент строится, в порядке, в котором схема объявляет функции, и снова после каждого действия. | Выводит значение из хранимых значений. Действие не может его записать. |
| Действие | Когда игрок нажимает кнопку, которая его вызывает. | Записывает в журнал через ledger.set и ledger.add. |
| Фрейм | Каждый раз, когда показывается лист. | Читает хранимые значения и рисует их. Его кнопки вызывают действия. |
| Сценарий | В режиме «Проверить и показать», но не в игре. | Строит элемент, запускает действия и сравнивает каждое значение и каждую запись. |
Журнал
Значения элемента никогда не правятся на месте. Каждое изменение это запись в его журнале. ledger.set заменяет значение, а ledger.add прибавляет к нему. Сценарии перечисляют эти записи, поэтому вы точно видите, что делает правило.
Производное значение приходит из функции журнала, поэтому действие не может его записать. Проверка это отклоняет:
which is a non-writable state fieldКонструктор всё равно возвращает поле, которое выводит функция журнала, с временным значением, например 0. Функция журнала заменяет это значение, когда элемент строится. Сценарий сравнивает свои expectedValues со значениями после работы функций журнала, поэтому пишите там производное значение, а не временное.
Функции журнала работают в порядке, в котором их объявляет схема, и каждая видит результаты предыдущих. Объявляйте функцию после тех функций, поля которых она читает. Здесь total читает base, но объявлена первой, поэтому читает временное значение:
{
"ledgerFunctions": [
{
"id": "total",
"name": "Total",
"field": "total",
"source": "rules/total.ts"
},
{
"id": "base",
"name": "Base",
"field": "base",
"source": "rules/base.ts"
}
]
}expectedValues.total: expected 11, constructor returned 1Используйте функцию журнала для значения, которое должно следовать за другими полями и которое не пишет ни одно действие. Используйте значение конструктора для числа, которым владеет персонаж и которое меняют действия, например hp. Конструктор считает его один раз, поэтому позднее изменение полей, из которых оно получено, его не сдвинет.
Что доказывает сценарий
- Конструктор возвращает ожидаемые вами значения.
- Каждое действие делает ровно те записи, которые вы перечислили.
- Производные значения получаются верными, в том числе после действия.
- Каждый файл используется, и весь проект компилируется.
Сценарий не доказывает, как выглядит лист и каково правило в игре. Для этого попробуйте подготовленную игру.

