Скриптовые языки в рогаликах - как это делается? (Lua)

Темы, связанные с проектированием и программированием roguelike-игр

Модераторы: Sanja, Максим Кич

altmax
Сообщения: 173
Зарегистрирован: 15 сен 2012, 11:59

Скриптовые языки в рогаликах - как это делается? (Lua)

Сообщение altmax » 25 фев 2017, 13:44

Интересуют принципы использования скриптовых языков - в частности, Lua.
Есть у меня мой проект на языке С++, есть Lua. И вот интересно, в какое именно место надо встраивать скрипты и каким именно образом?
Т.е. при ударе мною моба вызывается скрипт Lua, в который передается тип, защита, сила и т.п. моба и мои характеристики? И там уже всё это дело рассчитывается по определённым формулам? Этот вопрос более-менее понятен.
Но если этот скрипт должен поменять какие-то переменные в моем проекте - например, убавить HP моба, сделать его испуганным плюс силой удара откинуть от себя на две клетки если там есть место? Вот больше всего интересует это обратное взаимодействие из Луа на классы С++, как это реализуется? Пишутся под это отдельные методы в классе?
Вообще только начал изучать этот самый Луа, и в идеале хотелось бы увидеть пример, как именно реализуется взаимодействие С++ и Lua.
И насколько оправдано использование скриптовых языков в рогаликах - проекты не сильно большие, компилируются быстро, можно всё это дело и на С++ писать. С другой стороны скрипты можно править не выходя из игры. Или нельзя?

altmax
Сообщения: 173
Зарегистрирован: 15 сен 2012, 11:59

Re: Скриптовые языки в рогаликах - как это делается? (Lua)

Сообщение altmax » 26 фев 2017, 09:35

Видимо мало кто с этим сталкивался. Читаю сейчас http://steps3d.narod.ru/tutorials/lua-tutorial.html .
Нашел книгу Роберта Иерузалиски "Программирование на языке Lua", где он в конце книги описывает взаимодействие кода на С и скриптов lua в одну и другую сторону.
Вообще использование скриптов, судя по уже прочитанному, очень актуально для больших и тяжелых проектов, где компиляция может занимать 8-10 часов и более, т.е. после внесения некоторых изменений в игровую логику результат можно будет увидеть только на следующий рабочий день. Ну и если не желаешь выкладывать исходный код, но хочешь, чтобы для твоей замечательной игры было сделано много разных модов игроками.
Плюс еще удобно править баланс - ударил моба, посмотрел результат,поставил игру на паузу, если не походовая, поправил скрипт, ударил моба, прямо сразу увидел результат, как-то так.

Аватара пользователя
Cfyz
Сообщения: 776
Зарегистрирован: 30 ноя 2006, 10:03
Откуда: Санкт-Петербург
Контактная информация:

Re: Скриптовые языки в рогаликах - как это делается? (Lua)

Сообщение Cfyz » 26 фев 2017, 10:28

altmax писал(а):Вот больше всего интересует это обратное взаимодействие из Луа на классы С++, как это реализуется? Пишутся под это отдельные методы в классе?
Думаю можно начать со списка библиотек привязки. Общая идея у всех примерно одна: методами библиотеки описываются-регистрируются прокидываемые в Lua функции и классы С++, специально ради этого делать что-то с кодом на С++ обычно не нужно.
altmax писал(а):Вообще использование скриптов, судя по уже прочитанному, очень актуально для больших и тяжелых проектов, где компиляция может занимать 8-10 часов и более, т.е. после внесения некоторых изменений в игровую логику результат можно будет увидеть только на следующий рабочий день.
Увы, не скажу за roguelike, но вот в кровавом продакшене где даже на рестарт приложения надо спрашировать разрешение заказчика >_< я использовал LuaBridge (кажется уже заброшенный) для вынесения из приложения часто пополняемого/исправляемого кода по управлению IP-камерами по HTTP. Там на 10 моделей камер обычно 12 вариантов протокола с несовместимыми нюансами =(.
Пытается раскуклиться

Аватара пользователя
Apromix
Мастер
Сообщения: 1236
Зарегистрирован: 04 июл 2011, 10:44
Откуда: Украина, Черновцы
Контактная информация:

Re: Скриптовые языки в рогаликах - как это делается? (Lua)

Сообщение Apromix » 26 фев 2017, 11:19

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

Луа очень интерессный язык, простой, но мощный. Хорошо подходит для скриптования. Но я сейчас увлекся go :)

altmax
Сообщения: 173
Зарегистрирован: 15 сен 2012, 11:59

Re: Скриптовые языки в рогаликах - как это делается? (Lua)

Сообщение altmax » 26 фев 2017, 13:42

