Как написать свой мод для бесконечного лета

# Первые шаги

  • Благодарности
  • Предпосылки
  • Создание мода
    • Написание кода
    • Объявление мода
  • Написание сценария
    • Метки
    • Реплики
    • ADV и NVL режимы повествования
    • Оформление текста
  • Фоны
    • Бэкграунды [БГ]
    • Иллюстрации [ЦГ]
  • Спрайты
  • Действия с изображениями
    • Позиционирование
    • Анимации появления
    • Добавление своих изображений
  • Звуки
    • Добавление звуков, музыки, эмбиенса
    • Музыка
    • Окружение
    • Прочее
    • Плавный вход/выход музыки
    • Зацикливание и разцикливание музыки
    • Поочерёдное воспроизведение
  • Видео
    • Полноэкранные видеоролики
    • Видео, как отображаемые объекты и спрайты

# Благодарности

  • Создателям отличного гайда в Steam (opens new window), на котором основано данное руководство:
    • HenсoDesu (opens new window) — за создание гайда в Steam.
    • Владе (opens new window) — за создание интересных модов и за помощь в дополнениии руководства в Steam.
    • Лене (opens new window) — за помощь в коментариях всем, кто столкнулся с затруднениями в Steam и создание полезных модификаций.
  • Nikolas Khikkanov (opens new window) | poi (opens new window) — за помощь в создании данного руководства.
  • Stepan Kupryashin (opens new window) | СТЕПАН4ик (opens new window) — за помощь в создании данного руководства.
  • Авторам модификации «7 Дней Лета» (позднее — «7 Дней Лета — Lost Alpha» (opens new window)) — за предоставленные ресурсы. Использование только в рамках лицензии CC BY-NC-SA 4.0 (opens new window).
  • Группе «Как создать свой мод для игры Бесконечное Лето» (opens new window) и всем тем, кто наполнял её полезным контентом, часть из которого присуствует в данном руководстве.
  • Команде «GM-Mod» (opens new window) — за предоставленные ресурсы из модификации «Свобода или Счастье» (opens new window).
  • Группе «Загрузчик модов для Бесконечного лета» (opens new window) — за портирование модов на моб. устройства и создание ESTool (opens new window).

# Предпосылки

  • Установленная игра «Бесконечное Лето».
  • Текстовый редактор:
    • Visual Studio Code (opens new window) + Ren’Py Language (opens new window)личная рекомендация;
    • Atom (opens new window) + language-renpy (opens new window) — синтаксис поддерживается официально (opens new window) создателем Ren’Py;
    • Notepad++ (opens new window);
    • Sublime Text (opens new window) + Ren’Py Language (opens new window).

# Создание мода

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

# Написание кода

Стиль и синтаксис Ren’Py похож на Python. Если знакомы с ним, то проблем возникнуть не должно.

Файлы состоят из блоков и команд в блоках, например:

<Блок>:
    <Команды>

<Блок>

1
2
3
4

WARNING

Команды в блоках должны везде иметь одинаковый отступ. Будь то 2 или 4 пробела.
В большинстве случаев рекомендуется использовать 4 пробела.

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

WARNING

Следует помнить, что Ren’Py не любит табуляцию, выкидывая ошибку (Traceback) при наличии подобного. Один из вариантов решения подобной проблемы: настройка авто-замены табов на пробелы в настройках Вашего рекдактора/с помощью установки соответствующего расширения.

# Объявление мода

WARNING

Шаги, приведенные ниже крайне важны. Без них мод не будет виден в списке модов в игре.

Для того чтобы игра поняла, что файл (в котором строчки будут написаны) является модом, нужно написать следующее:

init:
    $ mods["my_mod"] = "Мой мод"

1
2

Разберем более детально пример выше:

  1. my_mod — название начального лейбла мода. При запуске мода, всегда первым начинает запускаться этот лейбл, указанный внутри командых скобок. Не будет виден пользователю. Должен быть уникальным, иначе возможны конфликты с модификациями, имеющими лейблы с таким же названием. Рекомендуется использовать только латиницу!
  2. Мой мод — название мода, которое будет отображаться в списке модов. Допускается использование кириллицы.

Теперь, для того, чтобы игра поняла, где начинается мод, нужно добавить начальный лейбл:

init:
    $ mods["my_mod"] = "Мой мод"

label my_mod:
    "Реплика"
    # Далее будут идти команды

1
2
3
4
5
6

В коде выше:

  1. Была объявлена метка (label), имя которой обязательно должно соответствовать имени мода, указанного в квадратных скобках. В нашем случае — my_mod.

TIP

Если вы хотите поменять шрифт в списке, то конструкция будет следующей:

init:
    $ mods["my_mod"] = u"{font=mods/my_mod/<название шрифта>.ttf}Мой мод{/font}"

1
2

Можно использовать как TrueType (.ttf), так и OpenType (.otf) шрифта.

Также можно добавить цвет:

init:
    $ mods["my_mod"] = u"{font=mods/my_mod/<название шрифта>.ttf}{color=#45B39D}Мой мод{/color}{/font}"

1
2

И изменить размер шрифта:

init:
    $ mods["my_mod"] = u"{font=mods/my_mod/<название шрифта>.ttf}{color=#45B39D}{size=50}Мой мод{/size}{/color}{/font}"

1
2

# Написание сценария

Далее, в метке my_mod можно начинать писать сценарий. В нем используется специальный синтаксис Ren’Py, который мы разберем далее.

# Метки

Использование меток позволяет облегчить процесс создания мода, путем разделения сценария на части.

WARNING

Имена меток должны быть уникальными во избежание конфликтов.
Рекомендуется использовать названия меток, начиная с названия мода, например, my_mod_day1.

Общий синтаксис метки выглядит так:

label <Название>:
    <Команды>

1
2

# Переходы между лейблами

Есть два вида переходов:

  1. Прыжок (jump)
label my_mod_day1:
    "..."
    jump my_mod_day2 # Прыжок на my_mod_day2

