# Распостранённые ошибки и пути их решения

Сборник Q&A и статей о частых ошибках. На странице используются сокращения:

  • Q (question) - вопрос
  • A (answer) - ответ

# Конфликты переменных и файлов или «Почему у персонажа вместо имени путь к звуку?»

# Введение

Часто в описаниях модов в мастерской можно увидеть: "Используйте Менеджер Модов (opens new window) для устранения конфликтов." Или ещё лучше: "Удалите все модификации перед загрузкой этой."

А проблема следующая — некоторые переменные проинициализированы по два или более раза (например, два мода используют одну и ту же переменную), из-за чего в конечном итоге их значение отличается от того, на которое рассчитывал автор или кодер мода.

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

# Теория

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

veryLongCharacter "Меня зовут ОченьДлинноеИмяПеременной!"
veryLongCharacter "А как зовут тебя?"
1
2

Для того чтобы в игре говорил ОченьДлинноеИмяПеременной каждый раз нужно прописывать переменную его персонажа - veryLongCharacter, что совсем неудобно делать много раз, именно поэтому они используют короткие имена переменных. Пример:

vas "А меня зовут Василий!"
vas "Но, к сожалению, у меня трёхбуквенное имя переменной, и я могу стать Васей или Василисой!"
1
2

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

Но есть решение! Не самое лёгкое, но...

# Префиксы и рекомендации наименования переменных

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

Допустим, у вас есть переменная для звука выстрела, с названием shot. Так её очень легко перезаписать на другой звук или абсолютно другое значение. А теперь добавим префиксы, и у нас получится переменная с названием rvp_sfx_shot. Из названия сразу понятно к какому моду она принадлежит (rvp - РВП - Рай В Панельке) и её назначение (sfx - Sound Effects - Звуковые Эффекты).

Вместо explosion, которая содержит звук, стоит писать mymod_sfx_explosion

Самые популярные назначения и как их писать:

  • sfx — Звуковые эффекты
  • ambЭмбиент, фоновый шум
  • mus — Музыка
  • img — Изображения (при использовании с BG или CG можно опустить, но тогда желательно чтобы переменная выглядела так: bg имяМода_имяПеременной или cg имяМода_имяПеременной)
  • varОбычная переменная которая хранит какие-либо данные
  • chr — Персонаж (класс Character())
  • spr — Спрайт персонажа (желательно писать в формате имяМода_spr_имяПеременной положение одежда и т.д.)

Если название переменной состоит из нескольких слов, то вместо использования символа подчёркивания как разделителя стоит делать первые буквы слов заглавными. Вместо swch2_var_very_long_variable_name стоит писать swch2_var_veryLongVariableName. Также желательно не использовать транслитерацию, т.е. написание слов из русского или другого языка на английском, а вместо этого переводить и писать всё по-английски. Вместо rvp_img_vidIzOkna стоит писать rvp_img_windowView.

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

  • Лейбл - названиеМода_label_названиеЛейбла
  • Функция - названиеМода_func_названиеФункции

# Хранение переменных в словаре

Переменные также можно хранить в словаре (dict), который сам по себе представляет неупорядоченную коллекцию произвольных объектов с доступом по ключу. Возможно, вы уже использовали этот способ, когда включали музыку из оригинальной игры, ведь она содержится в отдельном словаре music_list. Такой метод хранения переменных имеет свои плюсы и минусы.

# Плюсы

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

# Минусы

  • Не подходит для хранения лейблов, функций, изображений;
  • Для изменения переменной во время игры требуется вносить изменения в словарь, что может повлиять на производительность, если словарь имеет большие размеры;
  • Обычно текстовые редакторы не могут подсказать такие переменные;
  • Для освоения этого метода требуется некоторое время и опыт работы с языком программирования Python.

# Автоинициализация

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

# Плюсы

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

# Минусы

  • Требуются глубокие познания в языке программирования Python;
  • Требуется соблюдать строгую иерархию папок с ресурсами;
  • Возможность огромного количества сбоев, особенно если код автоинициализатора написан начинающим кодером.

# Постфиксы

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

# Конфликты файлов

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

В начале разработки создайте промежуточную папку с названием мода на английском языке (допустим, её имя ray_v_panelke) в корневой папке игры (…\steamapps\common\Everlasting Summer\game\ray_v_panelke) или в отдельно созданной папке (название этой папки может состоять только из цифр, допустим, это 123456) в папке мастерской игры (…\steamapps\workshop\content\331470\123456\ray_v_panelke), в котором будут все файлы мода. Это нужно, чтобы все файлы находясь в одной папке имели наименьший шанс быть перезаписанными.

