Everlasting Summer Guide

Руководство по созданию мода для Бесконечного Лета от Gubaew_R for Everlasting Summer

Руководство по созданию мода для Бесконечного Лета от Gubaew_R

Overview

Простое руководство для интересующихся, о том, как же, всё таки, создать свой мод для Бесконечного Лета.

Предисловие

У всех свои причины, по которым они решили создать свой собственный мод для Бесконечного Лета. Так что эту тему особенно развивать не будем.

Прежде чем создавать мод, убедитесь, что у вас есть: время, желание, усидчивость, минимальное знание английского, хоть какое-то понимание программирования в целом, и самое главное — достойная идея. Без этого ваш мод, к сожалению, будет бесперспективен.

Кроме того, вам очень пригодится художник. Без него можно обойтись, если вы создаёте переделку оригинальной истории, или будете втихую тырить с согласия автора одалживать картинки из других модов.

При создании мода появляется множество нюансов, из-за которых легко можно забросить это дело. Готовьтесь и к этому.

Начнём же.

Глава 1: init — Самое начало

Для начала заходим в папку mods, которая находится по пути:
…SteamsteamappscommonEverlasting Summergamemods
Где три точки — диск и расположение папки Steam. У всех оно разное.
Если вы не сможете разобраться с этим этапом, то боюсь представить, что будет дальше…

В этой папке создаём свою папку, которая будет называться также как и рабочее название мода. Желательно на латинице.

Заходим в неё, и предварительно создаём папки: ambience, bg, cg, music, sound, sprite, video. В этих папках будут спрятаны все необходимые материалы для мода.
Всяко лучше, чем если бы они были раскиданы в одной папке, верно?

Далее создаём два текстовых файла с расширением .rpy
Если у вас скрыты расширения файлов, то исправьте это. Интернет в помощь =)

Эти файлы можно назвать как угодно, но я рекомендую назвать первый как:<название_вашего_мода>_materials (test_mod_materials), ведь в нём мы запишем все материалы для мода, чтобы они не мешали нам писать сценарий.
А второй по названию мода, или дня/события/ветки, в общем — как вам будет угодно. Позже название всегда можно изменить.

Для работы с ними нам понадобится блокнот, или любая подобная программа.
У меня вот Notepad++.

Открываем файл с материалами, и пишем в самом началеinit:“, без кавычек.

Кстати, кодировка файла должна быть Юникод (UTF-8), ANSI не поддерживается движком.

На следующей строке нажимаем 4 раза на пробел, или один раз на Tab.
Но тут важное примечание: движок игры не поддерживает табуляцию (Tab), из-за чего вам придётся постоянно их переделывать в пробелы. Желательно с помощью встроенных функций, как например в Notepad++. Чтобы сделать это в нём выделяете весь текст с помощью комбинации клавиш Ctrl + A, затем нажимаете сверху на кнопку Правка > Операции с пробелами > Табуляцию в пробел. Для удобства сделайте соответствующий макрос (для прошареных).

Так вот. Мы сделали 4 пробела, или один Tab. Мы сформировали блок. Пишем там:

$ mods[“рабочее_название_мода”]=u”Название_мода”

Именно в такой форме. Где рабочее_название_мода пишем название вашей папки и первого лейбла (его создаём далее, об этом ниже), где Название_мода, то название которое будет отображаться в игре и в мастерской.

Получается примерно так:

init: $ mods[“test_mod”]=u”Просто тестовый мод”

Эта часть будет писаться в каждом файле связанным с модом, и она везде должна быть абсолютно одинаковая. Иначе у вас будет несколько модов в одном… А что, это удобно!

Мы пишем init в файле, чтобы игра зарегистрировала его. Так что, если в файле нет блока init, игра даже не будет его читать. Не говоря уже о том, чтобы показать ваш мод в самой игре.

Материалы

В этом разделе мы сразу распишем всё, что нужно для того, чтобы ваши пользовательские материалы оказались в игре.

Если у вас таковых нет, переходите к следующему разделу о переменных.

Для начала раскидайте все свои файлы по созданным ранее папкам. Затем мы рассмотрим как прописать их в игру.

