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