Перейти к основному содержимому

Фреймворки на коде

Как Fabled запускает ваш код

Пройдите путь проекта от исходного кода до игры: что и когда запускается, как работает журнал и что доказывает сценарий.

От исходного кода до игры

Ваш проект проходит пять шагов. Только последний из них это игра. Предыдущие шаги никогда не меняют живого персонажа.

  1. Написать

    Вы правите исходные файлы в редакторе кода. Пока ничего не запускается.

  2. Проверить

    Проверить и показать компилирует ваши текущие правки и запускает каждый сценарий, сохранены они или нет. Ошибки появляются в панели «Проблемы». Ничего не публикуется.

  3. Сохранить

    Сохранить проект записывает исходный код как новую версию вашей игры. Подготовка работает только с сохранённой версией, поэтому сохраните проект до неё.

  4. Подготовить

    Подготовить мою игру строит приватные фреймворки, фреймы и контент из сохранённой версии. Сервер проверяет проект ещё раз, и его вердикт окончательный.

  5. Играть

    Игрок создаёт персонажа из вашего фреймворка. Конструктор его строит, а действия его меняют.

Что и когда запускается

ЧастьКогда запускаетсяЧто делает
КонструкторОдин раз, когда элемент создаётся из фреймворка.Превращает входные данные в начальные значения. Он никогда ничего не записывает.
Функция журналаКогда элемент строится, в порядке, в котором схема объявляет функции, и снова после каждого действия.Выводит значение из хранимых значений. Действие не может его записать.
ДействиеКогда игрок нажимает кнопку, которая его вызывает.Записывает в журнал через 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. Конструктор считает его один раз, поэтому позднее изменение полей, из которых оно получено, его не сдвинет.

Что доказывает сценарий

  • Конструктор возвращает ожидаемые вами значения.
  • Каждое действие делает ровно те записи, которые вы перечислили.
  • Производные значения получаются верными, в том числе после действия.
  • Каждый файл используется, и весь проект компилируется.

Сценарий не доказывает, как выглядит лист и каково правило в игре. Для этого попробуйте подготовленную игру.

Дальше