wiki
This page contains an outdated translation of the original content. Please check the English version for the most accurate information (and consider updating the translation if you are able to help out)!

Storyboard Scripting General Rules

Эта страница и остальные части справки описывают код скрипта, расположенный в секции [Events]. Если скрипт вписан в файл с расширением .osb, он будет работать во всех сложностях; если в файл .osu, то только для данной сложности.

Основные правила

Объекты

  • Под "объектом" понимается экземпляр спрайта или анимации в вашей сториборде. Также за объект можно принять звуковой файл (см. соответствующую статью).
  • Поддерживаемые форматы — JPEG и PNG.
    • JPEG — формат сжатия с потерями, что влечёт за собой меньший размер, но худшее качество; кроме этого, в нём не поддерживается прозрачность. JPEG применяют в основном для фонов и изображений, не требующих наличия прозрачности.
    • PNG — формат сжатия без потерь, файлы которого весят больше, чем JPEG, но при этом сохраняют качество оригинальных изображений и прозрачные участки. В нём хранят большинство объектов, требующих чёткости и качества, например, изображения со словами из песен.
  • Вся анимация создаётся встроенным образом, не используйте многослойные или анимированные PNG. Вместо этого сохраняйте каждый кадр в отдельный файл, дописывая его индекс перед расширением. Например, анимация "sample.png" из двух кадров будет представлена в виде файлов "sample0.png" и "sample1.png".

Размер экрана

  • Экран — область размером 640 пикселей в ширину и 480 пикселей в высоту.
  • Точка отсчёта с координатами (0;0) — левый верхний угол экрана, координаты увеличиваются при проходе вниз и вправо.
  • Разрешено указывать координаты, выходящие за данные рамки (например, для спрайта, появляющегося из-за границы экрана)
  • Координаты курсора отображаются в редакторе на вкладке "Design".

Слои

  • Абсолютно все спрайты из сториборды, даже из верхнего слоя, располагаются под игровыми объектами (шкала жизни, ноты, слайдеры, курсор, …)
  • Существует четыре слоя (в порядке увеличения приоритета):
    • Background (задний план)
    • Fail (отображаются, только если игрок находится в состоянии неудачи (см. следующую секцию))
    • Pass (отображаются, только если игрок находится в состоянии успеха (см. следующую секцию))
    • Foreground (передний план)
  • Слои Fail и Pass не могут появляться одновременно.
  • Правила пересечения:
    • Объекты, пересекающиеся на разных слоях, будут отрисованы в описанном выше порядке (т.е. любой объект переднего плана всегда находится над любым объектом остальных слоёв).
    • Объекты, пересекающиеся на одном слое, будут отрисованы в порядке указания (если объект №1 указан в файле .osb раньше, чем объект №2, он будет находиться над ним).
    • Команды из файла .osb имеют больший приоритет, нежели команды из файла .osu, как если бы они были дописаны в начало скрипта в файле .osu. Это не меняет описанный выше приоритет слоёв, но влияет на расположение объектов (см. пример).
  • По умолчанию, установленный для сложности фон будет находиться подо всеми слоями. Тем не менее, если вы обратитесь к файлу фона, как к объекту сториборды, он появится сразу же после прогрузки карты. Таким образом, его можно заставить плавно угасать, уступая место остальной сториборде.
  • По умолчанию, комбо-пламя появляется перед сторибордой. Чтобы поместить его на задний план, допишите в файл(ы) .osu в секцию [General] следующую строчку:

StoryFireInFront: 0

Состояния игры

  • Идея — позволить сториборде динамически изменяться в течение процесса игры.
  • Основной способ реализовать это — отображать только один из слоёв успеха / неуспеха, основываясь на производительности игрока. Соответствующие состояния будем называть состояниями успеха и неуспеха.
  • Состояние до появления первого игрового объекта, т.е. слайдера/спиннера/ноты:
    • Только успех, слой неудачи не будет показан. Не рекомендуется использовать события на этих слоях, так как это бессмысленно — сообщать игроку об «успехе» в данный момент.
  • Состояние во время игры (т.е. когда игроку нужно нажимать на ноты, чтобы предотвратить уменьшение здоровья):
    • Успех, если это — первое комбо, или же предыдущее комбо было выбито в 300 (хотя бы одна нота).
    • Иначе — неудача (заметьте, что нет промежуточного состояний для завершения комбо с 100 очками, в отличие от игр на DS).
    • В Catch the Beat текущее состояние всегда равно состоянию предыдущей части (например, первая игровая секция всегда имеет состояние успеха)
    • В тайко текущее состояние — неудача, если игрок пропустил последнюю ноту, иначе — успех.
  • Состояние во время перерыва (между игровыми секциями):
    • Успех, если шкала здоровья заполнена более чем наполовину (появляется символ "O").
    • Иначе — неудача (появляется символ "X").
    • В тайко активное состояние зависит от достижения определённых значений. Два поясняющих примера:
      • Наберите точность 96.5% при уровне здоровья 40%, чтобы попасть в состояние успеха.
      • Выбейте невовремя много нот (около 30) при уровне здоровья 30% — и попадёте в состояние неудачи. Пример карты: 1
  • Состояние после игры, если в карте был хотя бы один перерыв:
    • Успех, если хотя бы половина перерывов была пройдена в состоянии успеха.
    • Иначе — неудача.
  • Состояние после игры, если в карте не было перерывов:
    • Такое же, как во время перерыва.

Время

  • Время измеряется в миллисекундах (одна тысячная доля секунды) и отсчитывается от начала звукового файла карты, включая отрицательные значения, обозначающие вступление (intro).
  • Время в сториборде не зависит от тайминга карты. Таким образом, лучше писать скрипт для карты с проверенным таймингом, чтобы потом не подгонять значения времени, если он изменится.
  • Время не связано с длиной песни; как было сказано, можно выставлять отрицательные значения, а также те, что превышают длину песни (для событий, происходящих после окончания звукового файла).
  • После окончания прогрузки, сториборда запустится с момента первого события или со времени 0, в зависимости от того, что расположено раньше.
    • В этом случае пользователю будет показана кнопка "Skip", после нажатия на которую сториборда перейдёт ко времени 0, а игра перейдёт в обычное состояние (надо будет нажать "Skip" ещё раз, чтобы перейти к моменту отсчёта).
  • Игра осуществит переход к экрану результатов после исхода последнего события, или же когда игрок вновь нажмёт на кнопку "Skip" (при её наличии).
    • Это затрагивает и события, расположенные на обоих слоях Pass / Fail, даже если показано может быть только одно. Так, если последнее событие слоя Fail происходит в момент времени 20000, а последнее событие слоя Pass — в момент времени 25000, то игра будет «ждать» до момента времени 25000, даже если игрок находится в состоянии неудачи, т.е. объектов противоположного слоя не видно. По этой причине стоит проверять, что сториборда заканчивается на обоих уровнях в одно и то же время.
    • События происходят, даже если игрок пропустил вступление сториборды (например, будет слышен звук, начавшийся после момента пропуска, но до появления отсчёта).
  • Текущее время можно скопировать комбинацией Ctrl+C, находясь на вкладке "Design" редактора.

Комментарии

Можно оставлять однострочные комментарии в стиле C++, но стоит учитывать, что они удаляются, если скрипт сохранять из внутриигрового редактора. Тем не менее, стандартные комментарии, отмечающие разбивку команд на четыре слоя, остаются.

// Это — однострочный комментарий.

В отличие от Java и языков семейства Си, в скрипте нельзя писать комментарии после команд. Блочные комментарии в стиле Си также не поддерживаются.