Cfyz писал(а):
26 фев 2017, 10:28
Увы, не скажу за roguelike, но вот в кровавом продакшене где даже на рестарт приложения надо спрашировать разрешение заказчика >_< я использовал LuaBridge (кажется уже заброшенный) для вынесения из приложения часто пополняемого/исправляемого кода по управлению IP-камерами по HTTP. Там на 10 моделей камер обычно 12 вариантов протокола с несовместимыми нюансами =(.
Нашел на Хабре статью именно по Luabridge, потому пока думаю экспериментировать с ним. А так да - его забросили 4 года назад, новые функции Lua 5.3 он не поддерживает.

altmax
Сообщения: 173
Зарегистрирован: 15 сен 2012, 11:59

Re: Скриптовые языки в рогаликах - как это делается? (Lua)

Сообщение altmax » 26 фев 2017, 15:52

Два часа бился с этим LuaBridge. В итоге вызвать из скрипта функцию С++ и передать в неё значения смог легко, а вот изменить переменную С++ из скрипта так и не смог, вываливается исключение этого самого LuaBridge сразу после объявления getGlobalNamespace (L).addVariable ("perem", &perem);. Но может оно и к лучшему - пусть уже функции С++ контролируют, что там пришло из скрипта и прописывают в нужные структуры данных, тем более изменять конкретную переменную редко требуется, обычно надо изменить поле в массиве структур, которое можно изменить только через метод Get в соответствующем классе.

altmax
Сообщения: 173
Зарегистрирован: 15 сен 2012, 11:59

Re: Скриптовые языки в рогаликах - как это делается? (Lua)

Сообщение altmax » 12 мар 2017, 15:58

Фух, я его победил. Ушло на это чуть более 2 недель. Основная проблема была - как вызвать из lua методы уже существующего экземпляра класса. Вот полно описаний, как вызвать функцию С++ из скрипта и наоборот, вызвать скрипт из С++. Или как из скрипта создать объект класса С++. А вот вызвать методы уже существующего экземпляра класса из скрипта - нашел только одну толковую статью и то на английском языке. Но статья помогла, два часа вдумчивого изучения - там просто много лишнего было - и оказалось, что проблема решается очень просто. Но нигде про это не написано, типа изобретайте сами.

altmax
Сообщения: 173
Зарегистрирован: 15 сен 2012, 11:59

Re: Скриптовые языки в рогаликах - как это делается? (Lua)

Сообщение altmax » 26 июл 2017, 16:21

Теперь впечатления по истечении нескольких месяцев - стоило ли оно того, чтобы разбираться в течение месяца?
Однозначно стоило, весь ИИ сделан на скриптах, а его отладка - очень длительный процесс, когда приходится вручную перебирать массу параметров. Если после каждого изменения параметра перекомпилировать и перезапускать игру - никакого времени не хватит. А тут - открыл скрипт, поправил его, записал - и он уже работает, больше ничего делать не надо. Даже из игры выходить.
Да и все эти огромные if - then - else гораздо лучше смотрятся в отдельных скриптах, а не в движке игры.
Плюс движок остается статичным, а путем написания соответствующих скриптов можно сделать хоть киберпанк, хоть постап, хоть магический рогалик.
Но есть и небольшой минус - сами функции в скриптах не появятся, их все надо забиндить из основного кода игры. У меня так прописано более 200 функций, которые позволяют практически полностью управлять игрой из скриптов. Некоторые даже по два раза с разными названиями - просто забывал, что такие функции уже есть. Потому необходимо еще и подробное описание, прежде всего для самого себя.

Если тема кому-нибудь будет интересна (конкретно - использование скриптов Lua в игре на С++, как всё это сделано с примерами кода) - могу написать подробный мануал. Там просто объем достаточно большой получается, не хотелось бы писать в никуда.

Аватара пользователя
Jesus05
Сообщения: 1840
Зарегистрирован: 02 дек 2009, 07:50
Откуда: Норильск, сейчас Санкт-петербург.
Контактная информация:

Re: Скриптовые языки в рогаликах - как это делается? (Lua)

Сообщение Jesus05 » 27 июл 2017, 06:41

Хотелось бы подробный мануал.
А то даже в сообщении о "я научился вызывать методы экземпляров классов" нет информации как-же это делать.

Аватара пользователя
Харука-тян
Мастер
Сообщения: 544
Зарегистрирован: 29 ноя 2006, 00:23
Контактная информация:

Re: Скриптовые языки в рогаликах - как это делается? (Lua)

Сообщение Харука-тян » 27 июл 2017, 07:45

Jesus05 писал(а):
27 июл 2017, 06:41
Хотелось бы подробный мануал.
А то даже в сообщении о "я научился вызывать методы экземпляров классов" нет информации как-же это делать.
Такой функционал реализован на паскале в движке valkyrie, можно по исходникам дрл или диаблорл посмотреть, как устроено.
"Женщина верит, что дважды два будет пять, если хорошенько поплакать и устроить скандал" (© Дж. Элиот).
ИзображениеИзображение

altmax
Сообщения: 173
Зарегистрирован: 15 сен 2012, 11:59

Re: Скриптовые языки в рогаликах - как это делается? (Lua)

Сообщение altmax » 27 июл 2017, 08:41

Jesus05 писал(а):
27 июл 2017, 06:41
Хотелось бы подробный мануал.
А то даже в сообщении о "я научился вызывать методы экземпляров классов" нет информации как-же это делать.
Ок, напишу мануал, просто думал что это не интересно.

Roman
Сообщения: 1
Зарегистрирован: 11 апр 2018, 10:36

Re: Скриптовые языки в рогаликах - как это делается? (Lua)

Сообщение Roman » 11 апр 2018, 10:47

altmax писал(а):
27 июл 2017, 08:41
Jesus05 писал(а):
27 июл 2017, 06:41
Хотелось бы подробный мануал.
А то даже в сообщении о "я научился вызывать методы экземпляров классов" нет информации как-же это делать.
Ок, напишу мануал, просто думал что это не интересно.
ГДЕ МАНУАЛ!??! Я не хочу изучать это всё с нуля)

