Комментарии 20
Лет 8 назад сам писал движок для текстовых квестов на PHP+MySQL.
Кроме картинки на экран должны были выводиться меню действий и состояние персонажа и содержимое его «рюкзака».
Были для описания состояний введены триггеры (флаги) и счетчики.
Триггеры, это те же счетчики, но принимают только 2 значения: 0 и 1. Служили для описания состояния элементов локаций: открыт ли проход, обезврежена ли ловушка, доступен ли предмет и т.д. На экран не выводились.
Счетчики могли принимать значения от 0 до n и были двух типов: общие (время, здоровье, сила и пр.) и носимые в рюкзаке (всякие ключи, патроны, инструменты, оружие, деньги).
Текст подписей под картинками и доступные (отображаемые) кнопки в меню действий изменялись в зависимости от состояния триггеров и наличия некоторых вещей в рюкзаке. Для этого участки текста снабжались маркерами с условиями отображения. Текст проходил сначала через детерминированный конечный автомат, который разбивал его на безусловные и условные фрагменты. Условия подавались на автомат магазинного типа (они могли быть весьма сложными многоэтажными и конечным автоматом их вычислить нельзя было, только магазинным). В зависимости от истинности условия затем отображался тот или иной фрагмент текста.
Но это, пожалуй, всё, что я могу вспомнить. Движок, конечно, не доделал — охладел. Где-то, может быть, еще валяются куски PHP-скриптов. Но это не точно — за это время несколько раз менял HDD и один раз комп полностью (кроме HDD). И даже если найду, то уже вряд ли сумею в этом разобраться.
Однако каким бы программистом я был, если бы не написал еще один
Я не знал, что есть такая возможность. К тому же, вероятно, не получилось бы сделать его настолько простым, насколько простым получился sl (хотя тут непонятно, плюс это или минус).
Вполне можно сделать, чтобы ваш синтаксис sl был валидным кодом на груви.
В груви конструкция вида aaa{...} может парситься как фунция aaa, в которую передаётся замыкание. Это замыкание можно вызвать в каком-то контексте (например, в том, в котором есть необходимые методы или переменные).
Записи вида funcName "string" — вызов функции с аргументом-строкой.
В качестве примера DSL на груви могу привести gradle файлы.
Единственный минус — в случае с замыканиями ошибка может быть не при их парсинге, а только когда его вызовут. Например, если в контексте не окажется нужного метода. Это усложняет отладку скриптов.
Хотя лично сам я прикипел к Lua и в своём проекте просто встроил (при помощи luaj + встроенной в JDK стандартного механизма в виде javax.script.ScriptEngine) для исполнения на сервере нужной игровой логики, написанной на Lua. Такое решение выбрал для реализации мультиплеерной игры.
import groovy.lang.Binding
import groovy.lang.GroovyShell
//----------------
val shell = GroovyShell()
val binding = Binding()
//----------------
val groovyScript= shell.parse(scriptText)
binding.setVariable(«myObject», this)
groovyScript.binding = binding
groovyScript.run()
и всё, скрипт в работе
Кажется, Хабр все еще торт
класно! обожаю такие штуки! тоже в своё время делал игру на PHP — посылаешь человеку смс и дальше он по городу ходит ищет коды, (которые ты ему предварительно оставляешь), вводит их в игру открывает новые задния — шпионская тема! круто было! такие вещи всегда в кайф спасибо за статью
Несколько вопросов/предложений:
1. Возможно не очень тщательно изучил репозиторий. Как вы собираете бинарники игры? Знакомы ли с build-инструментами в Java (Maven/Gradle)? Не сочтите вопрос за оскорбление, просто интересно.
2. Секция «Как можно было сделать систему диалогов лучше?». Возникла идея внедрить в игру что-то наподобие «Intelli Sense», т.е. например, как в Idea, когда вы пишете код и вводите лишь начальные буквы, а IDE уже выдает вам контекстное меню вариантов, как закончить конструкцию. То же самое можно адаптировать к игре, где проиндексированы все возможные действия игрока, а далее по первым буквам игроку списком выдаются опции, по мере ввода большего числа букв, список сужается, в конце концов до 1-2 вариантов, где игрок мышкой или клавишами выбирает уже понравившуются опцию. Надеюсь, внятно описал идею. Сам такое не пробовал внедрять в свои проекты, но думаю, можно нагуглить в сети решения. Предполагаю, что можно использовать что-то типа Lucene, а возможно уже есть прямо библиотеки реализующие почти всю логику «IntelliSence»-а.
3. Очень любопытно, захотел ли человек, которому предназначалась игра, DLC или хотя бы еще подобных игр такого жанра? Какие вообще были впечатления от истории, художественного исполнения, игровой механики?
4. Те 4-6 часов художественной работы можно было приплюсовать к 45 часам разработки и получилось бы красивое круглое число 50 для названия статьи. :-)
Согласен, просто хотелось сделать клик-бэйтный заголовок, чтобы привлечь больше внимания. Подумал, что чем меньше времени указано — тем больше заинтересованность аудитории
И верно, ваша правда.
Кстати, есть ли планы учавствовать в грядущем Ludum Dare (#46)? Вообще, есть ли опыт участия в гейм джемах? Там как раз лимит времени (и зачастую темы) — одна из ключевых фишек формата.
Извиняюсь за долгий ответ. Запуск: предположим Вы создали папку quests
куда закинули папку с игрой (которая содержит манифест и ресурсы и находится на гитхабе в разделе Releases). Затем вам надо скомпилировать код (проще будет через IDE какую-нибудь) и запустить со следующими параметрами: --quests-dir "quests" --quest "Lone island"
Движок, скриптовый язык и визуальная новелла — за 45 часов