Таким образом после публикации (правильной, конечно же) и запуска игры все файлы из папки 123456 (или папки с другим id который вам выдаст мастерская) будут перемещены в папку game в корневой папке игры.

Если папка мода находится по такому пути …\steamapps\workshop\content\331470\123456\ray_v_panelke то сама папка и всё её содержимое будет перемещено в папку game …\steamapps\common\Everlasting Summer\game\ray_v_panelke

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

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

# Работа префиксов на практике

# Расставляем префиксы в начале разработки

Если вы ещё не создали мод, всё проще. Пишите префиксы вовремя создания переменных.

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

#BG
#image bg rvp_img_ = "ray_v_panelke/bg/.jpg"
image bg rvp_img_zavod = "ray_v_panelke/bg/zavod.jpg"
image bg rvp_img_tsekh = "ray_v_panelke/bg/tsekh.jpg"
image bg rvp_img_kgb = "ray_v_panelke/bg/kgb.jpg"
1
2
3
4
5

Чтобы дублировать шаблон выделите строку с ним и используйте комбинацию клавиш Ctrl+D.

В большей части текстовых редакторов (Notepad++, VS Code, Atom) если начать писать название переменной в сюжете, то редактор сам подскажет какую переменную вставить или дописать.

# Расставляем префиксы в имеющимся моде

Нужно не только ставить префиксы на все объявленые переменные, но и проходить по коду, заменяя все старые названия на новые.

Советую использовать команду замены (Ctrl+H в Notepad++, Ctrl+F в VS Code).

При замене рекомендуется выделять переменную с пробелами слева и справа, чтобы затем заменить её на переменную с префиксом с пробелами слева и справа. Пробелы нужны, чтобы при замене редактор не выделял сочетания букв, идентичные переменным, в других словах. Например, если есть переменная mh (Михаил) и mh4 (Михалыч).

Пример замены используя этот метод

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

# Дополнительные материалы

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

# Загрузил мод в стим, а он выдаёт Traceback. Мод в папке mods

Q: Я загрузил мод в стим, который до этого редактировался и всячески видоизменялся в папке mods. Загрузил, основной папкой указал mods. После загрузки версии мода из стима и захода в игру выдаёт трейсбек.

A: У вас ошибка в путях к моду при загрузке оного в стим. Если мод и пути файлов для мода проходят через папку mods, то необходимо сделать следующее:

  1. Создать отдельную папку с любым именем. Например, my_mod_folder
  2. Внутри неё создать папку mods и положить туда основную директорию мода. Теперь путь к папке мода таков: my_mod_folder/mods/my_mod/
  3. Снова переходим в загрузчик модов: либо удаляем предыдущую версию мода и создаём заново, либо нажимаем Обновить существующий мод в мастерской.
  4. Основной папкой мода при загрузке указываем my_mod_folder, а не mods или my_mod.
  5. Загружаем мод, перепроверяем версию мода из мастерской.

TIP

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

# Ren'Py не находит изображение/видеофайл/аудиофайл. Пути сто раз перепроверены

Q: Пользуясь ручным объявлением видеофайла/аудиофайла/изображения я столкнулся с проблемой — при показе/воспроизведении файла, Ren'Py выдаёт трейсбек, указывая, что файл не найден. Пути в объявлении проверены.

A: Как бы смешно это не звучало, но советуем ещё раз перепроверить путь. Поискать ошибки в написании расширении файла, а также поискать лже-буквы (скажем, одна буква, написанная кириллицей внутри слова, написанного латиницей). В крайнем случае — проверьте файл на "битость". Если файл оказался "битым", то Ren'Py его "не увидит".

# Не понимаю как загрузить мод из любой директории!

Q: Переместил папку с модификацией на рабочий стол. Поработал над кодом, добавил пару файлов. После загрузки мода в стим и скачки его из мастерской вылетает трейсбек. Указывает на ошибку в путях к файлам.

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

  1. Создать папку с любым именем. Например, my_mod_111.
  2. Внутрь неё переместить папку с вашей модификацией (например, my_mod_root). Путь к файлам вашей модификации будет таков — my_mod_111/my_mod_root/

TIP

Если папка с модификацией лежит на рабочем столе, то путь будет следующим — C:/Users/UserName/Desktop/my_mod_111/my_mod_root/, где:

  • UserName — имя пользователя вашей ОС

  • C: — метка основного диска, на котором лежит ваша ОС. По умолчанию — C:

  1. Открыть загрузчик модов и обновить существующий мод (или загрузить его заново), указав основной папкой мода my_mod_111.
  2. Загрузить мод, проверить на наличие ошибок в версии мода из мастерской.

TIP

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