Аватара пользователя
Jesus05
Сообщения: 1840
Зарегистрирован: 02 дек 2009, 07:50
Откуда: Норильск, сейчас Санкт-петербург.
Контактная информация:

Re: Скриптовые языки в рогаликах - как это делается? (Lua)

Сообщение Jesus05 » 11 апр 2018, 11:18

Roman писал(а):
11 апр 2018, 10:47
altmax писал(а):
27 июл 2017, 08:41
Jesus05 писал(а):
27 июл 2017, 06:41
Хотелось бы подробный мануал.
А то даже в сообщении о "я научился вызывать методы экземпляров классов" нет информации как-же это делать.
Ок, напишу мануал, просто думал что это не интересно.
ГДЕ МАНУАЛ!??! Я не хочу изучать это всё с нуля)
Еще ж 2 года не прошло :)

Bioworm
Сообщения: 89
Зарегистрирован: 01 фев 2007, 03:33

Re: Скриптовые языки в рогаликах - как это делается? (Lua)

Сообщение Bioworm » 13 апр 2018, 23:21

Roman писал(а):
11 апр 2018, 10:47
ГДЕ МАНУАЛ!??! Я не хочу изучать это всё с нуля)
А есть ли смысл? Я не согласен с мыслью, что рогалик должен быть разбит на две части, движок и скрипты. Если не планировать графику, то единой кодобазы (и, соответственно, одного языка программирования) вполне хватит, с графикой немного сложнее, какой-нибудь Forth имеет очень мало графических библиотек, но вот конкретно Lua - какие там проблемы? Есть специальные графические движки для Lua, заточенные под игры, зачем там С++?

altmax
Сообщения: 173
Зарегистрирован: 15 сен 2012, 11:59

Re: Скриптовые языки в рогаликах - как это делается? (Lua)

Сообщение altmax » 14 апр 2018, 19:38

Bioworm писал(а):
13 апр 2018, 23:21

А есть ли смысл? Я не согласен с мыслью, что рогалик должен быть разбит на две части, движок и скрипты. Если не планировать графику, то единой кодобазы (и, соответственно, одного языка программирования) вполне хватит, с графикой немного сложнее, какой-нибудь Forth имеет очень мало графических библиотек, но вот конкретно Lua - какие там проблемы? Есть специальные графические движки для Lua, заточенные под игры, зачем там С++?
На самом деле смысл есть - разрабатывать так рогалик гораздо проще. Любые правки можно вносить так сказать онлайн, и они сразу действуют, даже перезапускать не надо рогалик. Или надо, зависит от реализации биндинга. Но по крайней мере не надо перекомпилировать весь код. а когда отлаживаешь ИИ - там бывает вносишь сотни правок, пока не начнёт работать как надо.
Или если есть развитая система крафта или заклинаний, эффективность которых зависит от многих факторов - всё это проще держать в скриптах lua. Ну и если цель создать конкретный рогалик, который потом будет практически неизменен - можно и без скриптов обойтись. А если проектируешь расширенный движок, на базе которого потом можно создавать рогалики в различных сеттингах - хоть средневековая магия, хоть киберпанк - то тут уже тоже лучше подключить скрипты.
А на С++ делаются те части движка, которые сильно нагружают процессор. Например, генерация уровня - часто даже на современных процессорах время часто измеряется секундами. Или класс, в котором хранятся все существующие на уровнях предметы - тоже получается очень объемным, и время поиска нужного объекта занимает достаточно много времени. Ну и в основном конечно С++ применяется из-за своей объектноориентированности. Благодаря наличию классов и наследованию некоторые вещи делаются гораздо проще, чем без них.
Jesus05 писал(а):
11 апр 2018, 11:18

Еще ж 2 года не прошло :)
Постараюсь уложиться в 1 год. :) Раз кого-то заинтересовало, таки придется написать мануал.

Ответить

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость