Распространённые ошибки и пути их решения
Сборник Q&A и статей о частых ошибках. На странице используются сокращения:
- Q (question) - вопрос
- A (answer) - ответ
Конфликты переменных и файлов или «Почему у персонажа вместо имени путь к звуку?»
Введение
Часто в описаниях модов в мастерской можно увидеть: "Используйте Менеджер Модов для устранения конфликтов." Или ещё лучше: "Удалите все модификации перед загрузкой этой."
А проблема следующая — некоторые переменные проинициализированы по два или более раза (например, два мода используют одну и ту же переменную), из-за чего в конечном итоге их значение отличается от того, на которое рассчитывал автор или кодер мода.
Чтобы такого не было, в названиях переменных нужно иметь правильные префиксы.
Теория
На данный момент в мастерской Бесконечного Лета насчитывается уже более 2200 модов и почти каждый из них как-либо использует переменные. Но, к сожалению, зачастую мододелам неудобно использовать длинное и уникальное имя переменной, особенно когда они используют переменную для передачи свойств какого-либо персонажа, как в примере ниже:
veryLongCharacter "Меня зовут ОченьДлинноеИмяПеременной!"
veryLongCharacter "А как зовут тебя?"
Для того чтобы в игре говорил ОченьДлинноеИмяПеременной, каждый раз нужно прописывать переменную его персонажа - veryLongCharacter, что совсем неудобно делать много раз. Именно поэтому мододелы используют короткие имена переменных. Пример:
vas "А меня зовут Василий!"
vas "Но, к сожалению, у меня трёхбуквенное имя переменной, и я могу стать Васей или Василисой!"
Но количество таких имён ограничено: всего 676 двухбуквенных имён и 17 576 трёхбуквенных. Да, может, это и много, но часто люди не думают о других модах и создают свои переменные, которые в итоге перезаписывают другие переменные или сами становятся перезаписанными. Было дело, вместо имени персонажа был указан путь к одному звуку! К сожалению, мы не сохранили снимок этой аномалии, но это более чем возможно воссоздать, если вместо переменной с персонажем использовать переменную с путём к звуку.
Но есть решение! Не самое лёгкое, но...
Префиксы и рекомендации наименования переменных
Чтобы таких конфликтов не было, перед началом каждой переменной нужно прописывать определённые кодовые слова - префиксы, состоящие из краткого названия мода (или аббревиатуры названия мода) и назначения переменной.
Допустим, у вас есть переменная для звука выстрела, с названием 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"
Чтобы дублировать шаблон, выделите строку с ним и используйте комбинацию клавиш Ctrl+D.
В большей части текстовых редакторов (Notepad++, VS Code, Atom), если начать писать название переменной в сюжете, редактор сам подскажет, какую переменную вставить или дописать.
Расставляем префиксы в имеющемся моде
Нужно не только ставить префиксы на все объявленные переменные, но и проходить по коду, заменяя все старые названия на новые.
Советуем использовать команду замены (Ctrl+H в Notepad++, Ctrl+F в VS Code).
При замене рекомендуется выделять переменную с пробелами слева и справа, чтобы затем заменить её на переменную с префиксом с пробелами слева и справа. Пробелы нужны, чтобы при замене редактор не выделял сочетания букв, идентичные переменным, в других словах. Например, если есть переменные mh (Михаил) и mh4 (Михалыч).
Делайте аккуратно, обязательно проверяйте, чтобы замены проходили правильно.
Дополнительные материалы
Также существуют и программы, позволяющие инициализировать и получить список переменных.
- Автоинициализация переменных
- Автоинициализация персонажей
- Renpy Universal Variable Operator and viewer
- Extended Variable Viewer
Загрузил мод в Steam, а он выдаёт Traceback. Мод в папке mods
Q: Я загрузил в Steam мод, который до этого редактировался и всячески видоизменялся в папке mods. Загрузил, основной папкой указал mods. После загрузки версии мода из Steam и захода в игру выдаёт трейсбек.
A: У вас ошибка в путях к моду при загрузке оного в Steam. Если мод и пути файлов для мода проходят через папку mods, то необходимо сделать следующее:
- Создать отдельную папку с любым именем. Например,
my_mod_folder. - Внутри неё создать папку
modsи положить туда основную директорию мода. Теперь путь к папке мода таков:my_mod_folder/mods/my_mod/. - Снова переходим в загрузчик модов: либо удаляем предыдущую версию мода и создаём заново, либо нажимаем
Обновить существующий мод в мастерской. - Основной папкой мода при загрузке указываем
my_mod_folder, а неmodsилиmy_mod. - Загружаем мод, перепроверяем версию мода из мастерской.
Не забудьте переместить куда-нибудь вашу версию мода, с которой вы ранее работали, ибо, если внутри БЛ будет и основная версия, и версия мода из мастерской, вылетит трейсбек из-за дублирования лейблов и папок.
Ren'Py не находит изображение/видеофайл/аудиофайл. Пути сто раз перепроверены
Q: Пользуясь ручным объявлением видеофайла/аудиофайла/изображения, я столкнулся с проблемой — при показе/воспроизведении файла Ren'Py выдаёт трейсбек, указывая, что файл не найден. Пути в объявлении проверены.
A: Как бы смешно это ни звучало, но советуем ещё раз перепроверить путь. Поискать ошибки в написании названия и расширения файла, а также поискать лже-буквы (скажем, одна буква, написанная кириллицей внутри слова, написанного латиницей). В крайнем случае — проверьте файл на "битость". Если файл оказался "битым", то Ren'Py его "не увидит".
Не понимаю, как загрузить мод из любой директории!
Q: Переместил папку с модификацией на рабочий стол. Поработал над кодом, добавил пару файлов. После загрузки мода в Steam и скачивания его из мастерской вылетает трейсбек. Указывает на ошибку в путях к файлам.
A: Для того чтобы загрузить модификацию из любой директории, вам необходимо проделать следующее:
- Создать папку с любым именем. Например,
my_mod_111. - Внутрь неё переместить папку с вашей модификацией (например,
my_mod_root). Путь к файлам вашей модификации будет таков —my_mod_111/my_mod_root/.
Если папка с модификацией лежит на рабочем столе, то путь будет следующим — C:/Users/UserName/Desktop/my_mod_111/my_mod_root/, где:
UserName— имя пользователя вашей ОСC:— метка основного диска, на котором лежит ваша ОС. По умолчанию —C:
- Открыть загрузчик модов и обновить существующий мод (или загрузить его заново), указав основной папкой мода
my_mod_111. - Загрузить мод, проверить на наличие ошибок в версии мода из мастерской.
Не забудьте переместить куда-нибудь вашу версию мода, с которой вы ранее работали, ибо, если внутри БЛ будет и основная версия, и версия мода из мастерской, вылетит трейсбек из-за дублирования лейблов и папок.