Logbook: Сказ о маленьком, но очень гордом языке
В силу некоторых обстоятельств (вдавание в которые не принесёт никому никакого толку) так уж вышло, что бэкэнд я сел писать буквально вчера. Нет, намётки и планы на него у меня были достаточно давно; видение игры сформировалось достаточно конкретно неделю тому назад. Согласно этому плану мой «бэкэнд» должен был уметь определять Страницы, их содержимое, условия появления и пространство допустимых действий. Но позвольте я немного отмотаю повествование назад…
Logbook — это игра об историях. Маленьких, склеенных из сценок рассказах. Это игра с Воображалом — таинственным устройством, способным порождать новые фрагменты на страницы. Первая же страница задаёт тон истории, она знакомит нас с Героем каждой отдельно взятой сказки; и рассказывает нам, к чему этот герой стремится, какие цели преследует. Наша же, игрока, задача — помочь герою осуществить задуманное, провести его через череду испытаний. И так выходит, что подобная концепция отчаянно просится быть наложенной на data-driven design.
Первоначально я набросал костяк возможной реализации на основе ScriptableObject (самое время угадать движок, если вы ещё этого не сделали по скриншоту). Вышло грузно, бестолково; задавать взаимоотношения между страницами и условиями их появления, и их воздействиями требовало от меня обсценного количества движений мышкой — словом, печально.
А почему бы не написать свой язык? — почесала репа Тауыча
Попридержите ваши брови от залезания на скальп те из вас, кто ещё хранит зайчатки здравомыслия! На самом деле, Domain-specific language — это не страшно и даже не больно. Каких-то 500 (но это не точно) строк кода позволяют с прытью и борзостью ваять куски истории:
{
ID:
tavern_cockyard
Title:
Петушья Таверна
Description:
В общем, заходит как-то наш герой в таверну, и говорит:
- Кто тут на выдаче?
А орк, что за стойкой, на него кааак зыркнет! Один глаз сверкает, второй в стакане с водкой вращается…
- Ну я, допустим. Надо чё?
Едва ль рот героя был открыт, и вот уже в дверном проёме эльф скрывается — привычным жестом кошель полоснув, монетами героя посверкая
Conditions:
no: tavern_visited
coins >= 3
Options:
attack
magic
coins
// not sure about this one…
thief_talk
Causes:
coins -= 0, 2
tavern_visited = 1
}
JSON! YAML! Да-что-угодно ты возьми и моск не делай, а? Ан нет. У нас тут джем вообще, иль что? Проглоченный бездумством и безумием, я впрягся в это дело, и в общем-то довольства результатом получил. Рассчёт на то, что простота и наглядность BSL (а это название — это уже сооовсем другая история) себя с лихвой окупит в процессе, собственно, сплетания историй. На ожидаемом количестве контента мне предстояло бы 1−3 тыщщи раз перетянуть одно в другое мышкой, и не знаю уж, как вам, а мне такая перспектива кажется без-ра-дост-ной.
Ciao!
- 27 октября 2019, 01:58
- 01
Утка-маляр!