Не забываем про 4 пробела, они пишутся всегда. Исключения только init и label.
——————————————————————————————————-

  • Персонажи


    Чтобы добавить своего персонажа (без тени у имени) в историю, пишем следующий код:

    $ тэг_персонажа = Character (u’имя_персонажа‘, color=”цвет_имени“, what_color=”цвет_текста“)

    • Где тэг_персонажа, пишем на латинице те инициалы, которыми вы будете быстро вызывать данного персонажа при написании его речи. Желательно не больше двух-трёх букв.
    • Где имя_персонажа, пишем отображаемое в игре имя. Желательно только имя или имя с фамилией/отчеством. Так как три слова скорее всего не влезут в область имени.
    • Где цвет_имени, пишем код цвета выбранного вами в формате HEX (регистр не важен). Его можно взять в палитре цветов на различных сайтах в интернете, или фото-редакторах, как Photoshop. Этим цветом будет отображаться в игре имя вашего персонажа.
    • Где цвет_текста, либо пишем стандартный цвет ffdd7d, либо любой другой, тоже в формате HEX. Этим цветом будет отображаться речь персонажа.

    У такого персонажа не будет тени у имени. Это печально. Посмотрим что можно сделать с этим, ниже.

  • Чтобы добавить персонажа с тенью пишем несколько иной код:

    $ тэг_персонажа = Character (u’имя_персонажа‘, color=”цвет_имени“, ctc=”ctc_animation”, ctc_position=”fixed”, what_color=”цвет_текста“, drop_shadow = [ (2, 2) ], drop_shadow_color = “#000”, what_drop_shadow = [ (2, 2) ], what_drop_shadow_color = “#000”)

    Отличия этого кода только в том, что здесь прописана тень. Все остальные пункты прописываются как было показано выше.

    Получается что-то такое:

    $ pare = Character (u’Парень’, color=”5A9FE7″, ctc=”ctc_animation”, ctc_position=”fixed”, what_color=”ffdd7d”, drop_shadow = [ (2, 2) ], drop_shadow_color = “#000”, what_drop_shadow = [ (2, 2) ], what_drop_shadow_color = “#000”)

——————————————————————————————————-

  • Изображения


    Как фоны (bg) так и красивые картинки (cg) прописываются таким кодом:

    image название_изображения = “путь_к_изображению

    • Где название_изображения, пишем рабочее название картинки.
    • Где путь_к_изображению, пишем путь к этому файлу:

      mods/название_вашего_мода/bg_или_cg/картинка.png

      В пути обязательно должен быть написан mods и название вашего мода, иначе игра не увидит ваш файл.

    Пример:

    image nk1W = “mods/kakoytomod/cg/nk1W.png”

——————————————————————————————————-

  • Аудио


    Музыка, звуки, эмбиент — всё это пишется одним и тем же кодом:

    $ название_аудио = “путь_к_файлу”

    Что где писать, смотрите на пункт выше. Ибо всё работает по той же системе.

    Пример:

    $ wtislo = “mods/nikakoimod/music/what is love.mp3”

——————————————————————————————————-

  • Спрайты

    Тут уже сложнее. Думаю вы знаете, что спрайты в БЛ это те изображения, которыми показываются персонажи. Те что ещё умеют менять одежду и эмоции. Чтобы их прописать можно написать, либо такой же код, что и у изображений, либо специальный:

    image тэг_персонажа эмоция другие_значения = ConditionSwitch(
    “persistent.sprite_time==’sunset'”,im.MatrixColor( “mods/ваш_мод/sprite/тэг_персонажа/спрайт.png“, im.matrix.tint(0.94, 0.82, 1.0) ),
    “persistent.sprite_time==’night'”,im.MatrixColor( “mods/ваш_мод/sprite/тэг_персонажа/спрайт.png“, im.matrix.tint(0.63, 0.78, 0.82) ),
    True, “mods/ваш_мод/sprite/тэг_персонажа/спрайт.png” )

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

    Когда будете писать этот код, обратите внимание на тэг_персонажа, и необходимость прописывать путь к спрайту три раза. Тэг нужен для того, чтобы при необходимости сразу же скрывать спрайт, не расписывая все его характеристики, и для того, чтобы менялся сам спрайт, один на другой, а не показывался один поверх другого.

    Будем откровенны, именно так и прописываются большинство спрайтов, ибо первый способ — мазохизм.

    Пример:

    image mina smile s = ConditionSwitch( “persistent.sprite_time==’sunset'”,im.MatrixColor( “mods/test_mode/sprite/mina/smile s.png”, im.matrix.tint(0.94, 0.82, 1.0) ), “persistent.sprite_time==’night'”,im.MatrixColor( “mods/test_mode/sprite/mina/smile s.png”, im.matrix.tint(0.63, 0.78, 0.82) ), True, “mods/test_mode/sprite/mina/smile s.png” )


——————————————————————————————————-

ВНИМАНИЕ! После публикации мода все пути к материалам необходимо изменить, удалив mods/название_вашего_мода/, иначе ваши материалы не будут обнаружены игрой.
Но об этом позже.

Изначальные переменные

Кроме пользовательских материалов в наш файлик materials мы запишем переменные.

Переменные — это некие значения, которые могут измениться в процессе игры.
У нас есть два типа переменной: True or False и числительное значение.
True or False работает по типу: Да или Нет.
Числительное значение — это любое число, включая отрицательные.

Не забываем про 4 пробела, они пишутся всегда. Исключения только init и label.

Записываются они довольно просто:

$ название_переменной = True_или_False

$ название_переменной = любая_цифра

Как вы поняли, если значение переменной Да или Нет, то пишем True, если Да, и False, если Нет.

То есть у вас получится что-то такое:

$ el_kartohu = True $ alisa_opinion = 1

Переменные очень полезные. Они могут обозначить наличие какого-то условия при событии, и количество “очков отношений, на которых и строится всё Бесконечное Лето, да и другие Визуальные Новеллы.

Сейчас мы прописали изначальные значения переменных. Без них, переменные не смогут измениться, что вполне логично. Ведь изменяться будет нечему, дошло?)

О том, как же их изменять, и как они могут влиять на историю, поговорим ниже.

Глава 2: label — Как начать писать

Наконец мы дошли до самого важного, и основного в деле создания мода — писанины!

Помните, мы создали второй файлик, который называется так же как и ваш мод?
Открывайте его. Первые две строки копируйте из materials. Те, что с init.
Через строку, без четырёх пробелов или одного Tab, пишем:

label название_лейбла:

Название этого лейбла должно совпадать с тем, что вы писали под init.
Я же для наглядности написал test_mod_start, а не test_mod, как писал под init.

Получается такое:

label test_mod_start:

Лейблы служат для перехода между некими разделами в моде. Если вы пишете мод без выборов, то вам больше одного лейбла и не понадобится.
Об этих переходах вы узнаете позже.
——————————————————————————————————-

Текст и речь

Основа БЛ это текст автора и чья-то речь, верно? Смотрим как их писать.

Весь текст пишется с 4-мя пробелами в начале, и под label. Не забываем об этом.

Чтобы написать текст автора, то есть просто текст, пишем кавычки, и в них текст:

текст_автора

Чтобы писать текст мыслей (с тильдами по бокам текста), перед кавычками добавляем инициалы th:

th “мои_мысли

Именно эти инициалы мы прописывали для своих персонажей, и именно они используются для речи всех персонажей.

Чтобы написать речь кого-то, пишем его инициалы спереди кавычек, так же как и с мыслями:

тэг_персонажа “текст_кого_то

У вас должно получится примерно вот так:

“Я сидел на скамейке, и рассуждал о жизни в море.” th “Хм-м… А рыбы умеют думать?” dv “Чего расселся? Делать нечего?”

Большая часть оригинальных инициал персонажей из БЛ расписаны на этой знаменитой картинке:

Помимо этих, ещё имеются инициалы, собственно Семёна, и большинства героев, с условием неизвестности:
me — Семён
mep — Парень
unp — Пионерка (Лена)
dvp — Пионерка (Алиса)
usp — Пионерка (Ульяна)
slp — Пионерка (Славя)
mip — Пионерка (Мику)
uvp — Странная девочка (Юля)
elp — Пионер (Электроник)
shp — Пионер (Шурик)
mzp — Пионерка (Женя)
mtp — Вожатая (Ольга Дмитревна)
csp — Медсестра (Виола)

Визуальная составляющая

Сейчас ваш мод — просто резко появляющийся текст на чёрном экране с зимним интерфейсом.
Мы разобрались с речевой частью, пора разобраться и с визуальной! Затем займёмся и украшением текста.

Не забываем про 4 пробела, они пишутся всегда. Исключения только init и label.

===========================================================================

Интерфейс
  • В игре существует 4 вида интерфейсазимний, дневной, вечерний, ночной.
    Последние три — летние. Думаю для чего они нужны и так понятно.
    Вы же не хотите показывать, как ГГ загорает на пляже с зимним интерфейсом?

    Чтобы изменить интерфейс, в тексте пишем одну из этих команд:

    • $ prolog_time()
      Для зимнего.

    • $ day_time()
      Для дневного.

    • $ sunset_time()
      Для вечернего.

    • $ night_time()
      Для ночного.

——————————————————————————————————-

  • Интерфейс можно плавно скрыть или показать. Чтобы это сделать, пишем в тексте:
    • window hide
      Чтобы скрыть.

    • window show
      Чтобы показать.

    • Также существует команда window auto, с помощью которой можно забыть о том, что перед каждой фразой нужно писать window show, а после window hide. Однако это работает не всегда, и я для уверенности всегда прописываю эти команды самостоятельно.

    Примечание: если интерфейс не был плавно показан, то он не может быть плавно скрыт. То есть, чтобы интерфейс плавно скрыть, его сначала нужно плавно показать.

——————————————————————————————————-

  • Ещё движок может показывать текст поверх экрана, а не внизу. Этот режим называется — NVL, в то время как привычный нам — ADV. Команды связанные с этим:
    • $ set_mode_nvl()
      Чтобы показать поверх экрана.

    • nvl clear
      Чтобы очистить текст.

    • nvl hide
      Чтобы резко скрыть текст.

    • nvl show
      Чтобы резко показать текст.

    • nvl hide dissolve
      Чтобы плавно скрыть текст.

    • nvl show dissolve
      Чтобы плавно показать текст.

    • $ set_mode_adv()
      Чтобы показать внизу экрана.

    Если вы хотите использовать речь в этом режиме, то вам будет необходимо создать нового персонажа, и в его код (в скобки) добавить kind=nvl. И имена таких персонажей рекомендуется писать навроде этого:

    ‘Ваня: ‘

    Не забывая про пробел после двоеточия.

    Пример полного кода:

    $ kidsnvl = Character (u’Малышня: ‘, kind=nvl, color=”ffe16a”, ctc=”ctc_animation”, ctc_position=”fixed”, what_color=”ffdd7d”, drop_shadow = [ (2, 2) ], drop_shadow_color = “#000”, what_drop_shadow = [ (2, 2) ], what_drop_shadow_color = “#000”)

===========================================================================

Фоны и картинки

Дабы не смотреть на текст на чёрном фоне, рассказывая о красоте пляжа, стоит добавить фон. Этим мы сейчас и займёмся.

Не забываем про 4 пробела, они пишутся всегда. Исключения только init и label.

Чтобы на нашем экране появился фон или любая другая картинка, нам нужно прописать одну из этих команд:

  • scene название_сцены
    Для показа сцены. То есть — фона. При переходе со сцены на сцену все спрайты остаются на предыдущей.

  • show название_картинки
    Для показа какой-то картинки поверх фона и спрайтов. Если его позже убрать, то вернётся сцена с оставшимися там спрайтами.

——————————————————————————————————-
Когда мы достаточно насладимся красотой пляжа, или загорающей на нём Алисой, пишем такую команду:

  • hide название_картинки_или_фона
    Чтобы скрыть картинку или фон. А вы что ожидали?

Но опять же, всё происходит слишком резко. Так не пойдёт!
Где взять все коды BG и CG смотрите в разделе Все необходимые коды.
===========================================================================

with — эффекты

Чтобы добавить эффект к появлению или исчезанию изображения добавляем в конец команды, после названия изображения, команду — with:

  • show название_картинки with dissolve
    Чтобы картинка появилась плавно. Растворение средней скорости.

Не забываем про 4 пробела, они пишутся всегда. Исключения только init и label.

Помимо dissolve движок имеет множество других эффектов:

  • dspr — самое быстрое растворение, эффективно при смене эмоций на спрайтах.
  • dissolve2 растворение, дольше dissolve.
  • dissolve_fast растворение, быстрее dissolve, но медленней dspr.
  • hell_dissolve — очень долгое растворение, 50 секунд.
  • dissolve_long — невероятно долгое растворение, 100 секунд.
  • flash — белая вспышка.
  • flash_red — красная (кровавая) вспышка.
  • fade затемнение.
      Как аналог, можно использовать схему:

      show black with dissolve pause 1 hide black with dissolve

      Если это затемнение будет слишком коротким.

  • pixellate пикселизация.
  • movein вводит изображение на экран из соответствующей стороны. Возможные стороны: right (право), left (лево), top (верх), bottom (низ). Писать слитно, пример:
    scene bg ext_beach_day with moveinright

  • moveout — тот же movein, только наоборот. Стороны и схема работы аналогичны. Писать слитно.
  • ease — тот же movein/moveout, но более плавный. Доступные варианты — easein и easeout, с теми же сторонами. Писать слитно.
  • zoomin приближает изображение.
  • zoomout отдаляет изображение.
  • vpunch — вертикальная тряска экрана.
  • hpunch — горизонтальная тряска экрана.
      punch работает и с текстом. Чтобы текст появился с тряской, пишите так:

      “какой_то_текст” with hpunch

      Можно использовать как hpunch так и vpunch.

  • blinds жалюзи.
  • squares квадраты.
  • wipe стирает изображение в заданную сторону. Возможные стороны: right (право), left (лево), up (верх), down (низ). Писать слитно, как и в move и ease, но без in или out. Обратите внимание, что верх и низ здесь другие.
  • slide сдвигает новое изображение в заданную сторону. Стороны соответствуют wipe. Писать слитно.
  • slideaway сдвигает старое изображение в заданную сторону. Стороны соответствуют wipe. Писать слитно.
  • push — сдвиг изображений в заданную сторону. Стороны соответствуют movein. Писать слитно.
  • iris — in уменьшает изображение в центр экрана, а out увеличивает из него. Писать слитно, например: irisout.

Показ спрайтов

Теперь мы видим площадь. Но мы не видим Алису! Покажем же её.

Не забываем про 4 пробела, они пишутся всегда. Исключения только init и label.

Дабы показать Алису, нужно вывести на экран её спрайт.
У каждого спрайта в названии есть инициалы владельца и эмоция. Есть ещё одежда и дальность, но для пользовательских спрайтов, порой хватает и первых двух. Так что спрайты вызываются также как и картинки с фонами, но в отличие от них, у спрайтов не слитное название параметров. То есть, не — show тэг_персонажа эмоция_и_другие_значения, а — show тэг_персонажа эмоция другие_значения.
Поэтому показываем спрайт примерно так:

show dv grin pioneer far with dissolve

——————————————————————————————————-
Просто, не так ли? А мне этого мало. Таким образом мы сможем показать лишь один спрайт, так как любые другие будут накладываться на предыдущий.

Чтобы показать спрайт на определённой позиции, у нас есть команда — at. Она пишется перед with. Выходит это:

show тэг_персонажа эмоция другие_значения at сторона_экрана with эффект

Вот возможные стороны:

  • fleft — дальнее лево.
  • left лево.
  • cleft — ближнее лево.
  • center — центр. Используется только при перемещении спрайта с другой позиции в центр.
  • cright — ближнее право.
  • right право.
  • fright — дальнее право.

Получается, что мы вызываем второй, или любой другой по численности, спрайт подобной командой:

show mi upset pioneer close at cleft with dissolve

А если же мы хотим показать их одновременно, и при этом плавно, то делаем такой же фокус, который использовали с эффектом punch:

show dv grin pioneer far at right show mi upset pioneer close at left with dissolve

——————————————————————————————————-

Освещение спрайтов

Однажды, в какую-нибудь тёмную ночь, вы заметите, что ваши спрайты слишком яркие. В этом случае вам поможет команды:

  • $ persistent.sprite_time = ‘day — для дневного освещения. Освещение по умолчанию.
  • $ persistent.sprite_time = ‘sunset — для вечернего освещения.
  • $ persistent.sprite_time = ‘night — для ночного освещения.

На первый взгляд, изменится не очень многое, но, поверьте, это очень полезная функция. Если вы прописали свои спрайты по специальному коду, то они тоже будут менять своё освещение, как и стандартные.

Где достать коды всех спрайтов смотрите в разделе Все необходимые коды.

linear, pos — Фокус с перемещением

Когда-нибудь вы можете захотеть плавно переместить спрайт, или любую другую картинку, на другой край экрана. Для этого есть команда — linear.

4 пробела помним?

Чтобы переместить изображение по горизонтали пишем такую схемку:

show название_изображения: linear сколько_секунд xalign от_0_до_1

Первая строчка нам знакома, а вот вторая нет.
Обратите внимание, что вторая строка пишется после двоеточия, и на 4 пробела дальше.

linear означает перемещение картинки, после чего пишется время в секундах, за которое она должна переместиться.
xalign и yalign определяют куда будет перемещаться изображение, по Y или по X. Y для вертикали, X для горизонтали.
Затем пишется сами координаты в формате 0.0 — 1.0, где 0.0 левый край экрана, а 1.0 правый. Писать обязательно с десятыми.

Примечание: по неизвестным для меня причинам, перемещение по Y в Бесконечном Лете не работает, в отличие от других игр на движке Ren’Py. Вероятно тут виновата ошибка разработчиков, которые писали код игры. Но этого, как говорится, мы никогда не узнаем.

Для примера, перед тем как перемещать спрайт, нам нужно его плавно показать, иначе он появится в движении:

show dv happy pioneer far with dissolve pause 0.2 show dv happy pioneer far: linear 1 xalign 0.2

Из этого кода мы видим, что по центру экрана появится весёлая Алиса, а затем переместится к левому краю экрана.

Если писать координаты больше 1.0 или меньше 0.0 (например: -0.5), то изображение уйдёт за экран. Это можно использовать.
——————————————————————————————————-
Если вы захотели поставить картинку в какое-то определённое место, вам поможет команда — pos:

show название_изображения: pos (место_по_ширине, место_по_высоте)

Координаты расчитываются по пикселям стандартного разрешения экрана, а это — 1920×1080. Однако расчёт идёт не с привычного левого верхнего угла, а с левого нижнего. То есть левый верхний угол будет равен — 0, 1080.

Пример:

show korobka: pos (1024, 765)

Аудио

Казалось бы — у нас всё есть: фон, текст, спрайты. Но зайдя в мод, мы тут же заметим
Что здесь гробовая тишина! Исправим это недоразумение!

Не забываем про 4 пробела, они пишутся всегда. Исключения только init и label.

Как вы могли понять ранее, из курса по материалам, у нас есть три вида аудиозвуки, музыка и эмбиент. Чтобы их включить, у нас есть команда — play, и четыре дорожки воспроизведения:

  • play music название_музыки — для музыки.
  • play sound название_звука — для звука. Воспроизводится лишь раз.
  • play sound_loop название_непрекращающегося_звука — для непрекращающегося звука. Работает как дорожки music или ambience.
  • play ambience название_эмбиента — для эмбиента. Это звуки на заднем фоне — птицы, шум волн…

В БЛ музыка имеет весьма странную форму записи — music_list[“название_музыки”]. Из-за чего можно запутаться, и подумать, что music писать уже не надо. Но это не так. Код воспроизведения оригинальной музыки должен быть примерно такой:

play music music_list[“forest_maiden”]

Так как music это ID дорожки аудио, а music_list[“”] — это часть названия. Для своей музыки вы можете писать как адекватные люди, без этой тавтологии.
——————————————————————————————————-
Кроме того, что мы изучили выше, мы можем поставить аудио в очередь, командой — queue. Оно будет писатся вместо play:

  • queue sound название_звука
  • queue sound название_следующего_звука

Работает только в пределах одной дорожки. То есть у каждой дорожки своя очередь.
Таким образом, у нас проиграет звук, а затем тут же пойдёт другой. Без необходимости высчитывать, сколько ему необходимо времени, и ставить на это время паузы.
Кстати, я не уверен что есть смысл в этой команде в любых других дорожках, кроме sound. Ведь там аудио проигрывается бесконечно. Как и лето.
——————————————————————————————————-
Когда же мы достаточно наслушаемся, останавливаем аудио командой — stop, с соответствующим ID дорожки:

  • stop music
  • stop sound
  • stop sound_loop
  • stop ambience

Название аудио снова писать не нужно, пишем только команду и дорожку.
——————————————————————————————————-
И снова чего-то не хватает… Верно! Пла-а-авности!
В этом случае нам помогут команды — fadein и fadeout:

  • play music название_музыки fadein сколько_секунд
  • stop ambience fadeout сколько_секунд

fadein для плавного появления, а fadeout для исчезания. После них пишется сколько будет длиться эффект в секундах. Например:

stop music fadeout 2

Где найти все коды музыки, звуков и эмбиентов смотрите в разделе Все необходимые коды.

Пауза

Всем рано или поздно нужно сделать паузу. И мы не исключение. Думаю не стоит пускаться в объяснения по поводу паузы. Надеюсь все и так понимают зачем она нужна.

Не забываем про 4 пробела, они пишутся всегда. Исключения только init и label.

Чтобы сделать паузу используем одну из команд:

  • pause сколько_секундпростая пауза.
    Можно пропустить, нажав на Enter/Пробел/ЛКМ/Ctrl. Допустимо писать секунды в скобках. Но если подумать… Зачем заморачиваться?

  • $ renpy.pause(сколько_секунд,hard=True_или_False)сложная пауза.
    Её нужно использовать только тогда, когда вам нужна непропускаемая пауза. Такую паузу можно пропустить только с помощью клавиши быстрого проматывания текстаCtrl. Чтобы сделать сложную паузу непропускаемой, там где True_или_False, пишем True. В остальном, гораздо выгоднее использовать простую.

Секунды можно писать в десятых, то есть так: 0.2, 1.6, 32.4

Примечание: если поставить паузу без секунд, не важно простую или сложную — игра остановится и продолжить можно будет, только нажав на Enter/Пробел/ЛКМ/Ctrl.
Так что не рекомендуется этого делать. А то у читателей может возникнуть затык, и они подумают, что игра зависла.

Примеры пауз:

pause (1.5) pause 30 $ renpy.pause(12,hard=False)

Паузы рекомендуется ставить только со скрытым интерфейсом.
Знаете, пять секунд смотреть на пустую строку текста не очень-то интересно!

Паузы — это очень важная часть визуальной новеллы. Не забывайте о них. Но и не делайте слишком много, и слишком долгие. Читатели не привыкли ждать!

Форматирование текста

Порой, нужно сделать текст необычным. Для такого случая существуют команды, которые пишутся прямо в тексте, внутри кавычек. Рассмотрим же их.

Не забываем про 4 пробела, они пишутся всегда. Исключения только init и label.

Сами коды в игре не видны, виден только эффект:

  • {i}{/i} — “{i}какой_то_текст{/i}” — для курсива.
  • {b}{/b} — “{b}какой_то_текст{/b}” — для жирноты.
  • {s}{/s} — “{s}какой_то_текст{/s}” — для зачёркивания.
  • {w} — “какой_то_текст. {w}другой_текст” — для паузы в отображении текста. Отображение сначала остановится, на том месте где стоит команда, а после нажатия на Enter/Пробел/ЛКМ/Ctrl продолжится, и закончится там, где либо стоит ещё одна пауза, либо где конец кавычек.
  • n —”какой_то_текст. nдругой_текст” — для переноса остальной части текста на строку ниже.
  • — “какой_то_текст_что_то_в_кавычках_продолжение_текста” — для того чтобы была возможность поставить кавычки внутри текста.

Уделите особое внимание пробелу, он нужен лишь один, так как команды исчезают из отображаемого текста.

Другие полезности

===========================================================================

Миг-миг

Вы хотите моргнуть? А может ваши глаза устали от всего этого, и вы хотите их закрыть?
Это можно устроить.
Пишем так:

  • show blinking
    Чтобы моргнуть.

  • show blink
    Чтобы закрыть глаза.

  • hide blink show unblink

    Чтобы открыть их вновь.

Для лучшего эффекта отделяем паузами, примерно так:

show blink pause 3 hide blink show unblink

===========================================================================

Видео

Вы хотите нам показать какой-то крутой видос? Без проблем!
Чтобы сделать это пишем прямо в блоке label:

  • $ renpy.movie_cutscene (“путь_к_видео”)

Полная команда будет примерно такая:

$ renpy.movie_cutscene (“mods/test_mod/video/my_super_puper_duper_video.mp4”)

===========================================================================

Посаны, тикаем отседова!

За вами погоня? Или может это вы за кем-то бежите?
Чтобы все поняли что вы бежите, вам поможет данная комбинация:

scene название_фона with dspr: zoom 1.05anchor (48,27) ease 0.20pos (0, 0) ease 0.20pos (25,25) ease 0.20pos (0, 0) ease 0.20pos (-25,25) repeat

Как вы поняли — это показ фона с эффектом. Так что, чтобы выключить бег просто снова включите этот же фон, ну или другой, без этого эффекта.

Проверяем, что получилось

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

Для этого запускаем игру > переходим в настройки (инструменты) > моды и пользовательские сценарии > и в данном списке выбираете ваш мод.

Если вы сделали всё как надо, он там появится.

А также, после того как вы запустите впервые ваш мод, в папке мода появится копии ваших .rpy файлов, но с расширением .rpyc. Это закодированные файлы текста, и именно их использует игра. Так что если удалить файлы .rpy, игра спокойно загрузит ваш мод.

Глава 3: menu — Сложности выбора

По сути, сейчас вы уже научились всему, что может понадобится при создании мода. Но только в случае, если там не будет выборов и если там всего одна концовка. Если же вы решите, что кинетическая новелла — это не про Вас, то смотрите самый сложный раздел руководства — выборы и их последствия.
===========================================================================

Выбор

Чтобы предоставить читателю выбор, пишем такую систему команд:

menu: “выбор”: последствия_выбора “другой_выбор”: последствия_другого_выбора

Команда menu: вызывает меню выбора. Перед ним, желательно скрыть интерфейс.
Затем, на следующей строке мы делаем 8 пробелов, так как формируется блок в блоке. Чем больше блоков, тем больше пробелов. Их количество всегда увеличивается на 4.
После этих 8-ми пробелов в кавычках пишется выбор так, как он будет отображаться в игре, и двоеточие, означающее формирование ещё одного блока.
Ниже, после 12-и пробелов будут последствия выбора. Это не обязательно должен быть текст, однако там должна быть хотя бы одна команда, иначе движок будет жаловаться, что блок пустой и не запустит нам игру.

Выбор не обязательно должен быть из двух или более вариантов, их количество не ограничено. Ведь выбор из одного варианта — тоже выбор.

Чтобы закончить последствия выбора, просто пишем дальше с 4-мя пробелами, как и раньше.

Пример:

me “Нет, так не пойдёт…” th “Но… {w}Что же делать?” window hide menu: “Хрен его знает”: window show th “Верно…”

Если хотите сделать выбор без исчезания текста, то есть, чтобы он отображался внизу, как и до выбора, то пишите так:

menu: “текст” “выбор”: последствия_выбора

А если вы в режиме NVL (тескст поверх экрана), и хотите чтобы выбор был там, перед выбором пишите команду define menu = nvl_menu, как на примере ниже:

define menu = nvl_menu menu: “выбор”: последствия_выбора

if, else — Снова переменные

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

===========================================================================

Изменение

Я надеюсь вы не забыли про 4 пробела?)

Чтобы изменить значение переменной с True на False или наоборот, а также чтобы изменить числительное значение на конкретно другую цифру пишем так:

  • $ название_переменной = значение
    У вас зоркий глаз, если Вы заметили, что это точно такой же код, который мы писали в materials. Различие лишь в том, что прописывать переменные изначально нужно в блоке init, а изменять значение в label. Иначе не работает, естественно.

А вот если вам приспичит прибавить или отбавить какое-то число к/у текущему/его количеству/а, пишем более интересные команды:

  • $ название_переменной += сколько_добавить
    Чтобы добавить сколько-то очков к значению.

  • $ название_переменной -= сколько_отнять
    Чтобы отнять сколько-то очков у значения.

Примеры:

$ el_sup = True $ darts += 3 $ dv_friendship -= 15

Логично, что изменять переменные нужно в зависимости от выбора читателя. Так что пишем эти команды в блоке последствий выбора.
===========================================================================

Проверка
if — Если

Когда пришло время проверить сколько очков отношений у читателя с персонажем NN, или съел ли он всё таки свой суп, пишем проверку переменных.

Проверки бывают трёх видов — равно, больше, меньше. С True или False больше и меньше не работает. Как ни жаль.

Для проверки используется команда — if, за ним пишется название переменной, дальше в качестве обозначения равенства пишется двойное равно==, а для обозначения больше или меньше используются соответствующие знаки — >, <.

Затем после двоеточия идут последствия, как и после выбора.
Последствия последствий выбора…

  • if название_переменной == значение:
    Если значение должно быть равно такому-то.

  • if название_переменной > значение:
    Если значение должно быть больше такого-то.

  • if название_переменной < значение:
    Если значение должно быть меньше такого-то.

Всё естественно в системе блоков:

if название_переменной == True_или_False: последствия_значения if название_переменной == любая_цифра: последствия_значения if название_переменной > значение: последствия_значения if название_переменной < значение: последствия_значения

Пример:

“Я думал с кем бы потанцевать.” if she_love > 5: “Заметив мой задумчивый взгляд, Она одарила меня милой улыбкой.” menu: “Потанцевать с Ней”: “Я пригласил Её на танец.” “Не танцевать”: th “Да ну их в болота, эти ваши — танцы.”

В данном примере некая Она, при достаточных очках любви, одаривает главного героя улыбкой, однако это никак не влияет на его последующий выбор.
Соответственно, если очков любви недостаточно, то Она даже не посмотрит на нашего героя, но выбор появится, и в итоге это никак не помешает ему потанцевать с Ней.
Без else или jump большего не сделать.
——————————————————————————————————-

else — Иначе

В случае когда нам нужно сделать, по типу — “либо так, либо иначе, используем команду — else. Ведь, если мы не будем использовать эту команду, история продолжится так, как будто ничего не произошло. Как альтернативу, можно использовать jump, но об этом позже.
else пишется на том же уровне что и if, то есть либо на 4-х пробелах, либо на 8-и и выше.

Думаю хватит и примера, чтобы вы поняли зачем нужна эта команда:

th “Я решился. Сейчас я признаюсь!” me “Я люблю тебя!” if she_love > 12: she “И я люблю тебя!” “Тут же ответила она, и поцеловала меня в губы.” else: she “А я тебя нет!” “Отрезала она в ту же секунду, развернулась и ушла.” “Спустя некоторое время небо затянуло тучами.” “Вскоре пошёл сильный дождь.” “Он был ужасно холодный, из-за чего даже казалось, будто меня осыпает ледяными шипами.” if she_love > 12: “Но это не мешало нам. Мы стояли под дождём вместе и мокли до последней нитки. Ничего не могло омрачить этот день.” else: “Я стоял, и мок в одиночестве.” “Через несколько минут я всё таки пришёл в себя и отправился домой.”

Тут показаны только текст и проверка переменных, но для понятия сути, думаю вам хватит. =)

(Пример придуман моей бурной фантазией по ходу написания раздела. Ни в одном из моих, или мне известных, модах такой сцены нет. Так что вам ничего не мешает использовать её, вероятно отредактированную, в своём моде. Или же сделать что-то по такой же схеме)
——————————————————————————————————-

elif

Ходят слухи, мол, ещё есть какой-то — elif, который может использоваться между if и else, однако у меня ничего с этой командой не получилось сделать. Игра просто делала вид, будто её не существует. Но и не жаловалась, что доказывает, что движок знает эту команду.
Если вы лучше знакомы с Phyton или с самим Ren’Py, думаю вы сможете разобраться с этой командой.
——————————————————————————————————-

Конец проверки

Когда последствия проверки переменных закончатся, возвращаемся с 8-и пробелов к привычным 4-м.

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

jump — Зайчик делает прыг-прыг

В случаях когда вы разделили мод на несколько частей, и каждая из них в отдельном файле, или же когда после выбора читатель должен отправиться совсем другой дорогой, вам поможет простая команда — jump. Она позволяет, буквально, прыгать между лейблами.
Пишется таким образом:

  • jump название_лейбла

Пример использования:

“Гуляя по лесу я наткнулся на развилку.” th “Куда же пойти?” menu: “Налево”: th “Налево, так налево.” jump les_nalevo “Направо”: th “Слушаюсь, внутренний голос! Идём направо.” jump les_napravo label les_nalevo “Я пошёл налево.” label les_napravo “Я пошёл направо.”

Таким образом у нас получилось две разные ветки событий. Чтобы не писать это всё в последствиях выбора, так как там может быть очень много, мы вывели это в отдельные лейблы, которые вполне могут быть, даже, в отдельном файле.
——————————————————————————————————-

call — Позвони мне, позвони

Помимо jump у нас имеется ещё одна подобная команда — call. Она перемещает читателя на другой лейбл, как и jump, но после его окончания возвращает туда, откуда было совершено перемещение. Это можно использовать, например, для длительных флешбэков:

me “Эх, вот это было время…” they “Какое? Расскажи мне.” me “Это было прекрасное время, поистине…” me “1982 год…” window hide call kak_eto_bilo window show me “Вот так всё и было.” they “Это и правда прекрасно.”

Как вы видите, call пишется точно также как и jump, но в отличие от него, call не является окончанием блока или лейбла.

Карта

Мы могли забыть о такой прекрасной вещи как — карта. В БЛ есть возможность выбирать куда пойти по карте. Смотрим что для этого нужно.

Чтобы показать карту пишем команду:

  • $ show_map()

Но так карта будет пустая, и с ней нельзя будет взаимодействовать. Смотрим дальше.
Чтобы добавить локацию пишем код по такой схеме:

  • $ set_zone(“название_локации“, “название_лейбла“)

Пишем эту команду столько раз, сколько будет локаций. У каждой должен быть свой лейбл. При нажатии читателем на эту локацию его перенесёт на соответствующий лейбл. Так что нет нужды писать jump.

При повторном показе карты выбор локаций останется. Чтобы этого избежать пишем такую команду:

  • $ disable_all_zones()

Чтобы сделать возможность идти только туда, куда ты ещё не ходил, то есть чтобы можно было обойти все локации, но только один раз, используем переменные и их проверку.
Дарую вам примерную схемку:

label obhod_map: $ disable_all_zones() if come_to_beach == True: if come_to_forest == True: if come_to_music_club == True: $ vse_oboshol = True if vse_oboshol == False: $ show_map() if come_to_beach == False: $ set_zone(“beach”, “to_beach”) if come_to_music_club == False: $ set_zone(“music_club”, “to_music_club”) if come_to_forest == False: $ set_zone(“forest”, “to_forest”) else: jump obhod_vse_oboshol

Не самая удобная, но вполне рабочая. В данном примере три локации: лес, музыкальных клуб и пляж. Всё пишется в отдельном лейбле, чтобы можно было вернуться с лейблов локаций обратно на карту. В начале пишется отключение активных локаций (иначе всё схема насмарку), и проверка, не обошёл ли читатель всё. Если нет, показывается карта, и те локации в которых он не был. Если же он всё обошёл, то его переносит на следующий за этим разделом лейбл.

Естественно, чтобы вы смогли её использовать, Вам будет нужно поменять все названия лейблов и переменных на нужные Вам. Хотя вы можете использовать и мои)
Главное не забудьте их прописать в materials.

Где достать все коды локаций смотрите в разделе Все необходимые коды.

return — Конец всему

Вот и пришло время прощаться…
Когда в конце последствий выбора должен быть конец игры, пишем команду — return.
Если текст в лейбле закончится, эффект будет тот же.

Это самая ужасная, страшная, и жестокая команда в этой игре, но каждый мододел однажды её напишет.

save_name — Сохранения

Ошибка большинства моддеров — отсутствие названия мода в сохранении. То есть ты сохраняешь игру, проходя мод, а потом не можешь понять, что это вообще за сохранение такое! Эта ошибка к сожалению появляется даже у опытных мододелов, хотя исправляется она элементарно.

4 пробела, 4 пробела, помним мы о них всегда!

Так как мы уже сделали большую часть мода, распределить сохранения будет проще. Чтобы добавить сохранению название, в блоке label пишем такую команду:

  • $ save_name = (‘название_сохранения‘)

Просто, неправда ли? В то место, где название_сохранения, пишем как раз название сохранения. Если получается слишком длинное, какую-то часть можно перенести на другую строчку с помощью — n, иначе оно будет вылазить из слота. Например:

$ save_name = (‘Тестовый мод. День 1nПрибытие в лагерь’)

Это название будет отображаться в игре так:

Тестовый мод. День 1
Прибытие в лагерь

Круто, да?
——————————————————————————————————-
Если же вы хотите показать тот самый монитор с днями из оригинальной игры, пишем так:

  • $ new_chapter(день, u”Название_сохранения”)

Получается примерно так:

$ new_chapter(3, u”3 День”)

Сколько всего дней есть на этих мониторах, я, честно говоря, не помню, но где-то 5 — 7.

Все необходимые коды

Давным-давно, много лет назад, на просторах интернета я нашёл несколько файликов, в которых оказались расписаны коды всех локаций карт, BG, CG, музыки, звуков, эмбиента и спрайтов. Честно, я не знаю кто этот святой человек, что написал всё это, но я выражаю ему огромную благодарность.

Так что у меня был выбор, между написанием отдельного руководства, где представлены только эти коды (так как их, ну о-о-очень много), и закидыванием этих файликов в один архив.
Я выбрал второе.
К тому же там моё Полевое руководство, по которому я и писал Это руководство.

В общем. Я загрузил этот архив на Яндекс Диск, и теперь вы все сможете его скачать. Там будут оригинальные (почти) файлики со всеми кодами того-сего, а также моя Мини-справка, где есть всё что и в этом руководстве, но в сильно укороченом виде.

Она выглядит вот так:

Не обращайте внимания на что-бы… Это уже давно в прошлом…

Ещё, для пользователей Notepad++, я оставил подарочек в виде 3-х синтаксисов:

  • sprite_sint для сворачивания всех спрайтов определённого персонажа в файлике про спрайты.
  • spravka_sint для красивого и сворачивающегося текста в Мини-справке.
  • И самый важный — renpy_sint, который даст вам возможность видеть код мода также как и я, и как он был показан на скринах выше.
    Пример:

Все эти синтаксисы сделаны мной, и вы их спокойно можете изменить, если захочется.
(Для тех кто будет использовать renpy_sint: при добавлении ваших новых персонажей в мод, вам будет нужно его добавить и в синтаксис, в 1-ю группу, в разделе Ключевых слов.)

Чтобы скачать этот архив, просто нажмите на словосочетание скачать архив ниже.
Скачать архив[disk.yandex.ru]
Не бойтесь скачивать его, ничего такого там нет.

Все коды подписаны на русском, так что вам будет достаточно скопировать нужный код из файлика и вставить в мод. Я сам ими постоянно пользуюсь)

Публикуем и обновляем детище

Время финального этапа — публикации мода.

Обратите внимание — мы выкладываем не ту папку, которая в папке mods, а отдельную папку, что с публичной версией.

Итак. Вот что мы делаем, для того чтобы выложить наш мод:

1. Копируем папку мода куда-нибудь, например в Everlasting Summergame. Главное не оставлять её в mods.

2. В путях файлов в materials убираем — mods/название_мода/. Это можно сделать разом, с помощью замены текста в Notepad++, как показано на скриншоте ниже.

Не забудьте про это!

2.1. При желании скрыть от хитрых читателей, которые знают как делается мод, ваш исходный код удаляем файлы с расширением .rpy, и оставляем только .rpyc.
.rpyc должен был появится после запуска игры с модом.

3. Когда мы полностью подготовили мод к публикации, запускаем от имени администратора ES_Content_Uploader, что находится в папке mods.
Нас встретят такой вот приветственной надписью:

4. Жмём Создать новый предмет.

5. Вам будет представлен ID вашего будущего мода. Запишите его куда-нибудь. Затем жмём Продолжить.

6. Появится весьма интересное окно:

Многим тут уже будет всё интуитивно понятно, но мы всё же разберём всё по пунктам.

6.1. Пишем название мода в строке Название предмета.

6.2. Затем, в Описание предмета можем написать первое описание. Но это не обязательно. Вы можете написать его позже, уже на странице мода в мастерской.

6.3. Указываем путь к папке мода, нажав на Обзор…, после чего появится новое окно. Там мы заходим в папку мода, и в ней нажимаем на кнопку Выбор папки в правом нижнем углу окна.

6.4. Если у вас уже готов логотип мода, то нажимаем на Обзор… у строки Обложка предмета, в новом окне просто выбираем наш логотип. С ним может быть много проблем, так что возможно придётся перепробовать множество расширений, разрешений и соотношений сторон картинки… Но в итоге вы сможете его добавить.

6.5. И у нас осталась, опять же, необязательная строка с описанием обновления. Его тоже можно написать в самой мастерской.

7. Когда всё заполним, нажимаем на Загрузить, после чего начнётся загрузка.

И в итоге нас обрадуют такой вот прекрасной надписью:

Которая будет означать, что ваш мод успешно выложен. Поздравляю!

Вы всегда сможете подписаться на свой же мод, и поиграть в него. Только не забудьте убрать папку мода, в которой вы работали, из mods. Иначе будет капут.

——————————————————————————————————-

Мод-то мы выложили, а обновлять кто будет? Тоже мы.
Смотрим как.

1. Делаем необходимые изменения в моде, и снова копируем их всех в нашу папку, с публичной версией мода.

2. Снова запускаем ES_Content_Uploader, но на этот раз нажимаем на Обновить существующий предмет.

3. Появится окно, которое потребует ID вашего мода. Вы же записали его, да?

Но если нет, то это не такая уж большая беда. Переходите на страницу вашего мода в мастерской, и в зелёной строке сверху копируйте цифры ID. Ну, если у вас там нету этой строки, то просто скопируйте адрес страницы, с помощью правой кнопки мыши, вставьте куда-нибудь, и оттуда вытащите ID.
Ну или можно подписаться на свой мод, а затем найти его по пути:
…Steamsteamappsworkshopcontent331470
Просто полазайте по папкам, и в одной из них будет знакомые вам файлы. Это и есть ваш мод)

4. Как напишем ID в нужное поле, нажимаем продолжить, и появляется уже знакомое нам окно:

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

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

5. Нажимаем на загрузить, и пойдёт загрузка.

Затем нас снова поздравят той же самой надписью:

Послесловие

Вот и всё. Вы сделали свой собственный мод, уверен он будет отличным!
Посему я могу с гордостью сказать:

Спасибо всем, кто читал и пользовался моим руководством, всем кто оценивал, выдавал награды, комментировал и добавлял в избранное, как во время разработки, так и уже после!

А ещё я хочу сказать спасибо тем замечательным людям, которые своими руководствами, обучили меня всему, чему теперь я обучил вас!
Вот эти руководства:

[link] [link]

Руководство закончено, но конечно же может быть дополнено в будущем.

Если что-то не получается, не стесняйтесь спрашивать.
Постараюсь помочь, всем чем смогу!

SteamSolo.com