LG.BALUKATION's Weblog

Ничего, это тоже кое-что… А при желании из него можно сделать что угодно

Ачивки стима в играх на движке ренпай

Posted by LG.BALUKATION на 2022/02/09

Недавно AnnTennKa попросила меня рассказать об ачивках в RenPy. Я когда-то помогал ей выпустить игру на этом движке в Steam, в игре есть ачивки и вот похоже кому-то стало интересно как это всё делается.

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

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

Во-первых, нужно настроить сами ачивки в стиме. Для этого вы или ваш издатель должен быть зарегистрирован как разработчик. А так же должна быть зарегистрирована в стиме и ваша игра. Тогда в админке игры можно создавать сами ачивки — прописать им названия, добавить описание, загрузить иконки и тому подобное. С этим не должно быть проблем, если вы уже решили какие ачивки у вас будут в игре.

Подробнее про настройки ачивок в стиме можно почитать в их официальной документации — там даже скриншот этих настроек есть для примера из SteamworksSDK

https://partner.steamgames.com/doc/features/achievements

Во-вторых, нужно раздобыть SDK для работы со стимом. Официальный поддерживает только C/C++. В документации к нему есть ссылки и на сторонние реализации для разных движков и языков, например там можно найти версию для Python — языка, на котором написан RenPy…

Но оказывается RenPy уже умеет работать со Steam! Просто из-за лицензии, автор движка не может распространять открытый движок вместе с проприетарными технологиями стима — но нужную библиотеку можно скачать отдельно. Мы нашли об этом информацию на форуме ренпая, спишитесь с автором движка и он выслал вам нужную библиотеку. В новых версиях вроде даже из какой-то менюхи в движке можно автоматически всё установить — но у нас была старая версия.

В-третьих, нужно создать файл с идентификатором приложения. Это должен быть обычный текстовый файл, называться steam_appid.txt и он должен лежать возле exe-файла игры. Что бы тестировать прямо из редактора, скопируйте его в папку к Renpy.exe и настройте что бы он попадал в билд с игрой именно файлом в папку к exe, а не паковался в архив.

Подробнее про настройку билдов можно почитать в документации к движку

https://www.renpy.org/doc/html/build.html

Если вы всё сделали правильно, то в логе при старте игры будет писаться что-то такое:

Imported steam.
Initialized steam.

Это значит библиотека подключилась к стиму. Например если не будет файла с идентификатором приложения, то надписи поменяются на:

Imported steam.
Failed to initialize steam.

Т. е. не удалось подключится к стиму.

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

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

$ achievement.grant("ачивка")
$ achievement.sync()

Знак долллара потому, что это инструкции на языке Python, а не скриптового языка RenPy — соответственно, если вы хотите выдавать ачивку где-то в блоке кода на питоне, то этот знак не нужен.

achievement.grant() даёт указанную ачивку игроку — т. е. теперь RenPy будет думать, что такая ачивка у игрока есть.

achievement.sync() заливает информацию об ачивках в Steam — т. е. теперь и стим будет думать, что такая ачивка у игрока есть.

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

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

https://www.renpy.org/doc/html/achievement.html

Оставьте комментарий