label my_mod_day2:
    "..."

1
2
3
4
5
6

В данном случае команды после «прыжка» будут пропущены игрой, например, фраза «действия после прыжка» из примера ниже не будет выведена на экран игрока. Любые другие команды, которые были написаны после прыжка также не сработают.

label my_mod_day1:
    "..."
    jump my_mod_day2
    "действия после прыжка"

label my_mod_day2:
    "..."

1
2
3
4
5
6
7

  1. Вызов (call)

В этом случае фраза из примера выше будет выведена на экран после завершения действий из метки my_mod_day2.

label my_mod_day1:
    "..."
    call my_mod_day2 # Вызов второго лейбла
    "Действия после прыжка" # После того, как нас выбросит из лейбла my_mod_day2 командой return, появится данная фраза.

label my_mod_day2:
    "..."

1
2
3
4
5
6
7

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

Приведём ещё один пример для наглядности:

label my_mod_day1:
    "..."
    "Сейчас вызовем другой лейбл!"
    call my_mod_day2 # Вызываем второй лейбл
    "Второй лейбл закончился, можем продолжать работать на первом."
    return # А вот здесь уже, если ничего другого не вызывали, нас выкинет из мода.


label my_mod_day2:
    "Вот мы и вызвали второй лейбл. Делаем тут что хотим."
    "..."
    "Второй лейбл подходит к концу"
    return # Заканчиваем вызов лейбла, перескок обратно на первый.

1
2
3
4
5
6
7
8
9
10
11
12
13

В первом лейбле идут некие действия, затем мы вызываем второй лейбл, в котором тоже идут некие действия. Из-за того, что мы вызвали второй лейбл, а не прыгнули на него, при команде return внутри вызванного лейбла мод не завершится — нас просто выкинет обратно на первый лейбл, потому что мы прекратили ‘вызов’ второго лейбла и вернулись обратно на первый. Но! Вернулись не в самое его начало, а продолжили работу после момента с вызовом второго лейбла.

# Реплики

Реплики персонажей имеют следующий общий вид: <ID персонажа> "<Реплика>", где:

  1. ID персонажа — название переменной, которой он был объявлен.
  2. Реплика — текст, который будет говорить персонаж.

Список персонажей и их переменные представлены в таблице по ссылке: Ресурсы игры — Персонажи.

В примере ниже представлен пример реплик Мику и Ульяны, имена которых ещё не известны:

label my_mod:
    mip "Привет, ты меня ещё не знаешь, но это я — Мику!"
    mip "В данный момент я у тебя отображаюсь как 'Пионерка'."
    usg "Привет, а я — Ульянка! Но у тебя я написана как "Девочка"."

1
2
3
4

В первом случае имя пионера или пионерки будет сменено на «Пионер/Пионерка», сохраняя свой цвет. Во втором же случае имя персонажа будет сменено на «Девочка», сохраняя свой цвет.

Смена стиля интерфейса

Есть всего 4 варианта:

  1. prolog_time() — Интерфейс пролога.
  2. day_time() — Интерфейс дня.
  3. sunset_time() — Интерфейс заката.
  4. night_time() — Интерфейс ночи.

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

label my_mod:
    $ prolog_time() # Интерфейс изменит стиль на стиль из пролога
    "..."
    $ day_time() # Интерфейс изменит стиль на дневной

1
2
3
4

Смена окраски спрайтов согласно времени

Всего существует 3 варианта раскраски спрайтов. Все они происходят через переменную persistent.sprite_time

  1. $ persistent.sprite_time = "day" — Дневная версия окраски спрайтов.
  2. $ persistent.sprite_time = "sunset" — Вечерняя версия окраски спрайтов.
  3. $ persistent.sprite_time = "night" — Ночная версия окраски спрайтов.

Пример использования смены окраски спрайтов вкупе со сменой стилей интерфейса выглядит так:

label my_mod:
    $ day_time() # Смена стиля интерфейса на дневной
    $ persistent.sprite_time = "day" # Смена окраски спрайтов на дневную версию.
    "..."
    $ sunset_time() # Смена стиля интерфейса на вечерний
    $ persistent.sprite_time = "sunset" # Смена окраски спрайтов на вечернюю версию.
    "..."
    $ night_time() # Смена стиля интерфейса на дневной
    $ persistent.sprite_time = "night" # Смена окраски спрайтов на ночную версию.
    "..."
    $ prolog_time() # Смена стиля интерфейса на зимнюю версию. Версию пролога.
    $ persistent.sprite_time = "night" # Смена окраски спрайтов на ночную версию.

1
2
3
4
5
6
7
8
9
10
11
12

Обратите своё внимание, что если в моде не менять значение переменной смены стиля интерфейса и смены окраски спрайтов, то по умолчанию стиль интерфейса будет равен $ prologue_time(), а окраска спрайтов — $ persistent.sprite_time = "night"

# ADV и NVL режимы повествования

Существует два основных стиля изложения материала, используемых в визуальных новеллах:

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

  2. NVL:
    Визуальные новеллы, созданные в стиле NVL, представляют собой несколько строк на экране, выводимые одновременно в окне, которое занимает весь экран.

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

Для перехода в NVL-режим повествования используйте следующую команду:
$ set_mode_nvl()

Для перехода обратно в ADV-режим повествования используйте следующее:
$ set_mode_adv()

Примеры перехода в NVL и ADV режимы повествования:

label my_mod:
    "По умолчанию стоит adv-режим повествования."
    $ set_mode_nvl()
    "Теперь повествование ведётся в nvl-режиме."
    $ set_mode_adv()
    "Повествование вернулось обратно в adv-режим."

1
2
3
4
5
6

Плавные переходы окон

Не забывайте про плавные переходы для окон, в которых ведётся повествование.

Для ADV-режима:

  • window hide — плавное скрытие диалогового окна.
  • window show — плавное появление диалогового окна.

