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!