Для NVL-режима:

  • nvl show dissolve — плавное появление NVL-окна.
  • nvl hide dissolve — плавное скрытие NVL-окна.

Пример использования плавных переходов окон выглядит так:

label my_mod:
    "Повествование в adv-режиме."

    window hide # Плавное скрытие окна
    pause(1) # Секундная пауза, чтобы сокрытие окна успело произойти до смены режима повествования
    $ set_mode_nvl() # Переключение на новелльный режим повествования
    nvl show dissolve # Плавное появление nvl-окна

    "Повествование в nvl-режиме."

    nvl hide dissolve # Плавное скрытие nvl-окна
    pause(1) # Секундная пауза, чтобы сокрытие окна успело произойти до смены режима повествования
    $ set_mode_adv() # Переключение на adv-режим повествования
    window show # Плавное появление диалогового окна

    "Повествование в adv-режиме."

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

Появление персонажа в NVL-режиме

Персонажи могут быть объявлены для использования в NVL-режиме путем создания ещё одного персонажа, но с добавлением параметра kind=nvl.
Например:

define maks_nvl = Character('Максим', kind=nvl, color="#c8ffc8")

1

Если этого не сделать, то внутри nvl-режима повествования персонажи без параметра kind=nvl будут говорить в adv-режиме.

Обратите своё внимание, что можно сделать и по другому — сделать цикл, который будет менять объявление персонажей в зависимости от текущего режима повествования. Именно такой способ и используется в БЛ.

# Оформление текста

Примеры текстовых тегов:

  1. alpha

Текстовый тег alpha отображает текст, расположенный между самим тегом и его закрывающим тегом, с указанной непрозрачностью. Непрозрачность должна иметь значение между 0.0 и 1.0, что соответствует полной прозрачности и полной непрозрачности соответственно. Если значение начинается с префикса + (добавить на) или - (убавить на), непрозрачность будет изменена на указанное число, а не полностью заменена. Если значение начинается с префикса * (умножить на), непрозрачность будет умножена на это число.

"{alpha=0.1}Этот текст едва читаем!{/alpha}"
"{alpha=-0.1}Этот текст на 10 процентов прозрачнее, чем текст по умолчанию.{/alpha}"
"{alpha=*0.5}Этот текст наполовину такой же непрозрачный, как и по умолчанию.{/alpha}"

1
2
3

  1. b (bold)

Тег жирного шрифта выводит текст, расположенный между самим тегом и его закрывающим тегом, жирным шрифтом.

"Пример {b}текста, выделенного жирным шрифтом{/b}."

1

  1. color

Текстовый тег color отображает текст, расположенный между самим тегом и его закрывающим тегом, в указанном цвете. Цвет должен быть в формате #rgb, #rgba, #rrggbb или #rrggbbaa.

"{color=#f00}Красный{/color}, {color=#00ff00}Зелёный{/color}, {color=#0000ffff}Синий{/color}"

1

  1. i (italic)

Тег курсива отображает текст, расположенный между самим тегом и его закрывающим тегом, курсивом.

mt "Добро пожаловать в {i}СОЛ «Совёнок»!{/i}."

1

  1. s (strikethrough)

Тег зачеркивания проводит черту через текст, расположенный между тегом и его закрывающим тегом.

mi "Я очень надеюсь, что {s}тебе понравилось{/s}."

1

  1. u (underline)

Тег подчеркивания подчеркивает текст, расположенный между самим тегом и его закрывающим тегом.

mi "Рада видеть {u}тебя{/u}!"

1

  1. w (wait)

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

un "Я{w} очень{w=1.0} рада!"

1

Полный список текстовых тегов можно найти внутри соответствующей статьи в документации Ren’Py (opens new window).

# Фоны

# Бэкграунды [БГ]

Общий синтаксис для вывода фона: scene <Название фона> или show <Название фона>

Разница между scene и show

В первом случае команда очищает все слои и показывает изображение, во втором — просто показывает изображение поверх других.
Приведём пример:

label my_mod:
    show bg ext_square_day # Площадь
    show dv smile pioneer2 at left # Слева появляется Алиса
    show mi happy pioneer at center # Мику посередине
    show un smile pioneer al left # А Лена левее
    with dissolve # Пишем в конце всех строчек, а не у каждой, чтобы и БГ, и спрайты появились сразу, а не поочерёдно.
    "Некие действия"
    scene bg ext_square_day with dissolve
    "Показываем площадь, но теперь все спрайты убрались совсем."
    "Если уберём фон с помощью `hide`, то позади него ничего не будет."

1
2
3
4
5
6
7
8
9
10

Это был пример с использованием scene для показа изображения. Фона, в нашем случае.

label my_mod_2:
    show bg ext_square_day # Площадь
    show dv smile pioneer2 at left # Слева появляется Алиса
    show mi happy pioneer at center # Мику посередине
    show un smile pioneer al left # А Лена левее
    with dissolve # Пишем в конце всех строчек, а не у каждой, чтобы и БГ, и спрайты появились сразу, а не поочерёдно.
    "Некие действия"
    show bg ext_square_night with dissolve
    "Показываем ночную площадь."
    "Спрайты никуда не исчезают, остаются поверх фона, который меняется с дневного на ночной."

1
2
3
4
5
6
7
8
9
10

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

TIP

В данном случае, из-за того, что у фона имеется отступ после слова bg, слово bg сработало как «тэг» и сменился только фон, а не показался новый поверх спрайтов (А если бы изображение было без тэга и показалось поверх всего, то если бы мы его убрали про помощи hide, мы бы снова увидели нашу дневную площадь и спрайты девушек). Более подробно об этом рассказано чуть ниже.

Например:

scene bg bus_stop # Покажет нам автобусную остановку из времени Семена
scene bg int_bus # Внутри автобуса, привезшего нас в "Совенок"
scene bg ext_bus_night # Снаружи этого же автобуса, но уже ночью

1
2
3

Фоны из игры представлены в таблице по ссылке: Ресурсы игры — Изображения — Фоны.

# Иллюстрации [ЦГ]

Общий синтаксис для вывода иллюстраций: scene <Название арта> или show <Название арта>

Например:

scene cg d3_dv_scene_1 # Покажет арт с Алисой и Семёном на сцене, ночью.
scene cg d3_ussr_catched # Покажет лежащую на траве Ульянку.
scene cg d1_sl_dinner_0 # Славя и Семён ночью в столовой.

1
2
3

Все иллюстрации из игры представлены в таблице по ссылке: Ресурсы игры — Изображения — CG.

# Спрайты

Вызывается спрайт с помощью: show <Имя спрайта>

Обычно спрайты состоят из слов, разделённых пробелом: <имя персонажа> <эмоция> <одежда>

TIP

В оригинальной игре имя персонажа совпадает с ID говорящего из предыдущего раздела этого руководства

Например:

show dv angry pioneer # Злая Алиса
show un cry sport # Плачущая Лена в спортивной форме

1
2

Список всех спрайтов пока можно найти здесь (opens new window).

WARNING

Если персонаж уже на экране, то повторное использование show будет менять эмоцию и/или одежду, если при повторном использовании у персонажа имеется «тэг».
Скажем, в команде show un cry sportun выступает в качестве «тэга» персонажа, поэтому при смене одежды/эмоции не нужно будет убирать предыдущую картинку.
Точно также тэги работают и с изображениями по типу БГ, ЦГ, и прочих.

Для того, чтобы убрать персонажа, воспользуйтесь: hide <Имя персонажа>

TIP

Если вы хотите вслед за этим сменить декорации, то прописывать hide для каждого персонажа не обязательно, команда scene сама их уберет.

# Действия с изображениями

# Позиционирование

При простом использовании show <Спрайт> он будет появляться просто по центру, это можно исправить, добавив в конец at <Позиция>: show <Спрайт> at <Позиция>.

Всего в игре 7 позиций где может находиться спрайт:

  • fleft
  • left
  • cleft
  • center
  • cright
  • right
  • fright

Пример расположения спрайтов

На скриншоте выше были использованы следующие команды:

scene bg ext_bus_night

show dv angry pioneer2 at left
show un smile pioneer at right
show mi cry_smile pioneer at cleft
show sl serious pioneer at cright
show mt rage panama pioneer at center

1
2
3
4
5
6
7

TIP

Также, если не хотите использовать стандартные расположения спрайтов, можно сделать свои собственные! Для этого необходимо показать спрайт, а затем прописать его расположение по x и y координатам. Для этого используем команду center, куда вписываем кортеж float чисел. Первое число — x координата, вторая — y координата.

label mod_start:
    show bg ext_square_day with dissolve
    show sl smile pioneer: # Славя стоит левее.
        center(0.4, 0.5)
    show dv normal pioneer: # Алиса стоит правее.
        center(0.6, 0.5)

1
2
3
4
5
6

Обращаем внимание, что позиционирование идёт по center, а не по align или pos.

Так же можно показать персонажа ближе / дальше. Для этого можно воспользоваться атрибутом close / far.

Пример использования атрибутов close / far

На скриншоте выше как раз были использованы эти атрибуты. Команды:

scene bg ext_bus_night

show dv angry pioneer2 far at left
show un smile pioneer far at right
show mi cry_smile pioneer at cleft
show sl serious pioneer at cright
show mt rage panama pioneer close at center

1
2
3
4
5
6
7

# Анимации появления

Мы можем показать спрайты, bg и cg с некоторым замедлением, плавно.

  • Плавность

scene <Название> with <Атрибут>

Атрибутов для плавности 6, они отличаются лишь своей скоростью:

  1. dspr — 0,2 сек — Самый быстрый, на практике не особо заметен. Оптимален для смены эмоций спрайтов.
  2. dissolve_fast — 0.5 сек.
  3. dissolve — также 0.5 сек. Оптимален для смены BG/CG.
  4. dissolve2 — 2 сек — хороший вариант для длинных переходов между локациями лагеря
  5. hell_dissolve — 50 секунд — на практике не особо применим, но вдруг пригодится.
  6. dissolve_long — 100 секунд.

Также можно группировать несколько объектов для одновременного начала эффекта:

scene bg ext_bus_night
show sl smile pioner far
with dissolve2

1
2
3

В приведенном примере мы попадем в ночной автобус, и перед нами предстанет улыбающаяся Славя. Все это с задержкой в 2 секунды.

TIP

Если все вышеприведённые примеры Вас не устраивают, можно добавить свой атрибут плавности. Для этого, пропишите его в блоке init.

Например,

init:
    $ trisekundi = Dissolve(3.0)

label my_mod:
    scene bg ext_bus_night
    show sl smile pioner far
    with trisekundi

1
2
3
4
5
6
7

  • Моргание

Я более чем уверен, что вы видели эффект того, как иногда ГГ моргает или вовсе закрывает глаза. Мы можем реализовать подобную возможность!

  • show blink — Закрыть глаза
  • show unblink — Открыть глаза
  • show blinking — Моргание

Будьте осторожны

blink и unblink это разные эффекты, они не могут отменить друг друга.

Пример:

show blink
<Ваши события>
hide blink
show unblink

1
2
3
4

TIP

Так же к эффектам моргания можно применить атрибут плавности.

# Добавление своих изображений

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

Для начала нам надо объявить изображение в блоке init. Делается это, с помощью объявления переменной image. Например, если есть изображение city.jpg, и оно находится в папке game/mods/my_mod/city.jpg, то объявить его можно вот так:

init:
    image gorod = "mods/my_mod/city.jpg"

1
2

И использовать его:

init:
    image gorod = "mods/my_mod/city.jpg"

label my_mod:
    scene gorod with dissolve

1
2
3
4
5

Тэги к изображениям

Настоятельно рекомендую использовать тэги. В приведённом ниже примере слово bg выступает в виде тэга к изображению.
Если объявить несколько БГ с таким тегом, то при показе следующего он автоматически заменит предыдущий.

init:
    image bg city = "mods/my_mod/city.jpg"

1
2

Более детальную информацию про ATL (opens new window) смотрите в продвинутом руководстве.

# Звуки

Ren’Py поддерживает воспроизведение музыки и звуковых эффектов, используя следующие форматы аудио файлов: Opus, Ogg Vorbis, mp3, wav.

# Добавление звуков, музыки, эмбиенса

$ <Название аудиофайла> = <Путь к аудиофайлу>

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

init:
    $ city_ambience = "mods/sounds/city_ambience.mp3"

label mod_start:
    play ambience city_ambience # Проигрываем эмбиенс города на канале `ambience`

1
2
3
4
5

# Музыка

Для начала проигрывания музыки используется: play music <Название>, а для остановки — stop music.

Список музыки из игры представлен в таблице по ссылке: Ресурсы игры — Звуки — Музыка.

# Окружение

play ambience <Название>

stop ambience

Звуки окружения из игры представлены в таблице по ссылке: Ресурсы игры — Звуки — Окружение.

# Прочее

play sound <Название>

Прочие звуки из игры представлены в таблице по ссылке: Ресурсы — Звуки — Прочие звуки.

# Плавный вход/выход музыки

Команды fadein и fadeout являются необязательными. fadeout дает время затухания для текущей проигрываемой музыки в секундах, в то время как fadein дает время, необходимое для плавного «входа» новой музыки.

Пример:

label my_mod:
    play music sabaton_rock fadein 4 # Воспроизведение музыки с "входом" в 4 секунды
    '...' # Происходят некие действия по сюжету
    stop music fadeout 4 # Остановка музыки с затуханием в 4 секунды

1
2
3
4

# Зацикливание и разцикливание музыки

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

Пример:

label my_mod:
    play sound house_crush loop # Зацикливаем звук рушения дома
    play music sabaton_rock noloop # Разцикливаем музыку, заставляя её играть только один раз

1
2
3

# Поочерёдное воспроизведение

Оператор queue используется для создания очереди аудио файлов. Они будут воспроизведены, когда канал закончит воспроизведение текущего воспроизводимого файла, если таковой имеется.

Команда для кортежа воспроизводимых файлов начинается с ключевого слова queue, за которым следует имя канала для воспроизведения звука. Он опционально принимает команды fadein, loop и noloop.

Пример:

label my_mod:
    queue music ["rock.mp3", "hip_hop.mp3", "jazz.mp3"] # Поочерёдно воспроизводит три аудиофайла через канал 'music'. После окончания первого файла, сразу же начинается следующий.

1
2

TIP

Также queue поддерживает параметры loop и fadein.

# Видео

Ren’Py предусматривает возможность использования встроенной версии Libav для воспроизведения видеороликов с такими форматами, как: .webm, .matroska, .ogg,.avi

# Полноэкранные видеоролики

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

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

label my_mod:
    dv "Сейчас запустится фильм!"
    $ renpy.movie_cutscene("Брат.webm")
    dv "Фильм закончился."

1
2
3
4

# Видео, как отображаемые объекты и спрайты

Видеоролик, отображаемый на экране посредством команды Movie, можно использовать для отображения в любом месте, где Ren’Py может его показать. Например, видео может выводиться как фон экрана меню или в качестве фона.

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

TIP

Видео, которые воспроизводятся в отображаемом объекте Movie, зацикливаются автоматически.

Movie принимает два параметра:

  • play — строка, содержащая имя воспроизводимого видеофайла. Параметр всегда должен быть задан.

  • mask — строка, содержащая наименование видеофайла для использования в качестве альфа-маски. Она должна быть того же размера, продолжительности и частоты кадров, что и видеофайл, заданный в play.

Вот пример определения видео спрайта:

init:
    image brat movie = Movie(play="brat.webm", mask="brat_mask.webm")

1
2

Видео спрайт можно показать с помощью оператора show, который автоматически запускает воспроизведение видео. Он будет автоматически остановлен при скрытии отображаемого объекта.

label my_mod:
    show brat movie
    "Данный видеоролик показан как спрайт."
    hide brat
    "Ролик убран."

1
2
3
4
5

Видеоролик, прописанный через Movie также можно использовать как часть экрана, при условии, что он создан во время фазы инициализации (init-блок) (например, как часть оператора image).

Приведём пример:

init:
    image main_menu = Movie(play="main_menu.ogv")

screen main_menu:
    add "main_menu"
    textbutton "Start" action Start() xalign 0.5 yalign 0.5

1
2
3
4
5
6

TIP

Экраны можно прописывать и вне init-блока.

TIP

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

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]

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

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

Внимание!

Гайд написан для steam-версии 1.2! 

О моддинге на других версиях будет рассказано позже.

Введение

Ты только что завершил проходить Бесконечное Лето. В голове тут же возникла куча мыслей:

«Кто такой Пионер?»

«Что станет с Семёном?»

«Есть ли продолжение?»

В поисках ответа ты натыкаешься на моды. И вот тут возникает два варианта действий:

  • Пройти их все!
  • Написать свой мод!

К сожалению, не все создатели модов обладают хорошими писательскими навыками. Так что прежде, чем плодить «Пацанское лето» или «Алиса и заветная комната», дважды подумай о содержании мода. Всё-таки мы пишем визуальную новеллу, где упор ставится на сюжет.

Придумал хорошую идею, которую хочешь донести до мира? Тогда приступим!

(В дальнейшем уроки будут переведены в видеоформат. Наверное. Когда-нибудь.)

Полезный софт

Для удобной работы потребуется:

  • Notepad++

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

  • Punto Switcher

Не раз спасал от переписывания целой страницы текста, написанной не в той раскладке. Нажатие пары клавиш поможет изменить раскладку, регистр и т. д.

  • Photoshop

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

  • Любой плеер

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

Урок 1
Основы. Текст, картинки и музыка.

Лето написано на движке Ren`py. Особенность моддинга на данной платформе очень проста — создаём блокнотик в папке steamsteamappscommonEverlasting Summergamemods, переименовываем расширение txt в rpy, меняем кодировку на UTF-8 — и вперёд!

А что вперёд? Код мы не умеем писать, да и вообще программирование незнакомо?

Не время отчаиваться! Будем решать проблемы по мере их поступления.
(Если ты умеешь кодить (особенно на Python), можешь просто нагуглить документацию по Ren`py и писать мод самостоятельно.)

Итак, ты и чистый лист блокнота. Для начала учти, что все табуляции должны быть преобразованы в пробелы. Поэтому в Notepad++  заходим в меню Опции — Горячие клавиши и там задаём команде «Табуляцию в Пробел» клавиши Ctrl+Tab. Ну или какие хочешь, у нас свободная страна.

Привыкай к последовательности Ctrl+Tab, Ctrl+S

Прошло уже достаточно времени, а в твоём файле «lenashka.rpy» пусто? Так приступим же!

Итак, первый блок нашего мода — блок объявления. Здесь мы объявляем всё — от переменных до функций.

Команда «init:» создаст наш блок.

Пришла пора назвать наш мод и сделать запуск из меню «Моды и пользовательские сценарии».

Разбираемся:

Табуляция в начале — знак того, что текст принадлежит этому блоку.
 $ — использование языка Ren`py или Python

mods[«»] — команда, которая добавляет мод в список модов. В кавычках необходимо указать блок (латиницей), на который игрок переходит во время запуска.
= — присваивание блоку запуска определённое имя в списке модов.
u — в строке используются символы Unicode. И в кавычках — название мода на любом языке.

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

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

















label — кодовое слово «Метка». На метку можно перейти или вызвать, но об этом в следующем уроке.

После метки идёт её имя — то самое, которое мы задали в списке модов.
И не забудь про «:»! Это показывает, что ниже — содержимое этого блока.

Едем дальше. Теперь ты можешь писать любой текст, включать любую музыку и вставлять любые картинки. Как? Очень просто!

Выглядеть это будет так:

Теперь — сам код.
play — запускает звук
music — помещает его на канал «музыка». Есть три канала: music, sound и ambience. Music и ambience проигрывают звук в цикле.
music_list[«»] — звук берётся из списка самой игры.
fadein <число> — нарастание музыки в течение указанного количества секунд. Необязательно.

scene — задаётся самый нижний слой, на который чаще всего помещаются фоны. При применении этой команды на непустой экран все спрайты и картинки скрываются.
bg — указывает на то, что картинка является фоном. Можно использовать и без bg, но не всегда картинки будут работать.
ext_camp_entrance_day — название картинки.
with dissolve — анимация появления картинки. Можно использовать вообще без анимации, но это будет не так красиво. Dissolve — медленный переход, dspr — быстрый и используется чаще для изменения эмоций. Также существуют и другие, но об этом позже.

show — появление картинки на фоне
sl — название спрайта персонажа
nomal — эмоция персонажа
pioneer — одежда
far, close — существует три положения относительно игрока. По умолчанию это среднее положение. Кроме этого, есть far — дальнее и close — ближнее положение.
at left — положение относительно центра экрана. Слева направо: fleft, left, cleft, center, cright, right, fright. Если персонаж уже находится в нужном положении, можно не использовать.
Также можно использовать только один wih dissolve на следующей строке после описания Слави. Тогда фон и спрайт появятся одновременно, а не последовательно. Также это можно использовать для одновременной смены эмоций разных персонажей.

Весь текст пишется в кавычках.
{w} — пауза во время чтения. То есть, игрок должен нажать ЛКМ ещё раз, чтобы перейти к следующей части.
sl, me — имена персонажей, отображаются в верхней части текстового окна. Полный список — тута. Кроме того, тут списки всех материалов из игры.
th — мысли (~текст такого типа~)
И return — возврат на предыдущий уровень. Если уровень последний, то игра выйдет в меню.

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

На этом первый урок закончен. Потренируйся с этими инструментами, а если захочешь поделиться результатами — шли файл с кодом в комментарии с меткой «Урок 1».

Урок 2

Выборы, разветвления и переменные.

Ты уже достаточно потренировался с линейным моддингом, но хочется чего-то большего?
Добро пожаловать во второй урок!

Но до этого надо исправить парочку недочётов: остановим музыку.

Аналогично с play — указываем нужный канал и, по желанию, время затухания.

Начнём с самого элементарного — меню выбора действия. Но до этого добавим за спину Слави кого-нибудь чтобы разобраться со слоями.

После указания персонажа, эмоции и типа одежды указываем, за кем должен стоять персонаж. В данном случае на экране у нас только Славя, поэтому пишем behind sl. Если ты используешь far или close, то команда behind должна стоять после. Но обязательно перед with-командой (или at, если она есть). 

ะஇ°⌒⊹⌒⊹⌒⊹⌒⊹⌒⊹⌒°˚₊୭̥*ೃ.

┆┆ ᎒⃟ໍ :leaves: :³   𝑾𝒆𝒍𝒍𝒄𝒐𝒎𝒆  ╰┆──━╯┄━┄━┄━┄ 噩梦࿔

ೋ❀❀ೋ══ :herb: ═══ೋ❀❀ೋ

Приветствую Участники сообщества! Вот и новая рубрика для нашего сообщества, в ней вы сможете научиться создавать свои Модификации для «Бесконечное Лето».

В данной части вы узнаете про основные этапы создания Модификации:

1. Где что искать (БГ, ЦГ, Спрайты и прочее)

2. Где брать названия оригинальных БГ и ЦГ

3. Написание кода для мода и запуск

4. Добавление спрайтов, БГ, ЦГ, Звуков.

▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬

Пункт 1. Где что искать?

Для начала нам понадобится скачать мой архив, в нем присутствуют БГ, ЦГ, Интро, Названия спрайтов, названия Ambient, Звуков и Музыки.

▸ Ссылка на скачивание архива (Яндекс Диск) — https://yadi.sk/d/1CotoQLMlztXOA

▸ Ссылка на скачивание архива (Google Диск) — https://drive.google.com/file/d/1oMMVh76w8yr60_p8tTg6rRwZcOsxDHWN/view?usp=drivesdk

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

▸ Ссылка на обсуждение (ВКонтакте) — https://m.vk.com/topic-107038185_35202826?offset=0

▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬

Пункт 2. Где брать названия оригинальных БГ и ЦГ

Если же вы скачали архив с прошлого пункта и распаковали куда нибуть на рабочий стол, то заходите в папку CG или BG, в зависимости от того что вам нужно, далее смотрите какой ЦГ или БГ вам нужен и копируете его название.

▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬

Пункт 3. Написание кода для мода и запуск.

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

Для начала вам необходимо зайти в Steam и перейти в вашу библиотеку. Ищем Бесконечное Лето.

▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬

Рубрика: Создание Модификации для БЛ (<a href='/c/EverlastingSummerSG/tag/1/'>#1</a>)-[C]ะஇ°⌒⊹⌒⊹⌒⊹⌒⊹⌒⊹⌒°˚₊୭̥*ೃ.
[C]  ┆┆ ᎒⃟ໍ :leaves: :³   𝑾𝒆𝒍𝒍𝒄𝒐𝒎𝒆  ╰┆──━╯┄━┄━┄━┄ 噩梦࿔
[C]ೋ❀❀ೋ══  :herb:

▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬

После того как мы нашли Бесконечное Лето, ищем Шестеренку и нажимаем на неё, далее нажимаем на «Свойства» и переходим во вкладку «Локальные Файлы», нажимаем «Просмотреть Локальные Файлы».

▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬

Рубрика: Создание Модификации для БЛ (<a href='/c/EverlastingSummerSG/tag/1/'>#1</a>)-[C]ะஇ°⌒⊹⌒⊹⌒⊹⌒⊹⌒⊹⌒°˚₊୭̥*ೃ.
[C]  ┆┆ ᎒⃟ໍ :leaves: :³   𝑾𝒆𝒍𝒍𝒄𝒐𝒎𝒆  ╰┆──━╯┄━┄━┄━┄ 噩梦࿔
[C]ೋ❀❀ೋ══  :herb:

Рубрика: Создание Модификации для БЛ (<a href='/c/EverlastingSummerSG/tag/1/'>#1</a>)-[C]ะஇ°⌒⊹⌒⊹⌒⊹⌒⊹⌒⊹⌒°˚₊୭̥*ೃ.
[C]  ┆┆ ᎒⃟ໍ :leaves: :³   𝑾𝒆𝒍𝒍𝒄𝒐𝒎𝒆  ╰┆──━╯┄━┄━┄━┄ 噩梦࿔
[C]ೋ❀❀ೋ══  :herb:

▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬

После того как мы нажали «Просмотреть Локальные Файлы» мы попали в директорию игры, переходим в папку «game» и ищем папку «mods», Заходим в неё.

После мы создаём внутри папки mods другую папку. (Рекомендую не создавать папку с русскими буквами, делайте папку на английском)

Заходим в новую папку и создаём любой текстовый файл, далее мы его сохраняем как «.rpy» (Просто меняете расширение файла), для редактирования нашего файла понадобится Notepad++, его можно скачать бесплатно с Официального сайта.

▸ Создаём ещё 2 папки внутри нашей (images и sound, в второй части эти папки нам обязательно понадобятся)

▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬

Рубрика: Создание Модификации для БЛ (<a href='/c/EverlastingSummerSG/tag/1/'>#1</a>)-[C]ะஇ°⌒⊹⌒⊹⌒⊹⌒⊹⌒⊹⌒°˚₊୭̥*ೃ.
[C]  ┆┆ ᎒⃟ໍ :leaves: :³   𝑾𝒆𝒍𝒍𝒄𝒐𝒎𝒆  ╰┆──━╯┄━┄━┄━┄ 噩梦࿔
[C]ೋ❀❀ೋ══  :herb:

Рубрика: Создание Модификации для БЛ (<a href='/c/EverlastingSummerSG/tag/1/'>#1</a>)-[C]ะஇ°⌒⊹⌒⊹⌒⊹⌒⊹⌒⊹⌒°˚₊୭̥*ೃ.
[C]  ┆┆ ᎒⃟ໍ :leaves: :³   𝑾𝒆𝒍𝒍𝒄𝒐𝒎𝒆  ╰┆──━╯┄━┄━┄━┄ 噩梦࿔
[C]ೋ❀❀ೋ══  :herb:

Рубрика: Создание Модификации для БЛ (<a href='/c/EverlastingSummerSG/tag/1/'>#1</a>)-[C]ะஇ°⌒⊹⌒⊹⌒⊹⌒⊹⌒⊹⌒°˚₊୭̥*ೃ.
[C]  ┆┆ ᎒⃟ໍ :leaves: :³   𝑾𝒆𝒍𝒍𝒄𝒐𝒎𝒆  ╰┆──━╯┄━┄━┄━┄ 噩梦࿔
[C]ೋ❀❀ೋ══  :herb:

▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬

После мы открываем наш .rpy файл с помощью Notepad++, именно тут мы будем писать код для нашего мода.

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

После мы должны дать название нашего мода (Где квадратные скобки можете написать название первого label, в другой части где кавычки пишете свое название на любом языке)

▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬

Рубрика: Создание Модификации для БЛ (<a href='/c/EverlastingSummerSG/tag/1/'>#1</a>)-[C]ะஇ°⌒⊹⌒⊹⌒⊹⌒⊹⌒⊹⌒°˚₊୭̥*ೃ.
[C]  ┆┆ ᎒⃟ໍ :leaves: :³   𝑾𝒆𝒍𝒍𝒄𝒐𝒎𝒆  ╰┆──━╯┄━┄━┄━┄ 噩梦࿔
[C]ೋ❀❀ೋ══  :herb:

▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬

Далее мы создадим наш label (Диалоговое окно), далее с помощью моего архива вы сможете найти оригинальные БГ и вставить в проект.

Для этого нужно написать данную строчку: «scene bg название_бг with dissolve» (По желанию можно добавить к dissolve цифру 2 что бы получить другой эффект появления фона, про эффекты будет в второй части)

▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬

Рубрика: Создание Модификации для БЛ (<a href='/c/EverlastingSummerSG/tag/1/'>#1</a>)-[C]ะஇ°⌒⊹⌒⊹⌒⊹⌒⊹⌒⊹⌒°˚₊୭̥*ೃ.
[C]  ┆┆ ᎒⃟ໍ :leaves: :³   𝑾𝒆𝒍𝒍𝒄𝒐𝒎𝒆  ╰┆──━╯┄━┄━┄━┄ 噩梦࿔
[C]ೋ❀❀ೋ══  :herb:

▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬

Далее после того как мы создали наш label мы можем делать реплики персонажей, пример с репликами вы найдёте на скриншотах

Небольшое замечание:

После того как мы создали самый первый label с его (В квадратных скобках, 3 строчка на скриншоте) вы можете называть label как хотите (Только на английском)

Список персонажей для создания реплик:

» » — Авторская речь

th — Мысли

sl — Славя

dv — Алиса

un — Лена

us — Ульяна

me — Семен

uv — Юля

mi — Мику

pi — Пионер

mt — Ольга Дмитриевна

cs — Виола

sh — Шурик

mz — Женя

el — Электроник

▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬

Рубрика: Создание Модификации для БЛ (<a href='/c/EverlastingSummerSG/tag/1/'>#1</a>)-[C]ะஇ°⌒⊹⌒⊹⌒⊹⌒⊹⌒⊹⌒°˚₊୭̥*ೃ.
[C]  ┆┆ ᎒⃟ໍ :leaves: :³   𝑾𝒆𝒍𝒍𝒄𝒐𝒎𝒆  ╰┆──━╯┄━┄━┄━┄ 噩梦࿔
[C]ೋ❀❀ೋ══  :herb:

Рубрика: Создание Модификации для БЛ (<a href='/c/EverlastingSummerSG/tag/1/'>#1</a>)-[C]ะஇ°⌒⊹⌒⊹⌒⊹⌒⊹⌒⊹⌒°˚₊୭̥*ೃ.
[C]  ┆┆ ᎒⃟ໍ :leaves: :³   𝑾𝒆𝒍𝒍𝒄𝒐𝒎𝒆  ╰┆──━╯┄━┄━┄━┄ 噩梦࿔
[C]ೋ❀❀ೋ══  :herb:

▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬

После того как мы сделали примерно что то такое как и у меня на скриншотах — сохраняем файл и закрываем его, Заходим в Бесконечное Лето и в вкладке с Модификациями будет показываться наша Модификация

Небольшое Замечание:

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

И ещё, когда я делала скриншот с названием первого label — Я добавила «_day1», это может вызвать ошибку, так что — не повторяйте данную ошибку, я позже переделаю скриншот >~<

▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬

Итоги:

Вот мы и научились делать самый простенький мод, с помощью других частей мы будем развивать наш код — может в конце у нас получится что то клёвое :+1: 🏻

Благодарю вас за ознакомление с данным постом, надеюсь он вам понравится и был полезен :wave: 🏻

ะஇ°⌒⊹⌒⊹⌒⊹⌒⊹⌒⊹⌒°˚₊୭̥*ೃ.

Previewfile 617591839.jpg

Путь к успеху для мододелов!

Описание:

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

Что включает в себя мод:

  1. 5 надеюсь понятных уроков.
  2. Слайды уроков от лолбота.
  3. Свежий список ресурсов.
  4. Scen builder — интерактивный конструктор сцен с возможностью вывода кода.

Подробнее о сценбилдере:

  • Выбор фона, цг или спрайты.
  • Расстановка их по экрану.
  • Музыка, sfx и амбиенс.
  • Вывод в текстовый документ.

Чейнджлог:

  • (06.02.16) 

1. Готовы уроки от лолбота 
2. Готов первый урок. 

  • (09.02.16) 

3.Готов вывод ресурсов 
4.Готов второй урок 
*5.Экраны с ресурсами сделаны более удобными* 

  • (14.02.16) 

6. Добавлен третий урок 

  • (27.02.16) 

7. Альфа версия сцен билдера 

  • (28.02.16) 

8. Небольшие поправки в сцен билдере и списках ресурсов 
!!! Теперь, во избежании ошибки, после просмотра списка музыки, придется перезаходить в мод из меню!!! 

  • (05.03.16) 

9. Готов четвертый урок по питону(вышло честно говоря не очень, но надеюсь будет более-менее понятно) 
10. Часть о тэгах добавлена в конец первого урока. 
11. Просмотр слайдов сделан удобнее. 

  • (09.03.16) 

12.Исправлены вылеты с квадратными скобками, сделан адекватный список звуковых ресурсов! 
13.Добавлен более понятный и глубокий урок по питону(по тому же пункту в меню) 

  • (20.03.16) 

14.!!!Добавлен урок по screen’ам!!!  

15.Ужаты изображения для меньшего веса 

  • (24.03.16) 

16.В сценбилдер добавлена музыка

  • (26.04.16)

17.Добавлен вывод кода в файл

  • (17.09.16) 

18.Добавил пример кастомной карты в конце урока по screen’ам 

Ссылки:

Содержимое архива распаковывать в папку «(путь к игре)/game/»

  • Пк/IOS версия 1.2
  • Немного отсталая Android версия

Скриншоты:

Понравилась статья? Поделить с друзьями:
  • Как написать свой мессенджер на python
  • Как написать свой манифест
  • Как написать свой макрос на мышку
  • Как написать свой майнкрафт на java
  • Как написать свой майнер